Forum: Mikrocontroller und Digitale Elektronik ARM Interrupt Programmieren


von Raphael K. (wolly300)


Lesenswert?

Hallo zusammen,

ich will mich zusammen mit meinem Buch (STM32 ARM PROGRAMMING FOR 
EMBEDDED SYSTEMS) weiterbilden. Aktuell ich bin im Interrupt Kapitel und 
habe stecke bei einem nicht funktionierenden Code fest. Das Buch ist mit 
der Keil MDK-Arm IDE und dem GCC Compiler geschrieben. Ich programmiere 
jedoch mit der JumpStart C for Cortex-M IDE mit dem ImageCraft Cortex 
Compiler.

Die while-Schleife und damit die blinkende LED funktionieren 
einwandfrei, jedoch wird beim Drücken des Tasters nichts ausgelöst. 
Woran könnte das liegen ?
1
#define STM32F40XX
2
#include <stm32f4xx.h>
3
#inlcude <jsapi.h>
4
#include <stdio.h>
5
6
7
extern void Setup(void);
8
9
void delayMs(int n) {
10
  int i;
11
  for (; n > 0; n--) {
12
    for (i = 0; i < 3195; i++) {
13
    }
14
  }
15
}
16
17
void main(void) {
18
    asm("CPSID i");
19
20
    // Enable Clocks
21
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;            // 0x1       | enable GPIOA clock
22
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;            // 0x4       | enable GPIOC clokc
23
  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;           // 0x4000    | enable SYSCFG clock
24
25
  // configure PA5 for LED
26
  GPIOA->MODER &= ~GPIO_MODER_MODER5;             // 0xC00     | clear pin mode
27
  GPIOA->MODER |=  GPIO_MODER_MODER5_0;           // 0x400     | set pin to output mode
28
29
    // configure PC13 for push button interrupt
30
  GPIOC->MODER &= ~GPIO_MODER_MODER13;            // 0xC000000 | clear pin mode to output mode
31
32
  SYSCFG->EXTICR[3] &= ~SYSCFG_EXTICR4_EXTI13;    // 0xF0      | clear port selection for EXTI13
33
  SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC;  // 0x20      | select port C for EXTI13
34
35
  EXTI->IMR |= EXTI_IMR_MR13;                     // 0x2000    | unmask EXTI13
36
  EXTI->FTSR |= EXTI_IMR_MR13;                    // select falling edge trigger
37
38
  NVIC->ISER[1] = 0x00000100;                     // enable IRQ40 (bit 8 of ISER[1])
39
  NVIC_EnableIRQ(EXTI15_10_IRQn);
40
  asm("CPSIE i");
41
42
  while(1) {
43
    GPIOA->BSRRL = GPIO_BSRR_BS_5;              // 0x20 | LED on
44
        delayMs(50);
45
        GPIOA->BSRRH = GPIO_BSRR_BS_5;              // 0x20 | LED off
46
        delayMs(50);
47
  }
48
}
49
50
void EXTI15_10_IRQHandler(void) {
51
  GPIOA->BSRRL = GPIO_BSRR_BS_5;
52
  delayMs(5000);
53
  GPIOA->BSRRH = GPIO_BSRR_BS_5;
54
  delayMs(5000);
55
  GPIOA->BSRRL = GPIO_BSRR_BS_5;
56
  delayMs(5000);
57
  GPIOA->BSRRH = GPIO_BSRR_BS_5;
58
  delayMs(5000);
59
60
  EXTI->PR = EXTI_PR_PR13;                // 0x2000 | clear interrupt pending flag
61
}

Das ist mein Code der main.c Datei.
Dazu gibt es noch von der IDE aus die handlers.c Datei:
1
#define STM32F40XX
2
#include <stm32f4xx.h>
3
4
// Change to "if 1" if you want to call printf when there is a fault
5
#if 0
6
#define PRINTF(fmt, ...)  printf(fmt, __VA_ARGS__)
7
#else
8
#define PRINTF(fmt, ...)
9
#endif
10
11
#define HANDLER(handler) void handler ##_Handler(void) { PRINTF("%s\n", #handler); while (1); }
12
13
HANDLER(SVC)
14
HANDLER(NMI)
15
HANDLER(MemManage)
16
HANDLER(BusFault)
17
HANDLER(UsageFault)
18
HANDLER(DebugMon)
19
HANDLER(PendSV)
20
// HANDLER(HardFault)
21
22
//this is useful to locate the source of hard fault
23
void yHardFault_Handler(unsigned PC, int arg, unsigned PSR){
24
    PRINTF("Hard Fault PC %x arg %d PSR %x HFSR %x CFSR %x\n", PC, arg, PSR, SCB->HFSR, SCB->CFSR);
25
}

Und die Assembler Datei stm32f4_vectors.s:
1
  .area vectors(rom,rel)
2
__vectors::
3
  ; you must use the .paddr directive so the correct form of the
4
        ; function address (i.e. with the low bit ON) is used
5
  .paddr  _NMI_Handler  ; NMI_Handler
6
  .paddr  _HardFault_Handler  ; HardFault_Handler
7
  .paddr  _MemManage_Handler  ; MemManage_Handler
8
  .paddr  _BusFault_Handler  ; BusFault_Handler
9
  .paddr  _UsageFault_Handler  ; UsageFault_Handler
10
  .long  0      ; ARM RESERVED
11
  .long  0
12
  .long  0
13
  .long  0
14
  .paddr  _SVC_Handler  ; SVC_Handler
15
  .paddr  _DebugMon_Handler  ; DebugMon_Handler
16
  .long  0      ;
