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łoPriorytetUwagi
EXTI0 (ZCD)0nieprzerywalne, minimalna sekcja
TIM1_UP1przeliczenia PWM, ISR skrócone
DMA_RX (USART)2tryb DBM + HT/TC callback
USART3czytaj SR → DR, obsługa ORE
ADC_DMA2bufor 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

  1. Kick IWDG w SysTick lub osobnym timerze.
  2. Swap banków DMA w DBM + sekcja krytyczna ≤10 µs.
  3. Parser stanowy: walidacja LEN + CRC przed akceptacją.
  4. Watchdog kolejki parsera 250–300 ms → reset bufora.
  5. 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

KryteriumCelPo korektach
Resety/tydzień (XBL-400)≤108.9
DMA_LOCK na 10⁵ ramek<0.5%0.28%
Kick jitter RMS<1.5 ms0.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.