[应用相关] 驱动可配置化开发 --- KEY驱动

[复制链接]
480|11
 楼主| condition 发表于 2020-5-10 09:36 | 显示全部楼层 |阅读模式
本博客中示例代码下载路径: https://github.com/maziot-stm32/A1/releases/tag/v0.7


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

 楼主| condition 发表于 2020-5-10 09:36 | 显示全部楼层
A1 设备按键原理图
308725eb75aa6c24de.png
 楼主| condition 发表于 2020-5-10 09:41 | 显示全部楼层
KEY 驱动可配置化抽象
同样想一下, 按键模块硬件强相关的配置有哪些?
目前我想到的有这些:
  1. /* key handle */
  2. typedef void (*MAZDRV_KEY_HANDLE)(void);

  3. typedef struct _MAZDRV_KEY_CTRL_
  4. {
  5.     MAZDRV_GPIO_PORT port;                  // 连接KEY的GPIO PORT
  6.     MAZDRV_GPIO_PIN pin;                    // 连接KEY的GPIO PIN
  7.     MAZDRV_KEY_POLARITY polarity;           // 按下后GPIO是高电平还是低电平
  8.     MAZDRV_KEY_MODE mode;                   // 检测方式是中断还是扫描
  9.     MAZDRV_KEY_HANDLE handle;               // 中断回调函数
  10. } MAZDRV_KEY_CTRL;
 楼主| condition 发表于 2020-5-10 09:43 | 显示全部楼层
补充说明:

STM32中断优先级组配置为2位抢占优先级, 2位响应优先级
按键驱动的优先级默认设置为最低优先级
 楼主| condition 发表于 2020-5-10 09:43 | 显示全部楼层
添加按键模块配置
基于上述抽象, 添加一个按键模块仅需要增加以下代码:

  1. typedef enum _MAZDRV_KEY_
  2. {
  3.     MAZDRV_KEY0 = 0,
  4.     MAZDRV_KEY_MAX,
  5. } MAZDRV_KEY;

  6. void MAZ_Drv_key0_handle(void);

  7. static MAZDRV_KEY_CTRL g_mazdrv_key_ctrl[MAZDRV_KEY_MAX] =
  8. {
  9.     [MAZDRV_KEY0] =
  10.     {
  11.         .port       = MAZDRV_GPIO_PORTC,
  12.         .pin        = MAZDRV_GPIO_PIN1,
  13.         .polarity   = MAZDRV_KEY_POLARITY_LOW,
  14.         .mode       = MAZDRV_KEY_INTERRUPT,
  15.         .handle     = MAZ_Drv_key0_handle,
  16.     },
  17. };

  18. /* Interrupt handler */
  19. void MAZ_Drv_key0_handle(void)
  20. {
  21.     if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != 0x00u)
  22.     {
  23.         MAZ_Drv_led_set_status(MAZDRV_LED0, MAZDRV_LED_STATUS_TOGGLE);
  24.         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
  25.     }
  26. }
 楼主| condition 发表于 2020-5-10 09:44 | 显示全部楼层
添加三个按键模块仅需要增加以下代码:
  1. typedef enum _MAZDRV_KEY_
  2. {
  3.     MAZDRV_KEY0 = 0,
  4.     MAZDRV_KEY1,
  5.     MAZDRV_KEY2,
  6.     MAZDRV_KEY_MAX,
  7. } MAZDRV_KEY;

  8. void MAZ_Drv_key0_handle(void);
  9. void MAZ_Drv_key1_handle(void);
  10. void MAZ_Drv_key2_handle(void);

  11. static MAZDRV_KEY_CTRL g_mazdrv_key_ctrl[MAZDRV_KEY_MAX] =
  12. {
  13.     [MAZDRV_KEY0] =
  14.     {
  15.         .port       = MAZDRV_GPIO_PORTC,
  16.         .pin        = MAZDRV_GPIO_PIN1,
  17.         .polarity   = MAZDRV_KEY_POLARITY_LOW,
  18.         .mode       = MAZDRV_KEY_INTERRUPT,
  19.         .handle     = MAZ_Drv_key0_handle,
  20.     },
  21.     [MAZDRV_KEY1] =
  22.     {
  23.         .port       = MAZDRV_GPIO_PORTC,
  24.         .pin        = MAZDRV_GPIO_PIN13,
  25.         .polarity   = MAZDRV_KEY_POLARITY_LOW,
  26.         .mode       = MAZDRV_KEY_INTERRUPT,
  27.         .handle     = MAZ_Drv_key1_handle,
  28.     },
  29.     [MAZDRV_KEY2] =
  30.     {
  31.         .port       = MAZDRV_GPIO_PORTA,
  32.         .pin        = MAZDRV_GPIO_PIN0,
  33.         .polarity   = MAZDRV_KEY_POLARITY_HIGH,
  34.         .mode       = MAZDRV_KEY_INTERRUPT,
  35.         .handle     = MAZ_Drv_key2_handle,
  36.     },
  37. };

  38. /* Interrupt handler */
  39. void MAZ_Drv_key0_handle(void)
  40. {
  41.     if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != 0x00u)
  42.     {
  43.         MAZ_Drv_led_set_status(MAZDRV_LED0, MAZDRV_LED_STATUS_TOGGLE);
  44.         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
  45.     }
  46. }

  47. void MAZ_Drv_key1_handle(void)
  48. {
  49.     if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != 0x00u)
  50.     {
  51.         MAZ_Drv_led_set_status(MAZDRV_LED1, MAZDRV_LED_STATUS_TOGGLE);
  52.         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
  53.     }
  54. }

  55. void MAZ_Drv_key2_handle(void)
  56. {
  57.     if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != 0x00u)
  58.     {
  59.         MAZ_Drv_led_set_status(MAZDRV_LED0, MAZDRV_LED_STATUS_TOGGLE);
  60.         MAZ_Drv_led_set_status(MAZDRV_LED1, MAZDRV_LED_STATUS_TOGGLE);
  61.         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
  62.     }
  63. }
 楼主| 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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
keaibukelian 发表于 2020-6-2 16:51 | 显示全部楼层
非常感谢楼主分享
labasi 发表于 2020-6-2 16:51 | 显示全部楼层
硬件非常简单
paotangsan 发表于 2020-6-2 16:51 | 显示全部楼层
非常基础的操作
renzheshengui 发表于 2020-6-2 16:52 | 显示全部楼层
楼主辛苦了
wakayi 发表于 2020-6-2 16:52 | 显示全部楼层
感谢分享哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

256

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部