OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 147|回复: 3

分享一个模拟串口(软件串口)发送和接收的驱动

[复制链接]

12

主题

103

帖子

0

精华

高级会员

Rank: 4

积分
529
金钱
529
注册时间
2014-8-14
在线时间
154 小时
发表于 2025-2-5 11:26:35 | 显示全部楼层 |阅读模式
本帖最后由 Cindre鞡 于 2025-2-5 11:28 编辑

MCU:STM32F103RE,Flash-512k,Ram-64K,标准主频-72MHz
库函数:标准库
RTOS:FreeRTOS
---------------------------------------------------------------------------------
设计方向为全双工收发
---------------------------------------------------------------------------------
模拟串口驱动:driver/src/suart.c,driver/src/suart.h
支持的波特率:1200,2400,4800,9600,14400,19200,38400,57600,115200,目前仅支持8N1
---------------------------------------------------------------------------------
硬件资源使用:使用一个定时器做发送,一个外部中断和定时器做接收,可以任意GPIO模拟串口
---------------------------------------------------------------------------------
设计思路:
1.发送:比较简单,根据波特率对应的1-bit时间,在定时器中断里采用状态机方式发送一个bit,未使用TIM+DMA+GPIO的方式。
2.接收:为了简化中断执行,我使用之前帖子(潘多拉-红外+NEC协议的编解码驱动,http://www.openedv.com/forum.php?mod=viewthread&tid=350446&extra=)里的接收方式,直接将电平宽度和逻辑电平保存下来,等接收完成后再解析数据。
3.接收的数据解析:数据解析的难点主要在于起始位后的数据是单个低电平还是多个低电平,停止为前的电平是单个高电平还是多个高电平
---------------------------------------------------------------------------------
起始位和数据的判断:当空闲状态时外部中断发送下降沿说明开始接收,以9600bps为例,1-bit宽度应为104us,如果时低电平且持续了104us,则说明起始位后边的是高电平,否则应为104的正整数倍(需要考虑一些时间误差),比如312us,减去起始位之后应为208us,则说明起始位之后有连续2个低电平
---------------------------------------------------------------------------------
停止为和数据的判断:不管单个还是多个数据,仅重点判断最后一个数据的停止就好,因为数据之间有起始位的下降沿去结束上一个数据停止位的上升沿,那么当最后一个字节停止位接收后进入空闲状态(高电平)就只能靠接收定时器设置的超时时间(电平时间和超时是同一个定时器),必须大于等于10倍1-bit电平宽度,要考虑到接收0xFF的情况加上停止位和时间冗余,需至少10个bit的时间,所以利用这个特性,判断最后的电平宽度,减去超时时间和停止位时间就是最后几个高电平bit的个数了
---------------------------------------------------------------------------------
为什么不使用TIM+DMA+GPIO的方式,如下
1.因为模拟串口是扩展串口出来用,但基本上定时器的更新事件对应的数据流都有硬件串口的DMA功能(STM32F407,STM32F103有独立的更新事件),为了使用模拟串口却放弃了硬件串口的DMA,得不偿失
如果不得不使用模拟串口,硬件串口可以放弃一路DMA,给模拟串口发送使用,这样也存在问题
2.首先是内存占用太多,GPIO的BSRR寄存器,需要32bit数据去描述1bit的串口数据,那么1字节串口数据需要10x32bit=40byte内存,如果串口发送数据太多,小内存单片机根本不够,本来小内存单片机硬件串口不够才会使用模拟串口,结果内存又不够,大内存单片机可能根本不会使用模拟串口,如果大内存单片机开一个大ram去缓存全部数据,可行,代价就是ram占用太多太多。
3.其次,如果只用40byte去一个字节一个字节的发送,那么是不是得等上一个字节发送完成再组合下一字节,再触发发送,那么在RTOS中死等发送完成用不用osdelay?用了,则在大型工程(或任务数比较多)的时候怎么保证得到及时处理,不够及时的处理,那么数据发送的连续性就差了,在有些外设看来可能一帧数据就算结束了,如果不用osdelay,那么是不是其他任务就得不到运行机会了呢,本意就是减轻cpu负担,结果却死等结果,反而得不偿失,还要算上任务优先级,是时间片还是不同优先级,不确定性就更大了
---------------------------------------------------------------------------------
如果我有哪些地方可以做的更好,希望提出,我也学习并改进
---------------------------------------------------------------------------------
SUART-STM32F103.zip (1.08 MB, 下载次数: 6)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2024-12-4
在线时间
12 小时
发表于 2025-2-5 14:04:37 | 显示全部楼层
加油。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

70

主题

6756

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12974
金钱
12974
注册时间
2012-11-26
在线时间
3786 小时
发表于 2025-2-5 15:27:36 | 显示全部楼层
帮顶    之前做过只用一个定时器,同时模拟好几路收发的   
回复 支持 反对

使用道具 举报

12

主题

103

帖子

0

精华

高级会员

Rank: 4

积分
529
金钱
529
注册时间
2014-8-14
在线时间
154 小时
 楼主| 发表于 2025-2-5 17:23:24 | 显示全部楼层
jermy_z 发表于 2025-2-5 15:27
帮顶    之前做过只用一个定时器,同时模拟好几路收发的

半双工可以,全双工我没想到好的办法
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-22 17:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表