欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32 USART出现乱码

程序员文章站 2024-02-22 11:55:04
...

USART使用串口助手调试时出现乱码的情况,一般都是波特率的问题,例如:向串口发送“hello world\r\n”,但是串口助手收到的数据却是这样:
STM32 USART出现乱码

于是我仔细检查代码中设置的波特率的大小,发现没错,也是设置为115200,但是串口助手上显示的还是乱码。我再仔细检查与USART相关的代码,包括UASRT初始化、中断、以及发送数据的类型。。。,很绝望,还是没有找出这个BUG!
以下是我的UASRT相关设置代码:

void Uart1_Init(void)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

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

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

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

    //USART1 初始化
    USART_InitStructure.USART_BaudRate      = 115200;
    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(USART1, &USART_InitStructure); 

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

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

    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;       
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         
    NVIC_Init(&NVIC_InitStructure);                     
}

void USART1_IRQHandler(void)
{
    uint16_t Usart_Data;
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
   {     
     USART_ClearITPendingBit(USART1,USART_IT_RXNE);
     Usart_Data = USART_ReceiveData(USART1);    
     USART_SendData(USART1, Usart_Data);
   }
}

main函数

int main(void)
{
    int i, len;
    char buffer[20] = {"hello world\r\n"};
    len = strlen(buffer);
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);
    Systick_Init();
    Uart1_Init();
    while(1)
    {
        for(i=0; i<len; i++)
        {
            USART_SendData(USART1, (uint16_t)buffer[i]);
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
        }
        delay_s(1);
    }
}

。。。找了半天终于把问题找出来了,原来还是波特率的问题。虽然设置USART1时的波特率没错,但是系统的HSE_VALUE(高速外部时钟的值)与开发板实际的值不符,导致开发板串口的波特率与串口助手设置的不一致,这就是出现乱码的原因!USART1是挂载在AHB1,所以HSE_VALUE对UASRT1的波特率有影响。本人使用开发板的HSE为8MHz,而工程中默认为25MHz,故把它改过来即可。

打开工程里面的stm32f4xx.h文件,找到下图位置:
STM32 USART出现乱码

把其中的HSE_VALUE改为开发板实际的值即可
STM32 USART出现乱码

修改好重新编译下载到开发板中运行,此时串口助手能正常显示接收的数据。
STM32 USART出现乱码

希望对你有所帮助!