现在的位置: 首页 > 综合 > 正文

调试STM32 串口时的 诡异现象

2018年03月16日 ⁄ 综合 ⁄ 共 1551字 ⁄ 字号 评论关闭

 最近在调试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的初始化来的,不知道是不是哪里还有没有修改到的,有经验的大侠,指点一下小菜鸟吧

下面是串口调试助手显示乱码的情况:

下面是我串口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);//
//²¨ÌØÂÊÉèÖÃ
  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
}

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

抱歉!评论已关闭.