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通過重啟時鍾的方式,寄存器不會歸零,必須人工歸零后才能使用。