找回密码
 立即注册
查看: 77|回复: 7

请问为何ckcon=1反而有问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-07-13 00:10:30
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2026-7-12 22:03:37 | 显示全部楼层 |阅读模式
32g144k核心板,
开启串口1超时中断和dma串口1自动接收。
超时中断里,执行dma串口1自动发送。
现在问题是ckcon=0时接收和发送都正常,
ckcon=1时出现异常,
异常的现象是dma不能接收到数据,
但是dma接收的数据数量是对的,dma串口1发送正常。

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-07-13 00:10:30
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2026-7-12 22:12:13 | 显示全部楼层
就是ckcon=0时一切正常,ckcon=1时dma自动接收的目标地址里面的数据不会更新,但是dma接收的数据数量是对的。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2026-7-12 23:26:07 | 显示全部楼层
截图202607122326036904.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2026-7-12 23:26:31 | 显示全部楼层

好的,我已经看到了这个帖子。这是一个关于 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,请尝试以下措施:

  1. 在 DMA 启动前插入适当的等待周期,确保总线时序稳定后再启动 DMA 传输。
  2. 检查 DMA 配置中的总线访问等待设置,看是否有相关寄存器可以调整。
  3. 在设置 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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2026-7-12 23:27:19 | 显示全部楼层

截图202607122327487135.jpg


截图202607122327146493.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-07-13 00:10:30
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2026-7-13 00:10:30 | 显示全部楼层
目前只是测试,后面加入别的程序担心出现cpu与dma会同时访问到xdata。如官方文档所说,将CKCON=1可以完美解决。但没看到这样做会不会有别的弊端。
又测试了官方的串口dma通讯例程,也有几率出现类似的问题,主要在重启后有时会出现,如果出现的话每次发送都会出现(除非重启)。官方的例程是串口助手发送什么数据,CKCON=1,单片机就返回什么数据,有时重启后发送数据后并不是返回发送的数据,返回的都是初始化时的数据,不会更新。之后串口助手每次发送都是一样,返回的都是初始化的值,但是返回字节数会和发送的字节数一样。将CKCON=0就不会出现。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-07-13 00:10:30
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2026-7-13 00:17:28 | 显示全部楼层
就是使用CKCON=1时,会不会有哪些需要注意的地方我没看到。或者这样的话操作dma时哪些地方需要做一些等待?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:604
  • 最近打卡:2026-07-22 08:56:28
已绑定手机

115

主题

4992

回帖

1万

积分

超级版主

无情的代码机器

积分
10893
发表于 2026-7-14 15:15:00 | 显示全部楼层
“ckcon=1时出现异常,异常的现象是dma不能接收到数据”


此处应打包上传问题工程。

至于ckcon=1时,其它等待事项?目前未发现需要特殊等待的。
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-22 09:10 , Processed in 0.073853 second(s), 74 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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