cgnlplfc 发表于 2026-7-12 22:03:37

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

32g144k核心板,
开启串口1超时中断和dma串口1自动接收。
超时中断里,执行dma串口1自动发送。
现在问题是ckcon=0时接收和发送都正常,
ckcon=1时出现异常,
异常的现象是dma不能接收到数据,
但是dma接收的数据数量是对的,dma串口1发送正常。

cgnlplfc 发表于 2026-7-12 22:12:13

就是ckcon=0时一切正常,ckcon=1时dma自动接收的目标地址里面的数据不会更新,但是dma接收的数据数量是对的。

神农鼎 发表于 2026-7-12 23:26:07


神农鼎 发表于 2026-7-12 23:26:31

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

神农鼎 发表于 2026-7-12 23:27:19






cgnlplfc 发表于 2026-7-13 00:10:30

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

cgnlplfc 发表于 2026-7-13 00:17:28

就是使用CKCON=1时,会不会有哪些需要注意的地方我没看到。或者这样的话操作dma时哪些地方需要做一些等待?

ercircle 发表于 2026-7-14 15:15:00

“ckcon=1时出现异常,异常的现象是dma不能接收到数据”


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

至于ckcon=1时,其它等待事项?目前未发现需要特殊等待的。
页: [1]
查看完整版本: 请问为何ckcon=1反而有问题