参考:
正点原子EXTI
源码下载
功能说明
EXTI
支持的外部请求
与引脚的对应关系
EXTI配置步骤
hal库EXTI配置步骤
hal库EXTI配置中自动配置好afio时钟、中断线映射和EXTI屏蔽
EXTI中断号
EXTI中断函数位置
常用函数
开启时钟
1
| __HAL_RCC_GPIOX_CLK_ENABLE()
|
初始化引脚
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
| GPIO_InitTypeDef gpio_init_struct; gpio_init_struct.Pin = GPIO_PIN_X; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOX, &gpio_init_struct);
|
改写引脚
1 2 3 4
| HAL_GPIO_WritePin(GPIOX, GPIO_PIN_X, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOX, GPIO_PIN_X, GPIO_PIN_RESET);
HAL_GPIO_TogglePin(GPIOX, GPIO_PIN_X);
|
读取引脚
1
| HAL_GPIO_ReadPin(GPIOX, GPIO_PIN_X);
|
应用示例
控制led闪烁
宏定义:
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
|
#define LED0_GPIO_PORT GPIOA #define LED0_GPIO_PIN GPIO_PIN_0 #define LED0_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)
#define LED1_GPIO_PORT GPIOA #define LED1_GPIO_PIN GPIO_PIN_1 #define LED1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)
#define LED0(x) do{ x ? \ HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET) : \ HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET); \ }while(0)
#define LED1(x) do{ x ? \ HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) : \ HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET); \ }while(0)
#define LED0_TOGGLE() do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); }while(0) #define LED1_TOGGLE() do{ HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN); }while(0)
|
初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void led_init(void) { GPIO_InitTypeDef gpio_init_struct; LED0_GPIO_CLK_ENABLE(); LED1_GPIO_CLK_ENABLE();
gpio_init_struct.Pin = LED0_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LED0_GPIO_PORT, &gpio_init_struct);
gpio_init_struct.Pin = LED1_GPIO_PIN; HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);
LED0(1); LED1(1); }
|
主函数:
1 2 3 4 5 6
| while(1) { delay_ms(500); LED0_TOGGLE(); LED1_TOGGLE(); }
|
按键控制led
宏定义:
1 2 3 4 5 6 7 8 9 10 11 12
| #define KEY0_GPIO_PORT GPIOB #define KEY0_GPIO_PIN GPIO_PIN_1 #define KEY0_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) #define KEY1_GPIO_PORT GPIOB #define KEY1_GPIO_PIN GPIO_PIN_11 #define KEY1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)
#define KEY0 HAL_GPIO_ReadPin(KEY0_GPIO_PORT, KEY0_GPIO_PIN) #define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_PORT, KEY1_GPIO_PIN)
#define KEY0_PRES 1 #define KEY1_PRES 2
|
初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void key_init(void) { GPIO_InitTypeDef gpio_init_struct; KEY0_GPIO_CLK_ENABLE(); KEY1_GPIO_CLK_ENABLE();
gpio_init_struct.Pin = KEY0_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_INPUT; gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(KEY0_GPIO_PORT, &gpio_init_struct);
gpio_init_struct.Pin = KEY1_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_INPUT; gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(KEY1_GPIO_PORT, &gpio_init_struct); }
|
按键扫描函数:
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
|
uint8_t key_scan(uint8_t mode) { static uint8_t key_up = 1; uint8_t keyval = 0;
if (mode) key_up = 1;
if (key_up && (KEY0 == 0 || KEY1 == 0)) { delay_ms(10); key_up = 0;
if (KEY0 == 0) keyval = KEY0_PRES;
if (KEY1 == 0) keyval = KEY1_PRES; } else if (KEY0 == 1 && KEY1 == 1) { key_up = 1; }
return keyval; }
|
主函数:
1 2 3 4 5 6
| while(1) { uint8_t keyval = key_scan(0); if(keyval == KEY0_PRES) LED0_TOGGLE(); else if(keyval == KEY1_PRES) LED1_TOGGLE(); }
|
EXTI外部中断控制led
宏定义:
1 2 3 4 5 6 7 8 9 10 11
| #define KEY0_INT_GPIO_PORT GPIOB #define KEY0_INT_GPIO_PIN GPIO_PIN_1 #define KEY0_INT_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) #define KEY0_INT_IRQn EXTI1_IRQn #define KEY0_INT_IRQHandler EXTI1_IRQHandler
#define KEY1_INT_GPIO_PORT GPIOB #define KEY1_INT_GPIO_PIN GPIO_PIN_11 #define KEY1_INT_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) #define KEY1_INT_IRQn EXTI15_10_IRQn #define KEY1_INT_IRQHandler EXTI15_10_IRQHandler
|
初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| void extix_init(void) { GPIO_InitTypeDef gpio_init_struct;
KEY0_GPIO_CLK_ENABLE(); KEY1_GPIO_CLK_ENABLE();
gpio_init_struct.Pin = KEY0_INT_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(KEY0_INT_GPIO_PORT, &gpio_init_struct);
gpio_init_struct.Pin = KEY1_INT_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(KEY1_INT_GPIO_PORT, &gpio_init_struct); HAL_NVIC_SetPriority(KEY0_INT_IRQn, 0, 2); HAL_NVIC_EnableIRQ(KEY0_INT_IRQn);
HAL_NVIC_SetPriority(KEY1_INT_IRQn, 1, 2); HAL_NVIC_EnableIRQ(KEY1_INT_IRQn); }
|
中断函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
void KEY0_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY0_INT_GPIO_PIN); __HAL_GPIO_EXTI_CLEAR_IT(KEY0_INT_GPIO_PIN); }
void KEY1_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY1_INT_GPIO_PIN); __HAL_GPIO_EXTI_CLEAR_IT(KEY1_INT_GPIO_PIN); }
|
回调函数:
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
|
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { delay_ms(20); switch(GPIO_Pin) { case KEY0_INT_GPIO_PIN: if (KEY0 == 0) { LED0_TOGGLE(); LED1_TOGGLE(); } break; case KEY1_INT_GPIO_PIN: if (KEY1 == 0) { LED0_TOGGLE(); } break; } }
|