[其他ST产品] STM32 USART出现乱码

[复制链接]
1062|7
 楼主| 过期的塔头 发表于 2022-1-27 18:01 | 显示全部楼层 |阅读模式
USART使用串口助手调试时出现乱码的情况,一般都是波特率的问题,例如:向串口发送“hello world\r\n”,但是串口助手收到的数据却是这样:


5486261f26d7b01e56.png
 楼主| 过期的塔头 发表于 2022-1-27 21:56 | 显示全部楼层
于是我仔细检查代码中设置的波特率的大小,发现没错,也是设置为115200,但是串口助手上显示的还是乱码。我再仔细检查与USART相关的代码,包括UASRT初始化、中断、以及发送数据的类型。。。,很绝望,还是没有找出这个BUG!
 楼主| 过期的塔头 发表于 2022-1-27 22:00 | 显示全部楼层
以下是我的UASRT相关设置代码:
  1. void Uart1_Init(void)
  2. {
  3.     //GPIO端口设置
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.     USART_InitTypeDef USART_InitStructure;
  6.     NVIC_InitTypeDef NVIC_InitStructure;

  7.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);        //使能GPIOA的时钟
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);       //使能USART1时钟

  9.     //USART1对应引脚的复用
  10.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);     
  11.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);   

  12.     //USART1端口配置
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;               
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  16.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                  
  17.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                        
  18.     GPIO_Init(GPIOA,&GPIO_InitStructure);                              

  19.     //USART1 初始化
  20.     USART_InitStructure.USART_BaudRate      = 115200;
  21.     USART_InitStructure.USART_WordLength    = USART_WordLength_8b;
  22.     USART_InitStructure.USART_StopBits      = USART_StopBits_1;
  23.     USART_InitStructure.USART_Parity        = USART_Parity_No;
  24.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  25.     USART_InitStructure.USART_Mode          = USART_Mode_Rx | USART_Mode_Tx;   
  26.     USART_Init(USART1, &USART_InitStructure);

  27.     USART_Cmd(USART1, ENABLE);  //使能USART1

  28.     //开中断
  29.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  

  30.     //Usart1 NVIC 配置
  31.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;      
  32.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
  33.     NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   
  34.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         
  35.     NVIC_Init(&NVIC_InitStructure);                     
  36. }

  37. void USART1_IRQHandler(void)
  38. {
  39.     uint16_t Usart_Data;
  40.    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  41.    {     
  42.      USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  43.      Usart_Data = USART_ReceiveData(USART1);   
  44.      USART_SendData(USART1, Usart_Data);
  45.    }
  46. }
 楼主| 过期的塔头 发表于 2022-1-27 22:04 | 显示全部楼层
main函数

  1. int main(void)
  2. {
  3.     int i, len;
  4.     char buffer[20] = {"hello world\r\n"};
  5.     len = strlen(buffer);
  6.     NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);
  7.     Systick_Init();
  8.     Uart1_Init();
  9.     while(1)
  10.     {
  11.         for(i=0; i<len; i++)
  12.         {
  13.             USART_SendData(USART1, (uint16_t)buffer[i]);
  14.             while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
  15.         }
  16.         delay_s(1);
  17.     }
  18. }
 楼主| 过期的塔头 发表于 2022-1-27 22:07 | 显示全部楼层
。。。找了半天终于把问题找出来了,原来还是波特率的问题。虽然设置USART1时的波特率没错,但是系统的HSE_VALUE(高速外部时钟的值)与开发板实际的值不符,导致开发板串口的波特率与串口助手设置的不一致,这就是出现乱码的原因!USART1是挂载在AHB1,所以HSE_VALUE对UASRT1的波特率有影响。本人使用开发板的HSE为8MHz,而工程中默认为25MHz,故把它改过来即可。
 楼主| 过期的塔头 发表于 2022-1-27 22:14 | 显示全部楼层
打开工程里面的stm32f4xx.h文件,找到下图位置:

6563361f2a8d90122f.png
 楼主| 过期的塔头 发表于 2022-1-27 22:19 | 显示全部楼层
把其中的HSE_VALUE改为开发板实际的值即可

809761f2a9e731d90.png
 楼主| 过期的塔头 发表于 2022-1-27 22:21 | 显示全部楼层
修改好重新编译下载到开发板中运行,此时串口助手能正常显示接收的数据。

2953061f2aa607f4bc.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

999

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部