打印
[应用相关]

驱动可配置化开发 --- KEY驱动

[复制链接]
307|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本博客中示例代码下载路径: https://github.com/maziot-stm32/A1/releases/tag/v0.7


作者:mz8023yt
链接:https://www.jianshu.com/p/1dc8b8ccdf9c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用特权

评论回复
沙发
condition|  楼主 | 2020-5-10 09:36 | 只看该作者
A1 设备按键原理图

使用特权

评论回复
板凳
condition|  楼主 | 2020-5-10 09:41 | 只看该作者
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;

使用特权

评论回复
地板
condition|  楼主 | 2020-5-10 09:43 | 只看该作者
补充说明:

STM32中断优先级组配置为2位抢占优先级, 2位响应优先级
按键驱动的优先级默认设置为最低优先级

使用特权

评论回复
5
condition|  楼主 | 2020-5-10 09:43 | 只看该作者
添加按键模块配置
基于上述抽象, 添加一个按键模块仅需要增加以下代码:

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);
    }
}

使用特权

评论回复
6
condition|  楼主 | 2020-5-10 09:44 | 只看该作者
添加三个按键模块仅需要增加以下代码:
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);
    }
}

使用特权

评论回复
7
condition|  楼主 | 2020-5-10 09:46 | 只看该作者
代码仓库
仓库路径: https://github.com/maziot-stm32/A1
驱动文件: https://github.com/maziot-stm32/A1/tree/master/MAZ_Drivers/MAZ_Drv_key

作者:mz8023yt
链接:https://www.jianshu.com/p/1dc8b8ccdf9c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用特权

评论回复
8
keaibukelian| | 2020-6-2 16:51 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
labasi| | 2020-6-2 16:51 | 只看该作者
硬件非常简单

使用特权

评论回复
10
paotangsan| | 2020-6-2 16:51 | 只看该作者
非常基础的操作

使用特权

评论回复
11
renzheshengui| | 2020-6-2 16:52 | 只看该作者
楼主辛苦了

使用特权

评论回复
12
wakayi| | 2020-6-2 16:52 | 只看该作者
感谢分享哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

256

帖子

1

粉丝