stm32 DMA错误无法恢复问题


stm32f446,程序中需要ADC1、ADC3和DAC同时工作。
首先,在此工程的STM32G474版中,使用TIM8同时触发2个AD、一个DA工作,所以在STM32F446版中也使用此策略,结果无法实现。
所以使用了TIM8-trog触发ADC1,TIM8-ch1触发ADC3,TIM6触发DAC输出波形。
 
在长时间运行后,或者反复进出jlink调试,会导致ADC的DMA过程受阻,ADC的OVERRUN位置位,一般清除此位后即可恢复运行
后来DMA数据进一步增加,即使清除OVERRUN位,也不会恢复工作了。
由于此时设备已经发到客户手中,即使能够复现,也无法调试。所以费了很大的劲,通过反复进出调试器的方式复现了错误,然后在调试器中对ADC、DMA等寄存器进行操作。发现此时连续扫描型的ADC并未受影响,仍然通过DMA传出数据。只是定时器触发的ADC阻塞,并且,DMA寄存器不受控了,写入值也不发生变化。
通过复位DMA时钟的方式,才改变了DMA寄存器的值。然后给DMA重新初始化,程序又开始工作了:
1 RCC->AHB1RSTR |= RCC_AHB1Periph_DMA2;
2 RCC->AHB1RSTR &= ~RCC_AHB1Periph_DMA2;
3 RCC->AHB1ENR &= ~RCC_AHB1Periph_DMA2;
4 RCC->AHB1RSTR |= RCC_AHB1Periph_DMA2;
5 RCC->AHB1RSTR &= ~RCC_AHB1Periph_DMA2;

也不知道这个RSTR是在ENR之前还是之后,所以反复写了两遍

但是这个AD用的DMA2,在ADC2上也使用了,所以ADC2也需要重新初始化。结果ADC2通过重启时钟的方式,寄存器不会归零,必须人工归零后才能使用。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM