各位大侠,不知有人碰到过没有,在打开ADC的DMA操作后会严重干扰到中断的问题。
用的芯片是STM32f103,我在调步进电机和ADC。步进电机用定时中断直接驱动,ADC用DMA直接操作,两个模块单独调都没问题,可是只要同时打开,步进电机就无**常转动。只要把DMA关掉就正常了。郁闷中。。。。。是不是STM32的DMA设计有问题,有没有什么好的解决方法。
随便说说 仅供参考
用过别的片子 DMA时数据总线会被占用的 程序假死中
对于STM32 没用过 不懂 请看数据手册
DMA的工作原理是挪用MCU占用总线的时间,临时接管系统总线。
在DMA模块占用总线的时候,如果CPU也需要访问系统总线,CPU就会临时避让,等DMA操作周期结束在继续运行。
你的问题恰好出在这里,估计你的定时中断操作已经基本榨干了CPU的所有时间,或者定时中断内的操作对CPU速度的要求太高。没办法,你必须降低定时中断内的操作对CPU速度的要求。
发现一个问题,当DMA打开时,TIM1的定时脉冲被放大了10倍,原来两个脉冲间隔为1.5ms,打开DMA操作后两个脉冲间隔变为15ms。在MDK中调试时暂时关闭DMA也没有任何效果。
而且此后无论关闭ADC还是DMA,定时器的脉冲间隔都无法变回原来1.5ms,只有修改TIM1-PSC的值才有效。我原来的TIM1-PSC值为0x3f,现在要设置为0xa才行,现在初步怀疑是在初始化DMA操作时影响了Tim1的时钟源,否则不至于我在MDK中关闭了DMA,中断还恢复不了原来的脉冲间隔。
不知大家遇见过上述情况没有。事实上我在同时DMA后Tim1中断后,只好把Tim1的预分频值缩小10后发现中断脉冲又恢复到原来的宽度,说明我的定时中断操作并没有把CPU或总线占死,否则的话应该无论怎么调整定时器定时都不应该能够缩小。