本博客中示例代码下载路径: https://github.com/maziot-stm32/A1/releases/tag/v0.7
A1 设备按键原理图
KEY原理图KEY 驱动可配置化抽象
同样想一下, 按键模块硬件强相关的配置有哪些?
目前我想到的有这些:
/* key handle */
typedef void (*MAZDRV_KEY_HANDLE)(void);
typedef struct _MAZDRV_KEY_CTRL_
{
MAZDRV_GPIO_PORT port; // 连接KEY的GPIO PORT
MAZDRV_GPIO_PIN pin; // 连接KEY的GPIO PIN
MAZDRV_KEY_POLARITY polarity; // 按下后GPIO是高电平还是低电平
MAZDRV_KEY_MODE mode; // 检测方式是中断还是扫描
MAZDRV_KEY_HANDLE handle; // 中断回调函数
} MAZDRV_KEY_CTRL;
补充说明:
- STM32中断优先级组配置为2位抢占优先级, 2位响应优先级
- 按键驱动的优先级默认设置为最低优先级
添加按键模块配置
基于上述抽象, 添加一个按键模块仅需要增加以下代码:
typedef enum _MAZDRV_KEY_
{
MAZDRV_KEY0 = 0,
MAZDRV_KEY_MAX,
} MAZDRV_KEY;
void MAZ_Drv_key0_handle(void);
static MAZDRV_KEY_CTRL g_mazdrv_key_ctrl[MAZDRV_KEY_MAX] =
{
[MAZDRV_KEY0] =
{
.port = MAZDRV_GPIO_PORTC,
.pin = MAZDRV_GPIO_PIN1,
.polarity = MAZDRV_KEY_POLARITY_LOW,
.mode = MAZDRV_KEY_INTERRUPT,
.handle = MAZ_Drv_key0_handle,
},
};
/* Interrupt handler */
void MAZ_Drv_key0_handle(void)
{
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != 0x00u)
{
MAZ_Drv_led_set_status(MAZDRV_LED0, MAZDRV_LED_STATUS_TOGGLE);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
}
}
添加三个按键模块仅需要增加以下代码:
typedef enum _MAZDRV_KEY_
{
MAZDRV_KEY0 = 0,
MAZDRV_KEY1,
MAZDRV_KEY2,
MAZDRV_KEY_MAX,
} MAZDRV_KEY;
void MAZ_Drv_key0_handle(void);
void MAZ_Drv_key1_handle(void);
void MAZ_Drv_key2_handle(void);
static MAZDRV_KEY_CTRL g_mazdrv_key_ctrl[MAZDRV_KEY_MAX] =
{
[MAZDRV_KEY0] =
{
.port = MAZDRV_GPIO_PORTC,
.pin = MAZDRV_GPIO_PIN1,
.polarity = MAZDRV_KEY_POLARITY_LOW,
.mode = MAZDRV_KEY_INTERRUPT,
.handle = MAZ_Drv_key0_handle,
},
[MAZDRV_KEY1] =
{
.port = MAZDRV_GPIO_PORTC,
.pin = MAZDRV_GPIO_PIN13,
.polarity = MAZDRV_KEY_POLARITY_LOW,
.mode = MAZDRV_KEY_INTERRUPT,
.handle = MAZ_Drv_key1_handle,
},
[MAZDRV_KEY2] =
{
.port = MAZDRV_GPIO_PORTA,
.pin = MAZDRV_GPIO_PIN0,
.polarity = MAZDRV_KEY_POLARITY_HIGH,
.mode = MAZDRV_KEY_INTERRUPT,
.handle = MAZ_Drv_key2_handle,
},
};
/* Interrupt handler */
void MAZ_Drv_key0_handle(void)
{
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != 0x00u)
{
MAZ_Drv_led_set_status(MAZDRV_LED0, MAZDRV_LED_STATUS_TOGGLE);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
}
}
void MAZ_Drv_key1_handle(void)
{
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != 0x00u)
{
MAZ_Drv_led_set_status(MAZDRV_LED1, MAZDRV_LED_STATUS_TOGGLE);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
}
}
void MAZ_Drv_key2_handle(void)
{
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != 0x00u)
{
MAZ_Drv_led_set_status(MAZDRV_LED0, MAZDRV_LED_STATUS_TOGGLE);
MAZ_Drv_led_set_status(MAZDRV_LED1, MAZDRV_LED_STATUS_TOGGLE);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
}
}
代码仓库
仓库路径: https://github.com/maziot-stm32/A1
驱动文件: https://github.com/maziot-stm32/A1/tree/master/MAZ_Drivers/MAZ_Drv_key
网友评论