软硬件集成|调试STM32 串口时的 诡异现象

最近在调试STM32F103VCT6的程序 ,先调串口,程序是从正点原子的例程修改过来的,写了一个串口1的程序, STM32中的程序是串口1中断接受一个字节,再把该字节经串口1发送出去,再延时一秒,在发送一个含八个字节数据的固定数组,程序可以说很小白,调试时,单片机可以回复串口调试助手一个它收到的字节,再发送一个含八个字节数据的固定数组,但在其后还自动多发了三个字节的数据,该三个字节的数据比较固定, 但单片机掉电复位一下, 这三个多出来的字节跟之前的不一样,但也比较固定。


这个先放一放,我现在确定串口1是能正常收发数据的, 现在调试串口2,把之前的对串口一的配置,基本都对串口2做了相应的修改,STM32中的程序是串口2中断接受一个字节,再把该字节经串口2发送出去,再延时一秒,再发送一个含八个字节数据的固定数组,问题来了,我的STM32最小系统板是通过USB转TTL的一个模块之间连上笔记本的USB的,这个模块是我自己在网上下载的原理图,画PCB,打板,网上很多这种资料,就参考网上的资料,就这样焊接的,之前调试和烧程序都是用的的它,感觉使用起来还顺手我现在调串口2时,程序能烧进去,但USB转TTL就感觉跟发送接收两个脚短接了一样,一直是自收自发的状态,接在最小系统的串口2的TX和RX脚也是自发自收,而且我用手拿起来从USB转TTL模块的发送和接收脚引出来的两根杜邦线时,串口调试助手就一直不停的接收乱码,实在很是费解,


考虑,怀疑,我猜原因可能有以下几点:供大家讨论
1,我的程序还有那个地方不对?
2,STM32的硬件最小系统板设计还有什么地方不合理?
3,最近冬天,办公室很干燥,静电经常噼噼啪啪的,会不会把STM32的硬件最小系统板或USB转TTL的模块哪里给打坏了?
4,USB转TTL的模块抗干扰能力比较低?




串口2的初始化我模访串口1的初始化来的,不知道是不是哪里还有没有修改到的,有经验的大侠,指点一下小菜鸟吧
下面是串口调试助手显示乱码的情况:
软硬件集成|调试STM32 串口时的 诡异现象
文章图片


下面是我串口2的初始化设置:
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
//temp=(float)(pclk2*1000000)/(bound*16); //
temp=(float)(pclk2*1000000)/(bound); //
mantissa=temp; //
fraction=(temp-mantissa)*16; //
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //
RCC->APB1ENR|=1<<17; //

GPIOA->CRL&=0XFFFF00FF;
GPIOA->CRL|=0X00008B00; //

RCC->APB1RSTR|=1<<17; //
RCC->APB1RSTR&=~(1<<17); //
//2¨ì??êéè??
USART2->BRR=mantissa; //
USART2->CR1|=0X200C; //
#ifdef EN_USART1_RX//
//
USART2->CR1|=1<<8; //
USART2->CR1|=1<<5; //
MY_NVIC_Init(3,3,USART2_IRQChannel,2); //
#endif
}

【软硬件集成|调试STM32 串口时的 诡异现象】今天又重新改了一个例程,之前用的例程用的是原子的寄存器版的例程, 现在换成库函数版,就可以, USART1和USART2都可以正常收发,数据模自动添加的0A 0D也解决掉了, 原来是我在引用的程序里有加了给发送的数据末尾加一个0D,这个没有删掉,OD是回车键 。发送时输入数据后加了一个换行,0A是换行键,太不小心了~

    推荐阅读