在usart.c文件中有如下代码

    1. void USART_Config(void)
    2. {
    3. GPIO_InitTypeDef GPIO_InitStructure;
    4. USART_InitTypeDef USART_InitStructure;
    5. // 打开串口GPIO的时钟
    6. DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
    7. // 打开串口外设的时钟
    8. DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
    9. // 将USART Tx的GPIO配置为推挽复用模式
    10. GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
    11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    13. GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
    14. // 将USART Rx的GPIO配置为浮空输入模式
    15. GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    17. GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
    18. // 配置串口的工作参数
    19. // 配置波特率
    20. USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
    21. // 配置 针数据字长
    22. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    23. // 配置停止位
    24. USART_InitStructure.USART_StopBits = USART_StopBits_1;
    25. // 配置校验位
    26. USART_InitStructure.USART_Parity = USART_Parity_No ;
    27. // 配置硬件流控制
    28. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    29. // 配置工作模式,收发一起
    30. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    31. // 完成串口的初始化配置
    32. USART_Init(DEBUG_USARTx, &USART_InitStructure);
    33. // 串口中断优先级配置
    34. NVIC_Configuration();
    35. // 使能串口接收中断
    36. USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
    37. // 使能串口
    38. USART_Cmd(DEBUG_USARTx, ENABLE);
    39. // 清除发送完成标志
    40. //USART_ClearFlag(USART1, USART_FLAG_TC);
    41. }

    收发数据有两种方法,一种是用中断来收发,另外一种是通过重定向printf和scanf函数来实现。
    重定向函数如下:

    1. int fputc(int ch, FILE *f)
    2. {
    3. /* 发送一个字节数据到串口 */
    4. USART_SendData(DEBUG_USARTx, (uint8_t) ch);
    5. /* 等待发送完毕 */
    6. while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
    7. return (ch);
    8. }
    9. ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
    10. int fgetc(FILE *f)
    11. {
    12. /* 等待串口输入数据 */
    13. while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
    14. return (int)USART_ReceiveData(DEBUG_USARTx);
    15. }

    或者使用如下函数来向上位机发送数据

    1. /***************** 发送一个字符 **********************/
    2. void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
    3. {
    4. /* 发送一个字节数据到USART */
    5. USART_SendData(pUSARTx,ch);
    6. /* 等待发送数据寄存器为空 */
    7. while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
    8. }
    9. /***************** 发送字符串 **********************/
    10. void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
    11. {
    12. unsigned int k=0;
    13. do
    14. {
    15. Usart_SendByte( pUSARTx, *(str + k) );
    16. k++;
    17. } while(*(str + k)!='\0');
    18. /* 等待发送完成 */
    19. while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
    20. {}
    21. }
    22. /***************** 发送一个16位数 **********************/
    23. void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
    24. {
    25. uint8_t temp_h, temp_l;
    26. /* 取出高八位 */
    27. temp_h = (ch&0XFF00)>>8;
    28. /* 取出低八位 */
    29. temp_l = ch&0XFF;
    30. /* 发送高八位 */
    31. USART_SendData(pUSARTx,temp_h);
    32. while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
    33. /* 发送低八位 */
    34. USART_SendData(pUSARTx,temp_l);
    35. while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
    36. }

    屏幕截图 2021-10-05 224010.png