Hallo zusammen,
ich bin gerade mit meinem Latein am Ende, obwohl das Beispiel, das den
Fehler erzeugt, wirklich minimal ist:
Und zwar landet ein STM32F103RE beim folgenden Beispiel direkt im
HardFault-Handler, ein STM32F446 fühlt sich dagegen pudelwohl:
1 | #define SYSTICK_TIMER_INTERVAL_MS 1
|
2 |
|
3 | #ifdef STM32F4XX
|
4 | #define SYSTEMCORECLOCK 168000000ULL
|
5 | #elif defined( STM32F10x )
|
6 | #define SYSTEMCORECLOCK 72000000ULL
|
7 | #endif
|
8 |
|
9 |
|
10 | int main(void)
|
11 | {
|
12 | // Timer und Interrupt-Prioritaeten einstellen
|
13 |
|
14 |
|
15 |
|
16 | #if defined( STM32F4XX ) || defined( STM32F10x )
|
17 | #if defined( STM32F4XX )
|
18 | #define HIGHSPEED_TIMER_IRQn TIM6_DAC_IRQn
|
19 | #elif defined( STM32F10x )
|
20 | #define HIGHSPEED_TIMER_IRQn TIM4_IRQn
|
21 | #endif
|
22 |
|
23 |
|
24 | SystemInit();
|
25 | SysTick_Config(SystemCoreClock/1000*(SYSTICK_TIMER_INTERVAL_MS));
|
26 | assert( SystemCoreClock == SYSTEMCORECLOCK );
|
27 |
|
28 | uint32_t savectrl = SysTick->CTRL;
|
29 | SysTick->CTRL = 0; // SysTick-IRQ deaktivieren
|
30 | //NVIC_DisableIRQ(SysTick_IRQn); funktioniert nicht
|
31 |
|
32 |
|
33 | // NVIC/ISRs konfigurieren
|
34 | NVIC_PriorityGroupConfig(0);
|
35 |
|
36 | NVIC_SetPriority(PendSV_IRQn, 2);
|
37 | NVIC_SetPriority(SysTick_IRQn, 1);
|
38 | NVIC_SetPriority(HIGHSPEED_TIMER_IRQn, 0);
|
39 |
|
40 | //FIXME: Enablen der IRQs landet am STM32F103RE sofort im Hard Fault Handler - und
|
41 | // ich habe keine Ahnung warum
|
42 | NVIC_EnableIRQ(HIGHSPEED_TIMER_IRQn);
|
43 | NVIC_EnableIRQ(PendSV_IRQn);
|
44 |
|
45 | // SysTick wieder einschalten
|
46 |
|
47 | SysTick->CTRL = savectrl; // <========= DAAAAAAAAAAA
|
48 |
|
49 |
|
50 |
|
51 | while(1);
|
52 | #endif
|
53 | return 1;
|
54 | }
|
Die ISRs für PENDSV-Handler, SysTick-Handler und Timer-ISR sind
definiert, werden aber noch nicht einmal angesprungen.
Was habe ich übersehen?
Viele Grüße
W.T.