rm543 发表于 2025-6-17 19:06:25

由于时钟对齐问题,硬件异步串口无法实现1.5位停止位

在标准异步串口应用中,存在1,1.5,2位三种停止位设置。

近日在使用 STC8H2K08U 调试USB转异步串口应用中,在调试停止位功能,经实验和推测,可能在原理上无法实现硬件串口的1.5位停止位功能。

停止位实现思路:
由于串口校验位是独立的,不能占用校验位实现停止位功能,所以使用定时器实现停止位功能。

实现方法:
定时器预先存入4倍(2位)或2倍(1.5位)波特率位时间,设置为不自动重装,每次进入中断再进行重装计时。
在串口发送完成中断后,打开定时器计时开关,待定时器中断到达,再进行下一串口数据发送。

调试过程:
软件设置2位停止位时,字符间隔是多了一个停止位,而且很准确。
但是在设置1.5位停止位时,字符间隔依旧是2个停止位,没有变化,但是定时器的装载值是变化且正确的。

分析:

STC的异步串口波特率是时钟源的 1/4
由此推测工作方式:作为异步串口接收时,应该是每位采用4次分频在第3次读电平;

当作为异步发送时,使用时钟源的4分频作为发送移位时钟源



按照描述,应该在填入SBUF后马上(注意这个马上时刻)进行移位。
接收时收到下降沿时进行同步计数并接收。


根据描述推测,串口异步发送是在完成发送停止位后的第一个时钟源时钟(1/4波特率时间)进行中断,
进行异步接收时,在停止位时间的第2次时钟产生中断。

按照以上推理,做了一个发送测试:
在打开定时器计数时引脚置1,进入定时器中断进行发送后引脚置0。把定时器的定时值设定到5个波特率时钟
理论上会在串口发送停止位时,延迟 1/3 或者 1/4 的位时间再加上5个波特率时钟产生中断,引脚置1,且在引脚置0后进行数据发送。

实测结果(使用逻辑分析仪进行测量,采样率40MHz):
主频24MHz,波特率设置为1000,一位的时间为100uS,定时器1T模式计时5个波特率时钟时间,即3000,125uS。


引脚在完成第8位数据发送后的 950nS 置1,消耗约23个时钟,进入串口中断加上压栈大概运行有6条指令。
引脚在128uS后完成数据装载置0,中间包含了串口数据的取缓存和装载,3uS 72个时钟符合正常消耗。
但是串口却在第八位发送后的200uS才进行数据发送,刚好是2个停止位。

定时器改为9个波特率时钟时间,即5400,225uS


引脚在227uS后完成数据装载置0,但是串口却在第八位发送后的300uS才进行数据发送,为3个停止位。

1位停止位连续发送时,无数据间隔。


以上得到结论:
1,串口异步发送时,移位时钟源是4分频后的波特率时钟,意味着每计数4次才工作一次。
如果装载SBUF的时刻刚好错过了上一个移位时钟,那就要再等4个波特率时钟才能进行装载,
所以硬件无法实现在1.5个停止位的时候发送下一个数据,如果需要实现严谨的1.5位停止位,
可能需要使用软件串口发送,代价可能会比较大。
2,串口异步发送时,发送完第8位就会立即产生中断,并不在1/3停止位处产生中断,
官方文档建议进行检查,看看是不是用的旧版本描述?


此测试并非很严谨,推断未必符合事实,一切结果以官方信息为准。





神农鼎 发表于 2025-6-17 20:27:48

设置为9位,第9位永远送1,就是2个停止位

神农鼎 发表于 2025-6-17 20:28:52

现在的 MCU/DSP 速度都满足 1个停止位了,没必要 1.5个停止位,没必要 2个停止位

rm543 发表于 2025-6-18 09:16:46

神农鼎 发表于 2025-6-17 20:28
现在的 MCU/DSP 速度都满足 1个停止位了,没必要 1.5个停止位,没必要 2个停止位 ...

当需要校验位的时候,不能占用第九位的校验位做停止位。

目前确实绝大多数应用都不需要串口额外加停止位,但是看到网上没有人做过这个1.5停止位的应用,既然串口标准里面有,就尝试一下以作记录。
页: [1]
查看完整版本: 由于时钟对齐问题,硬件异步串口无法实现1.5位停止位