打印
[其他ST产品]

STM32 USART出现乱码

[复制链接]
578|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
USART使用串口助手调试时出现乱码的情况,一般都是波特率的问题,例如:向串口发送“hello world\r\n”,但是串口助手收到的数据却是这样:



使用特权

评论回复
沙发
过期的塔头|  楼主 | 2022-1-27 21:56 | 只看该作者
于是我仔细检查代码中设置的波特率的大小,发现没错,也是设置为115200,但是串口助手上显示的还是乱码。我再仔细检查与USART相关的代码,包括UASRT初始化、中断、以及发送数据的类型。。。,很绝望,还是没有找出这个BUG!

使用特权

评论回复
板凳
过期的塔头|  楼主 | 2022-1-27 22:00 | 只看该作者
以下是我的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);
   }
}

使用特权

评论回复
地板
过期的塔头|  楼主 | 2022-1-27 22:04 | 只看该作者
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);
    }
}

使用特权

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

使用特权

评论回复
6
过期的塔头|  楼主 | 2022-1-27 22:14 | 只看该作者
打开工程里面的stm32f4xx.h文件,找到下图位置:

使用特权

评论回复
7
过期的塔头|  楼主 | 2022-1-27 22:19 | 只看该作者
把其中的HSE_VALUE改为开发板实际的值即可

使用特权

评论回复
8
过期的塔头|  楼主 | 2022-1-27 22:21 | 只看该作者
修改好重新编译下载到开发板中运行,此时串口助手能正常显示接收的数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

946

帖子

0

粉丝