串口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模式了
进入IDLE后,CPU时钟被停止了,无法设置DMA中断标志。需要判断DMA传输完成后再进低功耗模式。 我们目前的时钟比较强大复杂,但是原始的时钟只有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 暂时不要使用 IDLE, 使用等待来代替
相差 1.1mA@11.0592MHz,110uA/MHz
神农鼎 发表于 2024-1-30 11:29
我们目前的时钟比较强大复杂,但是原始的时钟只有2个:
1,CPU clock;是CPU和flash和SFR在用的;
2,外设-I/O ...
应该是这样子的,等有时间了我再试试内存到内存DMA,用一些方法实测可以得到答案 后续的新品 STC8051H, STC32G96K256 已改这部分 神农鼎 发表于 2024-1-30 11:29
我们目前的时钟比较强大复杂,但是原始的时钟只有2个:
1,CPU clock;是CPU和flash和SFR在用的;
2,外设-I/O ...
话说 上述的情况时只存在于STC32G系列单片机中 还是所有拥有DMA的单片机中呢?{:4_267:} 就是 DMA 用哪个时钟的问题,小事,前面的 DMA 不要用不常用的 IDLE 碰到同样的问题
操作系统中定义了PCON=0X01,导致串口DMA出错
页:
[1]
2