STM32
直播中

偶是糕富帅

13年用户 787经验值
私信 关注
[问答]

标准库上电之后串口会发送一个错误字节导致后续发送乱码怎么解决?

标准库上电之后串口会发送一个错误字节导致后续发送乱码怎么解决?

回帖(1)

张秀珍

2021-12-13 13:58:30
  问题详述:

  
   在练习过程之中我发现,当我初始化串口之后,单片机会发送一个0xFF给串口端,这将导致上电之后发送的第一条语句为乱码。这不是我所想要看到的情况。
  
  问题解决:

  
   多次实验后发现,这是由于我先初始化串口之后才映射其引脚,我猜想可能是映射引脚时候误发送了。于是我将引脚映射的步骤改到初始化对应引脚之后进行。上电实验,问题得到解决。
  
  代码:

  以下贴出源码

#include "usart.h"


void USART_init(uint32_t bound)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
       
        /*初始化USART1引脚*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        USART_ClearFlag(USART1, USART_FLAG_TC);
        /*初始化结束*/
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);//串口1对应引脚复用映射,GPIOA9复用为USART1
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);//串口1对应引脚复用映射,GPIOA10复用为USART1
        //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);                                //根据指定的参数初始化VIC寄存器
       
    USART_InitStructure.USART_BaudRate = bound;//串口波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        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); //初始化串口1
       
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接收中断
    USART_Cmd(USART1, ENABLE);                    //使能串口1
       
}
以下贴出头文件
#ifndef _USART_H
#define _USART_H


#include "stm32f4xx.h"


void USART_init(uint32_t bound);


#endif
举报

更多回帖

发帖
×
20
完善资料,
赚取积分