tzz1983 发表于 2024-1-29 16:24:14

串口DMA遇到一个奇怪的问题?

本帖最后由 tzz1983 于 2024-2-1 13:42 编辑

芯片型号: STC32G12K128   
使用场景:UART1   DMA模式收发, 允许DMA中断, 不允许UART1中断。
使用uCOS-ii ,进入空闲任务后会执行挂起CPU,如下指令:

PCON|=0X01;   //IDL
_nop_();_nop_();_nop_();_nop_();

添加这两句后串口就工作不正常了,去掉这两句又可以恢复正常.除串口外别的设备都正常运行,ADC,TIM等不受影响。

按道理来说DMA属于外设,应该不受IDLE影响. 本人怀疑DMA是不是依赖CPU时钟.

不死心, 又尝试了打开串口中断,添加中断函数如下: (因为还是DMA传输,所以只是允许串口中断,只清标志,没有其它有效代码)
void UART1_ISR_Handler (void) interrupt UART1_VECTOR
{
    TI=RI=0;
}

当允许串口中断时,串口工作又正常了,我的理解是串口中断激活了CPU时钟,所以DMA又工作了.

现在是: 假如我的理解是正确的话, 那么DMA运行逻辑是不是该说明一下,或者说这是一个硬件BUG?   还是说当使用片上外设DMA时,就不能进IDLE模式了


乘风飞扬 发表于 2024-1-30 11:02:57

进入IDLE后,CPU时钟被停止了,无法设置DMA中断标志。需要判断DMA传输完成后再进低功耗模式。

神农鼎 发表于 2024-1-30 11:29:47

我们目前的时钟比较强大复杂,但是原始的时钟只有2个:
1,CPU clock;是CPU和flash和SFR在用的;
2,外设-I/O clock; 是 外设-I/O 在用的;

当进入IDLE mode后, CPU clock 被停止/不给CPU供应时钟,
而 外设-I/O clock 会继续。

估计 DMA-外设 用到了 CPU 时钟,没彻底使用 外设-I/O clock

神农鼎 发表于 2024-1-30 11:34:48

暂时不要使用 IDLE, 使用等待来代替
相差 1.1mA@11.0592MHz,110uA/MHz



tzz1983 发表于 2024-1-30 15:38:03

神农鼎 发表于 2024-1-30 11:29
我们目前的时钟比较强大复杂,但是原始的时钟只有2个:
1,CPU clock;是CPU和flash和SFR在用的;
2,外设-I/O ...

应该是这样子的,等有时间了我再试试内存到内存DMA,用一些方法实测可以得到答案

神农鼎 发表于 2024-1-30 16:57:32

后续的新品 STC8051H, STC32G96K256 已改这部分

_奶咖君_ 发表于 2024-1-30 17:03:18

神农鼎 发表于 2024-1-30 11:29
我们目前的时钟比较强大复杂,但是原始的时钟只有2个:
1,CPU clock;是CPU和flash和SFR在用的;
2,外设-I/O ...

话说 上述的情况时只存在于STC32G系列单片机中 还是所有拥有DMA的单片机中呢?{:4_267:}

神农鼎 发表于 2024-1-30 17:14:13

就是 DMA 用哪个时钟的问题,小事,前面的 DMA 不要用不常用的 IDLE

单片机小白 发表于 2024-4-16 09:13:11

碰到同样的问题

单片机小白 发表于 2024-4-16 09:15:00

操作系统中定义了PCON=0X01,导致串口DMA出错
页: [1] 2
查看完整版本: 串口DMA遇到一个奇怪的问题?