STM32 USART出现乱码

来源:互联网 发布:mst软件与sap2000 编辑:程序博客网 时间:2024/05/16 07:55

USART使用串口助手调试时出现乱码的情况,一般都是波特率的问题,例如:向串口发送“hello world\r\n”,但是串口助手收到的数据却是这样:
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文件,找到下图位置:
1

把其中的HSE_VALUE改为开发板实际的值即可
2

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

希望对你有所帮助!

原创粉丝点击