使用开发板的usart作为uart通信,在前调用bsp_init()函数初始化开发板,串口上传输的数据出错:‘a’变成0xfa或0xfe;
【在这个问题解决之后,回头总结下,在解决问题时:
1.预计有可能造成出错的原因(这个可能需要一些经验,但是思维方式需要这样的猜测,从系统内外,可以先罗列出尽可能有的原因,后面再一一排除)
2.尽可能的定位出错的地方(比如这里通过在线调试,确定在修改时钟后,可以解决数据发送的不正确)
3.推测并排除次因,找出主因,往深一步探测 】
1:猜测原因。
外因:串口接收的过程受干扰
内因:a.端口设置有问题 b.usart的波特率设置有问题
2:定位错误
在刚开始时通过屏蔽bsp_init()发现功能正常,再具体定位到bsp_init()里面的sysclk_frequency时钟设置,发现例程中默认的是72m,但是改为36m,就没有问题,应该是时钟方面的设置问题,具体的问题做何解析?
3:推测排除,深究
外因内因很好排除,数据既然在波特率低时能正常通信,可能不是端口设置的问题,应该是波特率的问题,常看用户手册该节的资料:
注:
1.cpu 的时钟频率越低,则某一特定波特率的误差也越低。可以达到的波特率上限可以由这组数据得到。
2.只有usart1 使用pclk2(最高72mhz)。其它usart使用pclk1(最高36mhz)。
usart的波特率的计算公式:
usartdiv是一个无符号的定点数。这12位的值设置在usart_brr寄存器。那么usartdiv与usart_brr的关系又是怎么样的?
加入usartdiv=27.75;那么usart_brr=0x1b(27)+0xc(0.75*16)=0x1bc;同理可以从usart_brr推出usartdiv的值;
假设fck=36000000;tx=115200;=》usartdiv=19.53125;所以0x13+(0.53125*16=8.5)=》0x13+0x9=0x139;所以实际上是0x139产生的波特率:115015.97(误差率为0.15%);
===》理论最大波特率:36000000/(16*1.0)=2.25m(usartdiv最小为1.0)
继续往下查,对于sysclk_frequency最高72m,运行应该没有问题,但是目前有问题;顺藤摸瓜,查看各个时钟控制器,发现时钟设置路径:hse--》prediv2--》pll2--》prediv1--》pll--》sysclk;
发现其中有问题:hse(25m),prediv2(源代码设置是2分频),pll2(8倍频),prediv1(9倍频),sysclk是算不出72m的,这时72m的算法其实已经超过72m,所以给usart2时,波特率计算时会出现问题;将prediv2(改为5分频就对了);
这就是为什么调用bsp_init()或者systeminit会出问题,他们都调用setsysclock(),再调用setsysclockto72()【宏定义72m】,同时将系统时钟改为36m时不会出问题,因为此时调用的不是出问题的setsysclockto72(),而在之前用的是出错的setsysclockto72()却没有发现问题,是因为系统时钟虽没有在预设值,但是系统还足以正常工作,但是一旦添加串口,波特率设置就会有很大的偏差,数据传输就出错。
1:参考代码其实里面是有很多问题的
2:我们应该尽可能的多阅读参考代码,利用其中的资源,避免重复造轮子。
2:用串口终端软件显示字符串,连续发送几个字符串时,“xxxx/n”,包含了换行转义字符,但是就是不会换行?
通过调试,发现在存储空间,转义字符‘/n’是正确的0x0a,
usart_sendstring(usart2,menu[0]);
usart_sendstring(usart2,menu[1]);
usart_sendstring(usart2,menu[2]);
usart_sendstring(usart2,menu[3]);
但是不连续发送就不会出现这种现象,或者一句句调试打印也不会出现不换行的现象,断定是连续发送的时间间隔太短,软件还没来得及换行,就又重新显示新数据,那么就在usart_sendstring的尾部加了延时,就解决问题了。
来源:http://www.51hei.com/stm32/4117.html
esata接口怎么用 esata接口可以当usb接口用吗
PCAN-Router(FD)
龙芯千元电脑配置曝光
电力行业布局新基建拉动产业链经济,360提供安全运营服务解决方案
使用四合一检测仪时有哪些要求和注意事项
USART的波特率的计算公式
宽带砷化镓功率放大器AM06013033MD-3H介绍
单片机语音芯片在工业控制中的应用优势
字节跳动拟组建名为TikTok Global新公司 12个月内纽约上市
金属接近开关的原理_金属接近开关电路图
全景VR高速发展 创新潮流引领未来
三星S7 Edge对比华为mate9pro,总比分7:5谁更强?
黑客入侵用户加密货币的四种常见方式
游泳级防水电话手表将如何实现IP68级防水功能
无人驾驶驶向低谷
FTH系列可编程直流电源的特征及应用领域
无线充电技术如何才能保证充电安全
亚马逊常见的一些UL测试标准和测试内容
CMMB:术语概念类
场强测量的四种模式及不确定度简介