这是我STM32F103C8T6开发笔记专栏的一部分。可以到专栏中查阅更多内容。
STM32F103C8T6开发笔记整理zhuanlan.zhihu.com【写在前面】:
- 这篇笔记的内容,一是要实现STM32中串口的收发功能,二是要解析来自上位机发送的命令,从而控制单片机实现一些功能。
- 通过上位机发送的不同的命令,控制RGB彩灯显示不同的颜色和状态。
- 关于串口和寄存器配置的一些详细信息,可以参考《stm32f10x中文参考手册》的USART章节,限于篇幅就不在此赘述了,它里面写的十分详细。
- 我使用的是STM32F103C8T6型号的核心板。
- 这篇笔记是综合参考了野火、正点原子、st官方以及网络上的一些资料,然后经过我自己的思考、尝试与实践,从而整理出来的。十分感谢那些愿意在学习的路上分享自己知识与经验的前辈。
- 我在学习的过程中,经历过毫无头绪,找到一堆学习资料却不知从何开始的痛苦。我希望我整理的笔记,不光可以方便自己在以后的项目中拿来即用,也希望能够对那些喜欢玩硬件、爱折腾的小伙伴有所帮助。如果你们觉得我的文章对你们有用,欢迎大家点赞+收藏,让我知道,我的工作是有价值的。
usart.h
#ifndef __USART_H
usart.c
#include
led.h
// 见专栏中的GPIO笔记
led.c
// 见专栏中的GPIO笔记
main.c
#include
[Debug记录1]
情况描述:
当命令过长时,重新输入第一个命令时。会在命令的第一个位置上多出一个R。当再次发送该命令时,命令回显正常,能够正常下发指令。
分析:
出现该现象的原因在于,这个多出来的‘R’正好是第三十一个字符。虽然在串口1的接收中断处理程序中,当RxCounter的值大于30的时候,就将置位溢出标志位,并关闭串口的接收中断。但是,疏忽的一点在于,实际上,这是我们第31次进入中断,也就是说,虽然我们没有在中断处理函数中将这第31个字符保存到缓冲区中,但是这个字符实际上还保存在STM32的DR寄存器中,只是我们没有读它而已。
当我们在main函数中,清空这个溢出状态位,并开启串口1接收中断的时候,将会立即产生一个中断,将这第31个字符'R'保存到缓冲区的第一个位置上去。
解决办法:
在结束中断,回到main函数中处理缓冲数组溢出的时候,等待一段时间,读一下DR寄存器,再开启接收中断就可以了。
[Debug记录2]
情况描述:
在接收中断程序中处理缓冲区溢出的情况时。尝试先再中断程序中将串口关闭,然后在main函数中处理溢出事件完毕后,再将串口使能。这样会出现无法回显和下发命令的情况。
分析:
出现这种情况的原因在于,由于在串口中关闭了中断,当程序回到主程序时,调用printf()函数的时候,会一直在其内部循环等待TXE位置位。所以会出现程序卡死的情况。
解决方案:
在中断处理程序中,只关闭串口接收中断即可。不要关闭串口。
[Debug记录3]
情况描述:
在串口调试助手中,向单片机发送命令,回显的命令字符串有时会有‘N’或者‘ON’的字样。
分析:
这是由于每一条命令的长度不一样,同时在程序中每次处理完接收到的数据帧之后没有对缓冲数组进行清空,导致在显示回显字符串的时候,会将上一条指令剩下的字符一同显示出来。
解决方案:
在main函数中,处理完一帧数据后,将接收缓冲数组清空。修改后,显示正常。
为了方便文件的分享与管理,我将该项目完整的工程文件,放在了我的个人公众号里面,想要学习的小伙伴可以在微信里搜索:蟹老板的折腾日常。回复:003,即可免费获取。