找回密码
 立即注册
查看: 105|回复: 18

在串口设置帧格式为9bit时,怎么使用DMA功能?

[复制链接]

6

主题

49

回帖

213

积分

中级会员

积分
213
发表于 3 天前 | 显示全部楼层 |阅读模式
如题,现在需要使用串口的9bit的可变波特率格式,由于第九位是写到TB8种,想问这种情况下该怎么使用DMA进行9bit串口的收发?
回复

使用道具 举报 送花

已绑定手机

2

主题

153

回帖

466

积分

中级会员

积分
466
发表于 3 天前 | 显示全部楼层
试试这个:


USARTCR2
S1PCEN:硬件自动产生硬件奇偶校验位控制使能
0:禁止自动产生硬件奇偶校验位(串口的校验位为TB8设置的值)
1:使能自动产生硬件奇偶校验位

S1PS:硬件奇偶校验位模式选择
0:硬件根据SBUF的值自动产生偶校验位
1:硬件根据SBUF的值自动产生奇校验位
回复

使用道具 举报 送花

6

主题

49

回帖

213

积分

中级会员

积分
213
 楼主| 发表于 3 天前 | 显示全部楼层

我是需要自己设置第九位,不能是奇偶校验。
回复

使用道具 举报 送花

已绑定手机

2

主题

153

回帖

466

积分

中级会员

积分
466
发表于 3 天前 | 显示全部楼层
marsha*** 发表于 2026-11-4 11:33
我是需要自己设置第九位,不能是奇偶校验。

第9位就是奇偶校验位,
你想加自己定义数据位?应该不行。
自定义数据,直接写在正常的8位里就行了,即做为正常的数据。
如要发送一个9位的数据,分为两字节发送。


如果要发送地址帧,发送分两步,1步手动发地址带TB8, 之后启动DMA.
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25428
发表于 3 天前 | 显示全部楼层

STC的MCU,哪几个型号的 DMA支持串口自动奇偶检验

截图202611041156303448.jpg
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25428
发表于 3 天前 | 显示全部楼层

先说结论与一个必须澄清的点

你这个问题里的"串口自动奇偶校验"功能,在手册中并不属于 DMA 的配置位,而是串口的 USARTnCR2 寄存器里由 PCEN/PS 控制的硬件自动校验功能。 DMA 侧并不存在"校验使能位"。

另外要特别提醒:DMA 寄存器里的 URnTPTY[1:0] / URnRPTY[1:0] 中的 PTY 是 Priority(优先级),不是 Parity(校验)。手册原文定义是"URnT_DMA数据总线访问优先级控制位",00=最低级、01=较低级、10=较高级、11=最高级。这一点千万别按"Parity"去配置,属于常见误读。

一、串口自动奇偶校验靠哪个位实现

手册「串口通信」/「USART」章节中,串口的硬件自动校验由 USARTnCR2 的低 3 位控制(以串口1为例):

符号地址B7B6B5B4B3B2B1B0

USARTCR2(STC8H)FDC1H-----PCENPSPE
USARTCR2(STC32G/Ai8051U)7EFDC1HIRENIRLPSCENNACKHDSELPCENPSPE
USARTCR2(STC32G144K246)7EFDC1HS1IRENS1IRLPS1SCENS1NACKS1HDSELS1PCENS1PSS1PE

  • PCEN(B2):硬件自动产生校验位控制使能
    • 0:禁止硬件自动产生校验位(串口的校验位为 TB8 设置的值)
    • 1:使能硬件自动产生校验位
  • PS(B1):硬件校验位模式选择
    • 0:硬件根据 SBUF 的值自动产生偶校验位
    • 1:硬件根据 SBUF 的值自动产生奇校验位
  • PE(B0):校验位错误标志(必须软件清零)

关键原文(这正是"与 DMA 配合"的说明):

PE:校验位错误标志(必须软件清零)
0:无检验错误
1:有校验错误(串口接收 DMA 过程中如果发生接收数据校验位错误,DMA 不会停止,但校验位错误标志会一直保持直到 DMA 完成)

