背景
公司一款主板基于STM32F407ZET6,片内6路串口,竟然不够用(😄😄),那就模拟呗,此次模拟1路串口,本次DEMO使用正点原子探索者开发板,系统时钟频率是168MHz
DEMO功能
1.数据发送
2.数据接收
3.串口打印
4.可配置波特率
实现思路
原理:IO口模拟串口,一切按照串口协议进行操作
简易串口通信协议:起始位*1 + 数据位*8 + 停止位, 时序图如下
1.发送
根据协议,计算好不同波特率对应的延时时间进行数据发送即可
例如,
当波特率是115200时,发送1bit数据需要 1/115200 = 8.68us;
所以,根据协议每一位数据传输延时8.68us即可,我直接使用原子的us延时函数,延时8us,可行
2.接收
通过外部中断检测接收管脚的下降沿,检测到起始信号后开启定时器,定时器按照波特率设定好时间,每隔一段时间进入定时器中断接收数据,完成一个字节后关闭定时器,然后在主函数中清BUFF和接收长度计数即可。
此时定时器操作需要注意,定时器配置抢占优先级和响应优先级均为0(最高),计算定时器配置
定时1/(波特率*3倍)us,如果波特率是115200,则定时时间为2.89us,
系统时钟频率168MHz,分频系数是2,定时器时钟频率为 = 84MHz,接收周期是1/84us,所以重装载计数值为
2.89/(1/84) = 243,以此公式计算则可以得出常用波特率下的重装载计数值。
详细可以下载程序测试使用
操作过程
1.准备正点原子探索者开发板一块
2.TTL转USB串口调试线一个
3.拔掉战舰USART1跳线帽
4.将串口线插在跳线帽所在PA9,PA10(PA9本来是串口1的接收,我们用作发送, PA10本来是串口1的发送,我们用作接收,具体实现在代码中体现)
5.烧写按照程序设计思路所编写代码,然后通过串口工具发送数据给开发板,此时串口助手收到所发内容
测试记录(下边是猫猫串口助手,很好用,强力推荐):
经测试,程序可以配置各种波特率使用,如有问题望指正:QQ 473150204
源码(MDK)