资料介绍
使用开发板的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的尾部加了延时,就解决问题了。
- 智嵌STM32F107网络互联开发板V2.2原理图 19次下载
- RT-Thread libmodbus RS485 RTU主机调试 - STM32F107VCT6
- 使用STM32CubeMX 快速生成 USB HID 工程 - STM32F107VCT6
- STM32V107VCT6,基于HAL库的用IO口模拟I2C的0.96寸OLED驱动
- MCU-stm32f107vc line block diagram(芯片集成电路内部功能单元电路方框图)
- 基于STM32F103C8T6开发板控制的OLED显示 78次下载
- STM32F107单片机开发板的模板文件免费下载 71次下载
- STM32F107官方开发板原理图及PCB资料免费下载 0次下载
- STM32F107VCT6+DP83848 移植 LWip-1.4.1 笔记 119次下载
- STM32F107开发板的学习笔记 52次下载
- GD32F107VCT6 Demo板原理图及使用说明 209次下载
- 深入STM32F107VCT6的串口通信 98次下载
- STM32F107开发板用户手册V1.0 74次下载
- 智嵌 STM32F107网络互联开发板V2.2原理图 128次下载
- STM32F 107 开发板用户手册(User Manual) 12次下载
- 正点原子stm32f1 nano开发板简介 1795次阅读
- 微雪电子STM32开发板 Open32F3-D简介 1464次阅读
- 微雪电子STM32开发板 Open32F3-D简介 1511次阅读
- 微雪电子STM32开发板 Open32F3-D简介 1522次阅读
- 微雪电子STM32开发板 Open32F0-D简介 1516次阅读
- 微雪电子STM32开发板 Open107V简介 1397次阅读
- 微雪电子STM32F446RET6 STM32开发板简介 5678次阅读
- 微雪电子STM32F411RET6 STM32开发板简介 6659次阅读
- 微雪电子STM32F469NIH6开发板 学习板简介 4159次阅读
- 微雪电子32F746GDISCOVERY STM32F7开发板简介 4040次阅读
- 微雪电子STM32F3Discovery 开发板简介 3605次阅读
- dfrobotSTM32 Cortex M3开发板简介 1248次阅读
- 微雪电子STM32开发板 Open32F0-D简介 1334次阅读
- 基于STM32F107VCT6微控制器的控制系统解决方案 7178次阅读
- stm32开发板哪个好 5.5w次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多