17
  .paddr  _PendSV_Handler  ; PendSV_Handler
18
  .paddr  _JSAPI_SysTick_Handler  ; SysTick_Handler
19
  ; IRQ0 to IRQ31
20
  .paddr  _Default_Handler    ; 0
21
  .paddr  _Default_Handler    ; 1
22
  .paddr  _Default_Handler    ; 2
23
  .paddr  _Default_Handler    ; 3
24
  .paddr  _Default_Handler    ; 4
25
  .paddr  _Default_Handler    ; 5
26
  .paddr  _JSAPI_EXTI0_Handler      ; 6
27
  .paddr  _JSAPI_EXTI1_Handler      ; 7
28
    .paddr  _JSAPI_EXTI2_Handler      ; 8
29
  .paddr  _JSAPI_EXTI3_Handler      ; 9
30
  .paddr  _JSAPI_EXTI4_Handler      ; 10
31
  .paddr  _Default_Handler    ; 11
32
  .paddr  _Default_Handler    ; 12
33
  .paddr  _Default_Handler    ; 13
34
  .paddr  _Default_Handler    ; 14
35
  .paddr  _Default_Handler    ; 15
36
  .paddr  _Default_Handler    ; 16
37
  .paddr  _Default_Handler    ; 17
38
  .paddr  _Default_Handler    ; 18
39
  .paddr  _Default_Handler    ; 19
40
  .paddr  _Default_Handler    ; 20
41
  .paddr  _Default_Handler    ; 21
42
  .paddr  _Default_Handler    ; 22
43
  .paddr  _JSAPI_EXTI9_5_Handler      ; 23
44
  .paddr  _Default_Handler    ; 24
45
  .paddr  _JSAPI_TIM1_UP_TIM10_Handler; 25
46
  .paddr  _Default_Handler    ; 26
47
  .paddr  _Default_Handler    ; 27
48
  .paddr  _Default_Handler    ; 28
49
  .paddr  _Default_Handler    ; 29
50
  .paddr  _Default_Handler    ; 30
51
  .paddr  _JSAPI_I2C1_EV_Handler      ; 31
52
  .paddr  _Default_Handler    ; 32
53
  .paddr  _JSAPI_I2C2_EV_Handler      ; 33
54
  .paddr  _Default_Handler    ; 34
55
  .paddr  _Default_Handler    ; 35
56
  .paddr  _Default_Handler    ; 36
57
  .paddr  _JSAPI_USART1_IntrHandler   ; 37
58
  .paddr  _JSAPI_USART2_IntrHandler   ; 38
59
  .paddr  _JSAPI_USART3_IntrHandler   ; 39
60
  .paddr  _JSAPI_EXTI15_10_Handler    ; 40
61
  .paddr  _Default_Handler    ; 41
62
  .paddr  _Default_Handler    ; 42
63
  .paddr  _Default_Handler    ; 43
64
  .paddr  _Default_Handler    ; 44
65
  .paddr  _Default_Handler    ; 45
66
  .paddr  _Default_Handler    ; 46
67
  .paddr  _Default_Handler    ; 47
68
  .paddr  _Default_Handler    ; 48
69
  .paddr  _Default_Handler    ; 49
70
  .paddr  _Default_Handler    ; 50
71
  .paddr  _Default_Handler    ; 51
72
  .paddr  _JSAPI_USART4_IntrHandler    ; 52
73
  .paddr  _JSAPI_USART5_IntrHandler    ; 53
74
  .paddr  _Default_Handler    ; 54
75
  .paddr  _Default_Handler    ; 55
76
  .paddr  _Default_Handler    ; 56
77
  .paddr  _Default_Handler    ; 57
78
  .paddr  _Default_Handler    ; 58
79
  .paddr  _Default_Handler    ; 59
80
  .paddr  _Default_Handler    ; 60
81
  .paddr  _Default_Handler    ; 61
82
  .paddr  _Default_Handler    ; 62
83
  .paddr  _Default_Handler    ; 63
84
  .paddr  _Default_Handler    ; 64
85
  .paddr  _Default_Handler    ; 65
86
  .paddr  _Default_Handler    ; 66
87
  .paddr  _Default_Handler    ; 67
88
  .paddr  _Default_Handler    ; 68
89
  .paddr  _Default_Handler    ; 69
90
  .paddr  _Default_Handler    ; 70
91
  .paddr  _JSAPI_USART6_IntrHandler   ; 71
92
  .paddr  _JSAPI_I2C3_EV_Handler      ; 72
93
  .paddr  _Default_Handler    ; 73
94
  .paddr  _Default_Handler    ; 74
95
  .paddr  _Default_Handler    ; 75
96
  .paddr  _Default_Handler    ; 76
97
  .paddr  _Default_Handler    ; 77
98
  .paddr  _Default_Handler    ; 78
99
  .paddr  _Default_Handler    ; 79
100
  .paddr  _Default_Handler    ; 80
101
  .paddr  _Default_Handler    ; 81
102
  .paddr  _JSAPI_USART7_IntrHandler   ; 82
103
  .paddr  _JSAPI_USART8_IntrHandler   ; 83
104
105
  .area text(rom,con)
106
_HardFault_Handler::
107
    mov R1,#0
108
    tst     LR,#4
109
    bne    .ne
110
    mrs   r12,msp
111
    mvn R1,#0
112
    b       .next
113
.ne:
114
    mrs   r12,psp
115
.next:
116
    ldr     r0,[r12,#24]    ; stacked pc
117
    ldr     r2,[r12,#28]    ; psr
118
    b       _yHardFault_Handler

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.