@@ -23,6 +23,19 @@ void SysTick_Handler(void) {
23
23
QXK_ISR_EXIT (); /* inform QXK about exiting an ISR */
24
24
}
25
25
26
+ void EXTI4_15_IRQHandler (void ); // prototype
27
+ void EXTI4_15_IRQHandler (void ) {
28
+ QXK_ISR_ENTRY (); /* inform QXK about entering an ISR */
29
+
30
+ /* falling edge? */
31
+ if ((EXTI -> FPR1 & (1U << B1_PIN )) != 0U ) {
32
+ EXTI -> FPR1 = (1U << B1_PIN ); /* clear interrupt */
33
+ QXSemaphore_signal (& SW1_sema );
34
+ }
35
+
36
+ QXK_ISR_EXIT (); /* inform QXK about exiting an ISR */
37
+ }
38
+
26
39
void BSP_init (void ) {
27
40
// enable GPIOA clock port for the LEDs
28
41
RCC -> IOPENR |= (1U << 0U );
@@ -37,11 +50,22 @@ void BSP_init(void) {
37
50
GPIOA -> OSPEEDR |= ((1U << 2U * LD4_PIN ) | (1U << 2U * LD5_PIN ));
38
51
GPIOA -> PUPDR &= ~((3U << 2U * LD4_PIN ) | (3U << 2U * LD5_PIN ));
39
52
53
+ // enable GPIOC clock port for the Button B1
54
+ RCC -> IOPENR |= (1U << 2U );
55
+
40
56
// configure Button B1 (PC.13) pins as input, no pull-up, pull-down
41
57
GPIOC -> MODER &= ~(3U << 2 * B1_PIN );
42
58
GPIOC -> OSPEEDR &= ~(3U << 2 * B1_PIN );
43
59
GPIOC -> OSPEEDR |= (1U << 2 * B1_PIN );
44
60
GPIOC -> PUPDR &= ~(3U << 2 * B1_PIN );
61
+
62
+ // configure Button B1 interrupt as falling edge
63
+ EXTI -> EMR1 &= ~(1U << B1_PIN );
64
+ EXTI -> IMR1 |= (1U << B1_PIN );
65
+ EXTI -> RTSR1 &= ~(1U << B1_PIN );
66
+ EXTI -> FTSR1 |= (1U << B1_PIN );
67
+ EXTI -> EXTICR [3 ] &= ~(7U << 8 ); // EXTI port C line 13
68
+ EXTI -> EXTICR [3 ] |= (2U << 8 ); // EXTI port C line 13
45
69
}
46
70
47
71
void BSP_ledRedOn (void ) {
@@ -75,6 +99,10 @@ void QF_onStartup(void) {
75
99
76
100
/* set the SysTick interrupt priority (highest) */
77
101
NVIC_SetPriority (SysTick_IRQn , 0U );
102
+ NVIC_SetPriority (EXTI4_15_IRQn , 0U );
103
+
104
+ /* enable interrupts */
105
+ NVIC_EnableIRQ (EXTI4_15_IRQn );
78
106
}
79
107
/*..........................................................................*/
80
108
void QF_onCleanup (void ) {
0 commit comments