×
单片机 > 单片机程序设计 > 详情

STM32 串口初始化时的BUG

发布时间:2020-08-21 发布时间:
|

单片机:stm32f103vet6

平台:野火STM32开发板

问题描述:串口在初始化(还未发送任何数据)的时候,PC端会接收到一个字节的乱码

状态:未解决

我调试串口的步骤一般是先初始化UART,然后printf重定向,最后在串口助手里面打印出一些数字。调试还算顺利,成功打印出一行数据。但是每次复位的时候,第一个字符之前都有会多出一个乱码,起初以为是TC置1的问题,改了好几遍都没有效果,后来想一想,TC置1的问题是发送的第一个字符丢失,现在的问题是,第一个字符不丢失,而是第一个字符前出现一个乱码。

串口助手设置十六进制显示,发现在最开始的时候会打印一个字符0xFE。

单步调试发现在串口初始化前的GPIO初始化USART1的TXD——PA9的时候,出现0x00,全速运行时发送0xFE,后来想到,会不会是GPIO在复位的时候出现一个低电平脉冲被PC识别成一个字符。但是发现GPIO在复位后默认是模拟输入状态,ODR寄存器复位后为0,于是用GPIO_SetBits函数将PA9先拉高,再初始化PA9为GPIO_Mode_AF_PP,问题仍然存在。

问题仍然存在,待解决。

附代码:

#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"
#include


void LED_portConfig(void)
{
GPIO_InitTypeDef temp;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
temp.GPIO_Mode = GPIO_Mode_Out_PP;
temp.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
temp.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&temp);
}


void uart_init(unsigned long baud)
{
USART_InitTypeDef temp;
GPIO_InitTypeDef gpio_initStruct;
/*gpio config*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);


GPIO_SetBits(GPIOA,GPIO_Pin_9);//À­¸ßPA9
gpio_initStruct.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_initStruct.GPIO_Pin = GPIO_Pin_9;
gpio_initStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio_initStruct);//ÂÒÂë·¢ËÍλÖÃ
gpio_initStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio_initStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA,&gpio_initStruct);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_StructInit(&temp);
temp.USART_BaudRate = baud;
USART_Init(USART1,&temp);
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_ClearFlag(USART1,USART_FLAG_TXE);
USART_Cmd(USART1,ENABLE);
}


int fputc(int ch, FILE *f)
{
USART_SendData(USART1,(unsigned char) ch);
while((USART1->SR & USART_FLAG_TC) == 0);
return ch;
}


void uart_sendstring(char *str)
{
while(*str)
{
USART_SendData(USART1,*str++);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
}
}


void delay(unsigned long t)
{
unsigned long i,j;
for(i=0; ifor(j=0; j<1000; j++);
}


int main(void)
{
unsigned int k=0x12345678;
LED_portConfig();
uart_init(115200);//出现乱码的位置
printf("Hello world\n\r");
printf("k = 0x%04x\n\r",k);
while(1)
{
printf("k = 0x%04x\r",k++);
GPIO_SetBits(GPIOC,GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
delay(500);
GPIO_ResetBits(GPIOC,GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
delay(500);
}
}


关键字:STM32  串口初始化  BUG

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项