这段原文说明:开了 DMA 接收,硬件校验照样工作,校验出错不会打断 DMA 搬运,只是 PE 标志会一直保持到 DMA 完成,由软件去清。所以"DMA + 自动奇偶校验"是配套可用的。

二、哪些型号同时具备「DMA」+「串口硬件奇偶校验」

必须两个条件同时满足才有意义。逐系列对照手册开头的功能支持表:

1. STC8H 系列(串口章节支持表 + DMA 章节支持表)

串口章节支持表中,"硬件奇偶校验"列为 ● 的型号:

型号 串口数量 硬件奇偶校验 DMA
STC8H1K08 / 1K28 / 3K64S4 / 3K64S2 2~4 空 空
STC8H8K64U 4 空 空(A 版)/ ●(B/C/D 版)
STC8H4K64TL / 4K64TLCD 4 空 ●
STC8H1K08T 2 空 ●
STC8H2K12U-A 2(含接收超时中断 ●) 空 空
STC8H2K12U-B 2 ● 空
STC8H2K32U 2 ● 空

结论(STC8H 系列):串口硬件奇偶校验只有 STC8H2K12U-B 和 STC8H2K32U 支持,但这两款在 DMA 章节的 DMA 栏都是空的——即 STC8H 系列中没有任何一款同时具备 DMA 和串口硬件奇偶校验。

2. Ai8 系列

DMA 支持情况与 STC8H 完全一致(Ai8H8K64U B/C/D 版、Ai8H4K64TL、Ai8H4K64TLCD、Ai8H1K08T 为 ●),串口硬件校验同 STC8H(仅 STC8H2K12U-B / 2K32U 对应型号有)。同样没有交叉的型号。

3. Ai8051U 系列

  • 串口章节标题即为「2组USART-LIN/SPI,同步/异步串口通信,硬件奇偶校验」,U1~U2 均具备 PCEN/PS/PE;
  • DMA 章节支持表:Ai8051U 系列 DMA 为 ●,含 UR1T/R、UR2T/R、UR3T/R、UR4T/R。

→ Ai8051U 系列:DMA 与串口硬件奇偶校验同时具备,串口 1、串口 2 可用。

4. STC32G 系列

  • 「2组USART-LIN/SPI,同步/异步串口通信」章节,USART1、USART2 均有 PCEN/PS/PE;
  • DMA 章节支持表:STC32G12K128、STC32G8K64、STC32F12K60、STC32CL8K64 全部为 ●。

→ STC32G 系列:DMA 与串口硬件奇偶校验同时具备(串口1、串口2)。

5. STC32G144K246 系列

  • 「8组USART-LIN/SPI,同步/异步串口通信,硬件奇偶校验」章节,USART1~USART8 每个都有 SnPCEN/SnPS/SnPE;
  • DMA 章节支持表:STC32G144K246 系列 DMA 为 ●,含 UR1T/R ~ UR8T/R。

→ STC32G144K246 系列:DMA 与串口硬件奇偶校验同时具备,且串口 1~8 全部可用。

三、汇总表(同时满足两个条件的型号)

系列具体型号可用串口依据

Ai8051UAi8051U 系列(全系 ●)U1、U2串口章节标题含"硬件奇偶校验";DMA 章节 ●
STC32GSTC32G12K128、STC32G8K64、STC32F12K60、STC32CL8K64U1、U2USART1/2 有 PCEN/PS/PE;DMA 章节均 ●
STC32G144K246STC32G144K246 系列U1U8USART18 均有 SnPCEN/SnPS/SnPE;DMA 章节 ●

明确不具备组合的:STC8H 全系、Ai8 全系(有校验的 2K12U-B/2K32U 无 DMA;有 DMA 的型号校验栏为空)、STC8G 全系(无 DMA)。

四、配置要点(以 STC32G/Ai8051U 串口1为例)

