1、采用cubemx V6.6.1 生成的MDK工程,勾选“kernal”选择生成的RT Thread ,AD +DMA 8通道采样生成的结果正常。DMA中断,读取采样结果。DMA勾选“连续转换”
采样50HZ 交流信号六路,芯片是STM32F401
2、采用cubemx V6.6.1 生成的工程,
勾选“kernal”
勾选“shell”
勾选“device”
重新生成MDK工程,发现AD +DMA 8通道采样生成的结果不正常。发现有2路交流信号有时是定值,或两种定值波动,其它6路交流信号正常值,DMA优先级为2,是用户线程最高的。
难道“finsh” 不能在这种环境中使用?
哪位遇到过这种情况,
正常:
异常(加载finsh,使用 RTT实时为console)
被中断打扰?被什么中断打扰了?
ADC+DMA,怎么被干扰.连中断都可以不进去
我说的是把DMA配置为单次完成后进中断重新加载DMA表这种写法是会被干扰,有的例子代码就是这么做的。正确的写法是让DMA能自己循环工作,至少分出2个以上数据块多次中断通知取数线程,避免数据被覆盖。这有什么难理解的吗?
还有一种情况即使你的DMA能自循环,但是不配置FIFO,也会被使用同一个DMA控制器的其它DMA在中断时被抢占干扰,因为同一个DMA控制器是一套执行逻辑,会同时管理多个DMA通道,这些DMA通道也要分个优先级,导致低优先级的DMA来不及重装DMA表。@用户名由3_15位
一个DMA控制器是管理多个DMA通道的,当然是被同一个DMA控制器的高优先级通道的DMA中断干扰。@出出啊
我做过的一个例子,同时启动stm32的3个ADC连续DMA工作(不是同一个ADC的3个通道),如果按常规写法把他们使用的DMA通道分配到同一个DMA控制器下根本就不能正常获取数据。
也就是说,3个ADC通道,3个DMA通道,采3个ADC,这样做,是不是效率太低了?是不是说明ADC不适合DMA呀?