找回密码
 立即注册
查看: 99|回复: 3

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

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:91
  • 最近打卡:2025-06-29 13:20:51

5

主题

51

回帖

739

积分

高级会员

积分
739
发表于 2025-6-17 19:06:25 | 显示全部楼层 |阅读模式
在标准异步串口应用中,存在1,1.5,2位三种停止位设置。

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

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

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

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

分析:
截图202506171759133293.jpg
STC的异步串口波特率是时钟源的 1/4
由此推测工作方式:作为异步串口接收时,应该是每位采用4次分频在第3次读电平;
截图202506171817344018.jpg
当作为异步发送时,使用时钟源的4分频作为发送移位时钟源
截图202506171819393831.jpg

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

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

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

实测结果(使用逻辑分析仪进行测量,采样率40MHz):
主频24MHz,波特率设置为1000,一位的时间为100uS,定时器1T模式计时5个波特率时钟时间,即3000,125uS。
截图202506171835452187.jpg
截图202506171852526977.jpg
引脚在完成第8位数据发送后的 950nS 置1,消耗约23个时钟,进入串口中断加上压栈大概运行有6条指令。
引脚在128uS后完成数据装载置0,中间包含了串口数据的取缓存和装载,3uS 72个时钟符合正常消耗。
但是串口却在第八位发送后的200uS才进行数据发送,刚好是2个停止位。

定时器改为9个波特率时钟时间,即5400,225uS
截图202506171947448991.jpg
截图202506171951357464.jpg
引脚在227uS后完成数据装载置0,但是串口却在第八位发送后的300uS才进行数据发送,为3个停止位。

1位停止位连续发送时,无数据间隔。
截图202506171954105251.jpg

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


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





回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-06-29 00:35:48

741

主题

1万

回帖

1万

积分

管理员

积分
17194
发表于 2025-6-17 20:27:48 | 显示全部楼层
设置为9位,第9位永远送1,就是2个停止位
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-06-29 00:35:48

741

主题

1万

回帖

1万

积分

管理员

积分
17194
发表于 2025-6-17 20:28:52 | 显示全部楼层
现在的 MCU/DSP 速度都满足 1个停止位了,没必要 1.5个停止位,没必要 2个停止位
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:91
  • 最近打卡:2025-06-29 13:20:51

5

主题

51

回帖

739

积分

高级会员

积分
739
发表于 2025-6-18 09:16:46 | 显示全部楼层
神*** 发表于 2025-6-17 20:28
现在的 MCU/DSP 速度都满足 1个停止位了,没必要 1.5个停止位,没必要 2个停止位 ...

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

目前确实绝大多数应用都不需要串口额外加停止位,但是看到网上没有人做过这个1.5停止位的应用,既然串口标准里面有,就尝试一下以作记录。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-29 18:31 , Processed in 0.122951 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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