kw38点灯大师2_GPIO中断

kw38点灯大师2_GPIO中断

frdmkw38_gpio_led_output 工程 frdmkw38_gpio_input_interrupt 工程

light

主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
int main(void)
{
/* Define the init structure for the output LED pin*/
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput,
0,
};

/* Define the init structure for the input switch pin */
gpio_pin_config_t sw_config = {
kGPIO_DigitalInput,
0,
};

/* Board pin, clock, debug console init */
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();

/* Print a note to terminal. */
PRINTF("\r\n GPIO Driver example\r\n");
PRINTF("\r\n The LED is blinking.\r\n");
PRINTF("\r\n 按压开关 %s 来开关和切换LED.\r\n", BOARD_SW_NAME);

/* Init input switch GPIO. */
#if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT)
GPIO_SetPinInterruptConfig(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PIN, kGPIO_InterruptFallingEdge);
#else
PORT_SetPinInterruptConfig(BOARD_SW2_PORT, BOARD_SW2_GPIO_PIN, kPORT_InterruptFallingEdge);
#endif
EnableIRQ(BOARD_SW2_IRQ);
GPIO_PinInit(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PIN, &sw_config);

/* Init output LED GPIO. */
GPIO_PinInit(BOARD_LED_GPIO0, BOARD_LED_GPIO_PIN0, &led_config);
GPIO_PinInit(BOARD_LED_GPIO1, BOARD_LED_GPIO_PIN1, &led_config);
GPIO_PinInit(BOARD_LED_GPIO2, BOARD_LED_GPIO_PIN2, &led_config);

uint32_t temp = 0;
while (1)
{
if (g_ButtonPress)
{
temp ++;
PRINTF(" %s is pressed, it is time: %d \r\n", BOARD_SW_NAME, temp);
switch(temp%3)
{
case 0:
PRINTF(" case 0, BLUE LED ON");
LED_RED_OFF();
LED_GREEN_OFF();
LED_BLUE_ON();
break;
case 1:
PRINTF(" case 1, GREEN LED ON");
LED_RED_OFF();
LED_GREEN_ON();
LED_BLUE_OFF();
break;
case 2:
PRINTF(" case 2, RED LED ON");
LED_RED_ON();
LED_GREEN_OFF();
LED_BLUE_OFF();
break;
}
// /* Toggle LED. */
// GPIO_PortToggle(BOARD_LED_GPIO, 1U << BOARD_LED_GPIO_PIN);
// /* Reset state of button. */
g_ButtonPress = false;
}
}
}

中断处理函数

1
2
3
4
5
6
7
8
9
10
11
12
void BOARD_SW2_IRQ_HANDLER()
{
/* Clear external interrupt flag. */
GPIO_PortClearInterruptFlags(BOARD_SW2_GPIO, 1U << BOARD_SW2_GPIO_PIN);
/* Change state of button. */
g_ButtonPress = true;
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
exception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U)
__DSB();
#endif
}

预定义

1
2
3
4
5
6
7
8
9
10
#define BOARD_LED_GPIO0 BOARD_LED_RED_GPIO
#define BOARD_LED_GPIO_PIN0 BOARD_LED_RED_GPIO_PIN

#define BOARD_LED_GPIO1 BOARD_LED_GREEN_GPIO
#define BOARD_LED_GPIO_PIN1 BOARD_LED_GREEN_GPIO_PIN

#define BOARD_LED_GPIO2 BOARD_LED_BLUE_GPIO
#define BOARD_LED_GPIO_PIN2 BOARD_LED_BLUE_GPIO_PIN

#define BOARD_SW_NAME BOARD_SW2_NAME

总结GPIO中断的流程

  1. 变量flag volatile bool g_ButtonPress = false; 指示是否按下开关
  2. 中断处理函数 void BOARD_SW2_IRQ_HANDLER()
    1. 先清空外部中断,GPIO_PortClearInterruptFlags(BOARD_SW2_GPIO, 1U << BOARD_SW2_GPIO_PIN);
    2. 再对flag置一,表示中断已经发生;
    3. 之后,它会进入到main的while循环里面的if(g_ButtonPress);
  3. main函数里面初始化板子之后,要初始化SW的GPIO;
    1. 中断config设置 GPIO_SetPinInterruptConfig(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PIN, kGPIO_InterruptFallingEdge);;
    2. GPIO_PinInit GPIO_PinInit(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PIN, &sw_config);
  4. 然后 EnableIRQ(BOARD_SW2_IRQ);
作者

Gavin

发布于

2023-03-29

更新于

2023-03-29

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×