P_SW2 |= 0x80;              // 允许访问 XFR 扩展寄存器
USARTCR2 |= 0x04;           // PCEN=1,使能硬件自动产生校验位
USARTCR2 &= ~0x02;          // PS=0,偶校验(置1则为奇校验)
// 串口需工作在9位模式,硬件校验位占用第9位

注意两点(均有手册依据):

  1. PCEN=1 时校验位由硬件根据 SBUF 自动产生,TB8 的设置值不再生效;PCEN=0 时校验位就是软件写进 TB8 的值。
  2. 校验错误时 DMA 不会停止,需软件在 DMA 完成后检查并清 PE。

📚 参考章节:串口通信,可省电模式唤醒,可实现 LIN(STC8H/Ai8);2组USART-LIN/SPI,同步/异步串口通信(STC32G);2组USART-LIN/SPI,同步/异步串口通信,硬件奇偶校验(Ai8051U);8组USART-LIN/SPI,同步/异步串口通信,硬件奇偶校验(STC32G144K246);DMA(各系列)

补充说明:如果你原本是想用 STC8H 这类小容量型号做"校验 + DMA"的组合,按手册现状做不到,需要换到上表三个系列;若是 8 位系统且要小封装,Ai8051U 系列是能满足该组合的 8 位方案。请告诉我你的目标型号和串口号,我可以给出完整可编译的初始化代码。


🔍 搜索 "STC的MCU 哪几个型号的 DMA支持串口自动奇偶检验"

📌 相关论坛讨论

  1. STC32的串口1/2 是硬件奇偶校验,有DMA支持硬件奇偶校验
  2. 求助帖:STC32G 串口2DMA的发送问题 | 已正常
  3. STC8H系列的手册好久没更新了,说明已经成熟!那么何时给我们一个完美的51串口呢?

⏱️ 查找用时 15.6s | 总回答用时 26.7s

回复

使用道具 举报 送花

6

主题

49

回帖

213

积分

中级会员

积分
213
 楼主| 发表于 3 天前 | 显示全部楼层
神*** 发表于 2026-11-4 11:56
先说结论与一个必须澄清的点
你这个问题里的"串口自动奇偶校验"功能,在手册中并不属于 DMA 的配置位,而是 ...

我使用的MCU为STC32G144K246
我是需要将第九位作为一个有效位来使用的,并不是用于校验,因为DMA是将外设搬运到内存的或者内存搬运到外设,如果此时发送的数据包含第九位,DMA将这个第九位搬运到哪里?或者如果存在第九位要发送,在内存中怎么存才能使用DMA发送时搬运到TB8?而且这个第九位也不是位于SBUF种,而是位于RB8中,DMA有将RB8和SBUF同时搬运到内存中的功能吗?

点评

这对当前串口属于非标设计不支持的。顶多只能自动发校验值。 对于这个场景,原始需求是什么?  详情 回复 发表于 3 天前
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
发表于 3 天前 | 显示全部楼层
marsha*** 发表于 2026-11-4 13:46
我使用的MCU为STC32G144K246
我是需要将第九位作为一个有效位来使用的,并不是用于校验,因为DMA是将外设 ...

这对当前串口属于非标设计不支持的。顶多只能自动发校验值。

对于这个场景,原始需求是什么?
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

11

主题

484

回帖

1362

积分

金牌会员

积分
1362
发表于 3 天前 | 显示全部楼层
支持地板建议
回复

使用道具 举报 送花

6

主题

49

回帖

213

积分

中级会员

积分
213
 楼主| 发表于 3 天前 | 显示全部楼层
erci*** 发表于 2026-11-4 15:52
这对当前串口属于非标设计不支持的。顶多只能自动发校验值。

对于这个场景,原始需求是什么?

这种并不算非标吧,对于上位机软件来说第九位就时开放给客户的,和常规51一样的,无非没有DMA

点评

我意思对于串口的当前DMA设计来说,没这功能。 但是是什么场景需要? 如果市场有需求,设计能改,后续新型号也许就可实现。  详情 回复 发表于 3 天前
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-7 10:37 , Processed in 0.081910 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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