学前班
最后登录1970-1-1
在线时间 小时
注册时间2019-1-28
|
在学习USART过程中,32可以使用编写的函数给电脑发字节和半字,但是用printf函数后,程序可以编译可以烧录,但电脑不能显示字符串。
已经在外设驱动头文件中包含stdio.h,也已经在外设驱动c文件中添加重定向c库函数。下面是main.c和bsp_usart.c的代码:
main.c
- #include "stm32f10x.h"
- #include "./led/bsp_led.h"
- #include "./usart/bsp_usart.h"
- void delay(uint32_t count)
- {
-
- for(;count!=0;count--);
-
- }
- int main(void)
- {
- LED_GPIO_Config();
- USART_Config();
- //Usart_SendString(DEBUG_USARTx ,"asfas\n");
- printf("sddscdc");
- while(1)
- {
- GPIO_SetBits(G_LED_GPIO_PORT,G_LED_GPIO_PIN);
- GPIO_ResetBits(B_LED_GPIO_PORT,B_LED_GPIO_PIN);
- GPIO_SetBits(R_LED_GPIO_PORT,R_LED_GPIO_PIN);
- delay(0xffffff);
-
- GPIO_ResetBits(G_LED_GPIO_PORT,G_LED_GPIO_PIN);
- GPIO_SetBits(B_LED_GPIO_PORT,B_LED_GPIO_PIN);
- GPIO_SetBits(R_LED_GPIO_PORT,R_LED_GPIO_PIN);
- delay(0xffffff);
-
- GPIO_SetBits(G_LED_GPIO_PORT,G_LED_GPIO_PIN);
- GPIO_SetBits(B_LED_GPIO_PORT,B_LED_GPIO_PIN);
- GPIO_ResetBits(R_LED_GPIO_PORT,R_LED_GPIO_PIN);
- delay(0xffffff);
- }
- }
复制代码
bsp_usart.c
- #include "./usart/bsp_usart.h"
- /**
- * [url=home.php?mod=space&uid=41770]@brief[/url] 配置嵌套向量中断控制器NVIC
- * @param 无
- * @retval 无
- */
- //static void NVIC_Configuration(void)
- //{
- // NVIC_InitTypeDef NVIC_InitStructure;
- //
- // /* 嵌套向量中断控制器组选择 */
- // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- //
- // /* 配置USART为中断源 */
- // NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
- // /* 抢断优先级*/
- // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- // /* 子优先级 */
- // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- // /* 使能中断 */
- // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- // /* 初始化配置NVIC */
- // NVIC_Init(&NVIC_InitStructure);
- //}
- void USART_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- // 打开串口GPIO的时钟
- DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
-
- // 打开串口外设的时钟
- DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
- // 将USART Tx的GPIO配置为推挽复用模式
- GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
- // 将USART Rx的GPIO配置为浮空输入模式
- GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
-
- // 配置串口的工作参数
- // 配置波特率
- USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
- // 配置 针数据字长
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- // 配置停止位
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- // 配置校验位
- USART_InitStructure.USART_Parity = USART_Parity_No ;
- // 配置硬件流控制
- USART_InitStructure.USART_HardwareFlowControl =
- USART_HardwareFlowControl_None;
- // 配置工作模式,收发一起
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- // 完成串口的初始化配置
- USART_Init(DEBUG_USARTx, &USART_InitStructure);
-
- // 串口中断优先级配置
- // NVIC_Configuration();
-
- // 使能串口接收中断
- // USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
-
- // 使能串口
- USART_Cmd(DEBUG_USARTx, ENABLE);
- }
- void Usart_SendByte(USART_TypeDef* USARTx,uint8_t data)//发送字节
- {
- USART_SendData(USARTx, data);
- while( (USART_GetFlagStatus( USARTx,USART_FLAG_TXE))==RESET );
- }
- void Usart_HalfWord(USART_TypeDef* USARTx,uint16_t data)//发送半字
- {
- uint8_t data_H,data_L;
- data_L=((data)&0xff);
- data_H=(data&0xff00)>>8;
- Usart_SendByte(USARTx, data_H);
- Usart_SendByte(USARTx, data_L);
- }
- void Usart_SendArry(USART_TypeDef* USARTx,uint8_t *arry,uint8_t size)//发送数组
- {
- uint8_t i;
- for(i=0;i<size;i++)
- {
- Usart_SendByte(USARTx, *arry++);
-
- }
- while( (USART_GetFlagStatus( USARTx,USART_FLAG_TC))==RESET );
-
- }
- void Usart_SendString(USART_TypeDef* USARTx,char *string)//发送字符串
- {
- while(*string!='\0')
- {
- Usart_SendByte(USARTx, *string++);
-
- }
- while( (USART_GetFlagStatus( USARTx,USART_FLAG_TC))==RESET );
-
- }
- ///重定向c库函数printf到串口,重定向后可使用printf函数
- int fputc(int ch, FILE *f)
- {
- /* 发送一个字节数据到串口 */
- USART_SendData(DEBUG_USARTx, (uint8_t) ch);
-
- /* 等待发送完毕 */
- while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
-
- return (ch);
- }
- ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
- int fgetc(FILE *f)
- {
- /* 等待串口输入数据 */
- while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
- return (int)USART_ReceiveData(DEBUG_USARTx);
- }
复制代码
请大家帮我看看^_^。
|
|