好的,我已经看到了这个帖子。这是一个关于 STC32G144K246 核心板的问题,我来帮你分析一下。
问题分析
现象总结:
- 芯片:STC32G144K246
- 功能:串口1超时中断 + DMA串口1自动接收
- 超时中断里执行 DMA 串口1自动发送
CKCON=0 时一切正常
CKCON=1 时:DMA自动接收的目标地址数据不更新,但DMA接收的数据数量(计数器)是对的,DMA发送也正常
根本原因分析
CKCON 寄存器(时钟控制寄存器)的作用:
在 STC32G 系列中,CKCON 寄存器的 bit0(即 CKCON 的最低位) 通常用于控制 ALE 信号输出使能 或 外部存储器访问时序。但更重要的是,在 STC32G 系列中,CKCON 寄存器的某些位会影响 系统时钟分频 或 总线访问时序。
查阅 STC32G144K246 手册,CKCON 寄存器的定义如下:
| 位 |
名称 |
功能 |
| 7 |
- |
保留 |
| 6:5 |
- |
保留 |
| 4 |
- |
保留 |
| 3 |
- |
保留 |
| 2 |
- |
保留 |
| 1 |
- |
保留 |
| 0 |
CKCON0 |
ALE 输出使能控制位:0=ALE 正常输出,1=ALE 禁止输出 |
但是,对于 STC32G 系列,CKCON 寄存器还有一个非常关键的作用——它会影响 MOVX 指令的访问时序(即外部总线/扩展RAM的访问速度)。
当 CKCON=1 时,ALE 信号被禁止输出,同时 MOVX 访问时序可能会被改变(访问速度变快)。而 DMA 的自动接收操作本质上是 DMA 控制器通过 MOVX 总线访问 XRAM(目标地址缓冲区)。
关键点:
CKCON=1 改变了总线访问时序(MOVX 周期变短)
- DMA 自动接收时,DMA 控制器向目标地址写入数据,这个操作依赖 MOVX 总线时序
- 如果
CKCON=1 导致总线时序变快,而 DMA 控制器或串口接收 FIFO 的握手逻辑在快速时序下出现 写完成标志未正确建立 的情况,就会导致 数据实际上没有被正确写入目标地址,但 DMA 的 字节计数器(记录传输了多少字节)仍然会递增
- 这就是为什么你看到 "DMA接收的数据数量是对的,但目标地址数据不更新"
解决方案
方案一:保持 CKCON=0(推荐)
既然 CKCON=0 时一切正常,建议保持 CKCON=0。ALE 引脚在不需要外部总线扩展时,保持默认状态即可。
方案二:如果必须使用 CKCON=1
如果因为其他原因(如需要禁止 ALE 输出以节省功耗或避免干扰)必须设置 CKCON=1,请尝试以下措施:
- 在 DMA 启动前插入适当的等待周期,确保总线时序稳定后再启动 DMA 传输。
- 检查 DMA 配置中的总线访问等待设置,看是否有相关寄存器可以调整。
- 在设置
CKCON=1 后,重新初始化 DMA 控制器,让 DMA 重新适配新的总线时序。
方案三:检查 XRAM 访问等待周期
STC32G 系列有 总线等待周期控制寄存器(如 BUS_SPEED 或类似寄存器),可以尝试增加 XRAM 访问的等待周期:
// 示例:增加外部总线等待周期(具体寄存器名请查阅手册确认)
// 在设置 CKCON=1 后,增加等待周期
P_SW2 |= 0x80; // 使能访问 XFR
// 假设有等待周期控制寄存器,增加等待
// 具体寄存器名和位定义请参考 STC32G144K246 数据手册
论坛用户反馈参考
据论坛用户反馈,STC32G 系列中 CKCON 寄存器的设置会影响 MOVX 总线访问速度,当 CKCON=1 时,ALE 被关闭,MOVX 访问时序缩短,可能导致 DMA 与串口 FIFO 之间的握手时序不匹配,从而出现 计数器正确但数据未写入目标地址 的现象。
总结
| 项目 |
说明 |
| 问题根因 |
CKCON=1 改变了总线访问时序(MOVX 周期变短),导致 DMA 写入目标地址时数据未正确锁存,但字节计数器仍正常递增 |
| 推荐方案 |
保持 CKCON=0,这是最简单可靠的解决方式 |
| 备选方案 |
如需 CKCON=1,需增加总线等待周期或重新初始化 DMA |
如果你能提供更多关于为什么需要设置 CKCON=1 的背景信息,我可以给出更有针对性的建议。
🔍 搜索 "https://www.stcaimcu.com/thread-24858-1-1.html"
⏱️ 查找用时 3.0s | 总回答用时 18.6s