Reset MCU STM32 przez DMA: diagnostyka i korekty firmware
/pomiary/mcu-reset-dma-diagnostyka-fw • STM32F103 / STM32F4xx • DMA, USART, ADC • moduły AGD
1. Zakres i cel
Analiza dotyczy blokad magistrali i resetów MCU wywoływanych konfliktami DMA, ISR i błędami ORE/FE na USART/ADC. Celem jest optymalizacja priorytetów NVIC, użycie podwójnych buforów DMA oraz atomizacja sekcji krytycznych.
2. Objawy i sygnatury
2.1 Telemetria
[00:12.417] WDG: IWDG timeout (Δt kick=2.060s) [00:12.418] RCC_CSR: IWDGRSTF=1, BORRSTF=0, SFTRSTF=0 [00:12.420] USART1: ORE=1, FE=0 | DMA1_CH5 rx_half=12 rx_full=12 [00:12.700] Q: parser stalled 300 ms → soft reset queue
2.2 Wzorce
- Opóźnienie głównej pętli w okolicy wyzwalania EXTI/ZCD.
- Brak progresu wskaźników DMA (rx_half/rx_full stałe).
- Kaskadowe CRC mismatch po jednorazowym ORE.
3. NVIC, DMA i ISR
| Źródło | Priorytet | Uwagi |
|---|---|---|
| EXTI0 (ZCD) | 0 | nieprzerywalne, minimalna sekcja |
| TIM1_UP | 1 | przeliczenia PWM, ISR skrócone |
| DMA_RX (USART) | 2 | tryb DBM + HT/TC callback |
| USART | 3 | czytaj SR → DR, obsługa ORE |
| ADC_DMA | 2 | bufor 2×64; kopiowanie poza ISR |
Uwaga: Na STM32F4 włącz
DMA_SxCR.DBM=1 (double-buffer mode). Nie resetuj CNDTR przy EN=1.
// swap banków DMA (poprawny) __set_BASEPRI(0x30); // maskuj <=2 active ^= 1; DMA1_Stream5->NDTR = 128; __DSB(); __ISB(); __set_BASEPRI(0);
4. Zrzuty rejestrów i logi
USART1_SR=0x0020 (ORE=1); DMA1_CNDTR5=0x0000; DMA1_CCR5=0x0001 (EN=1) ADC1_SR=0x0002 (EOC=1); DMA1_CNDTR1=0x0040; TIM1_SR=0x0001 (UIF=1) SCB_HFSR=0x00000000; CFSR=0x00000000; BFAR=0x00000000
Brak hard-faultów potwierdza blokadę DMA + spadek priorytetu ISR odświeżającego IWDG. Korelacje z BORRSTF → sekcja 5.
5. Korelacje EMI/BOR
- Krótsza skrętka RX/GND ≤20 cm zmniejsza ORE; ferryt + 33–68 Ω w szereg redukuje szpilki.
- Zapady Vcc przy starcie kompresora → dodać 1000–2200 µF na linii 12 V.
- EMI z falownika (0.5–5 MHz) → filtr LC w zasilaniu falownika zmniejsza ryzyko DMA lock.
6. Poprawki firmware
- Kick IWDG w SysTick lub osobnym timerze.
- Swap banków DMA w DBM + sekcja krytyczna ≤10 µs.
- Parser stanowy: walidacja LEN + CRC przed akceptacją.
- Watchdog kolejki parsera 250–300 ms → reset bufora.
- Backoff 2–7 ms po AF/ARLO, max. 3 próby, log zdarzeń.
// watchdog parsera
if (now_ms - last_progress_ms > 300) {
q_reset();
stat.wdg_q++;
}
7. Kryteria akceptacji
| Kryterium | Cel | Po korektach |
|---|---|---|
| Resety/tydzień (XBL-400) | ≤10 | 8.9 |
| DMA_LOCK na 10⁵ ramek | <0.5% | 0.28% |
| Kick jitter RMS | <1.5 ms | 0.9 ms |
| CRC_MISMATCH | <5% | 1.8–3.2% |
8. Uwagi serwisowe
Korekty potwierdzono w testach modułów AGD. Zaleca się logowanie przyczyn resetów (RCC_CSR, SCB_HFSR) i reset flag po starcie, np. RCC->CSR |= RCC_CSR_RMVF. Implementacja PVD zalecana w środowiskach z falownikiem.