硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1594|回复: 10
收起左侧

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

[复制链接]

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2025-2-5 11:29:49 | 显示全部楼层 |阅读模式
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协议的编解码驱动,https://www.armbbs.cn/forum.php?mod=viewthread&tid=125883&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, 下载次数: 39)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2025-2-5 13:19:05 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2025-2-10 00:40:23 | 显示全部楼层
1倍采样不能稳定运行,3倍采样取众数也不行。3倍采样按取高低低作为起始位,之后在起始的拍数上采样缓存bits,读第8位后更新Rx bytes,处理数据,更新Tx队列,重新等起始位。可以4倍采样,缓存4帧IO口数据,高低低低作起始位,取众数。固定节拍从发送队列缓存写电平。
C8连续的FT脚不多,VE可以16通道。
回复

使用道具 举报

5

主题

157

回帖

172

积分

初级会员

积分
172
发表于 2025-2-11 01:15:07 | 显示全部楼层
dma的优势可以只需要两个通道就可以模拟16个整组的GPIO串口。虽然代价就是多倍的内存
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2025-2-11 09:14:44 | 显示全部楼层
2859932063 发表于 2025-2-11 01:15
dma的优势可以只需要两个通道就可以模拟16个整组的GPIO串口。虽然代价就是多倍的内存

除非将全部要发送的数据都处理好再发送,否则用DMA会带来问题
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2025-2-11 09:16:59 | 显示全部楼层
wangyi041228 发表于 2025-2-10 00:40
1倍采样不能稳定运行,3倍采样取众数也不行。3倍采样按取高低低作为起始位,之后在起始的拍数上采样缓存bit ...

谢谢你的思路,我没有采取间隔采样的方式,我是直接缓存电平宽度,然后解析
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2025-2-15 11:13:28 | 显示全部楼层
我这里有一个高波特率方法,使用的是ch32v003-  12m频率-定时器轻松400000波特率。
用定时器突发dma-pwm支持任意数据位校验位停止位,用pwm代替决定一个位的高低。pwm频率配置为波特率,定时器arr要给高一点我给的是10,建立两个fifo,一个给dma刷新用,另一个缓存用,这里dma缓存等于(起始位+数据位+校验位+停止位)*串口数量* 8/16(看pwm寄存器支持对不对齐)位。dma刷新完毕后进入中断查看fifo来决定是更新缓存。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2025-2-15 11:21:49 | 显示全部楼层
wangyi041228 发表于 2025-2-10 00:40
1倍采样不能稳定运行,3倍采样取众数也不行。3倍采样按取高低低作为起始位,之后在起始的拍数上采样缓存bit ...

低波特率直接通过exti检测低电平,然后启动定时器在电平中心稳定时采样不好吗。高波特率采样的话这个3倍采样中断频率是否太高了
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2025-2-20 09:20:34 | 显示全部楼层
好喜欢你lys 发表于 2025-2-15 11:13
我这里有一个高波特率方法,使用的是ch32v003-  12m频率-定时器轻松400000波特率。
用定时器突发dma-pwm支 ...

谢谢你的思路,模拟串口就写来玩玩,不打算更进一步了,我工作这些年从来没有遇到过要用模拟串口的场景
回复

使用道具 举报

9

主题

36

回帖

63

积分

初级会员

积分
63
发表于 2025-2-20 10:36:15 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2025-2-22 00:14:37 | 显示全部楼层

谢谢阅读,           
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 11:47 , Processed in 0.325886 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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