本来想做按键扫描任务
但是用到响应按键的话一般优先级很高
而且按键不会频繁按下,没必要一直查询
使用外部中断处理是更优的做法
参考04_basic_beep_motor例程的按键中断
但是这个例程的KEY_WAKE_UP没有使用中断,用了下拉输入扫描,不知道是为什么
难道是这个和低功耗的东西有关不能用中断?
翻了下例程的PDF
原理图可知, KEY0 、 KEY1 、 KEY2 按下为低电平,松开为高电平,
WK_UP 按下为高电平,松开为低电平。所以在 main 函数中,首先将 KEY0 、 KEY1 、 KEY2 三个按键引脚配置为上拉输入模式, WK_UP 按键设置为下拉输入模式,
实际上我把wk_up引脚配置为上升沿外部中断也是不行不能正常触发中断回调
而且STLINK也直接掉线了
估计stm32L4已经进入低功耗模式
在低功耗模式下无法进行程序的烧写了
很奇怪看了下HAL裸机教程是可以全部配置为中断的
难道是rtthread的drv_gpio适配有问题还是硬件上有问题吗?
源文件irq_key.c:
#include <irq_key.h>
#include <rtdevice.h>
#define DBG_TAG "state led"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <thread_state_led.h>
/* 中断回调 */
void irq_key_falling_callback(void *args)
{
rt_uint32_t sign = (rt_uint32_t)args;
switch (sign)
{
case PIN_KEY0:
rgb_state_led.color.red=1;
LOG_D("KEY0 interrupt.");
break;
case PIN_KEY1:
rgb_state_led.color.red=0;
LOG_D("KEY1 interrupt.");
break;
case PIN_KEY2:
rgb_state_led.color.blue=1;
LOG_D("KEY2 interrupt.");
break;
case PIN_WK_UP:
rgb_state_led.color.blue=0;
LOG_D("KEY WAKEUP interrupt.");
break;
default:
LOG_E("error sign= %d !", sign);
break;
}
}
void irq_key_rising_callback(void *args)
{
rt_uint32_t sign = (rt_uint32_t)args;
switch (sign)
{
case PIN_WK_UP:
rgb_state_led.color.blue=0;
LOG_D("KEY WAKEUP interrupt.");
break;
default:
LOG_E("error sign= %d !", sign);
break;
}
}
void irq_key_init(void)
{
/* 设置 KEY0 引脚的模式为输入模式 */
rt_pin_mode(PIN_KEY0,PIN_MODE_INPUT_PULLUP);
rt_pin_mode(PIN_KEY1,PIN_MODE_INPUT_PULLUP);
rt_pin_mode(PIN_KEY2,PIN_MODE_INPUT_PULLUP);
rt_pin_mode(PIN_WK_UP,PIN_MODE_INPUT_PULLDOWN);
/* 设置按键中断模式与中断回调函数 */
rt_pin_attach_irq(PIN_KEY0, PIN_IRQ_MODE_FALLING, irq_key_falling_callback, (void *)PIN_KEY0);
rt_pin_attach_irq(PIN_KEY1, PIN_IRQ_MODE_FALLING, irq_key_falling_callback, (void *)PIN_KEY1);
rt_pin_attach_irq(PIN_KEY2, PIN_IRQ_MODE_FALLING, irq_key_falling_callback, (void *)PIN_KEY2);
rt_pin_attach_irq(PIN_WK_UP,PIN_IRQ_MODE_RISING, irq_key_rising_callback, (void *)PIN_WK_UP);
/* 使能中断 */
rt_pin_irq_enable(PIN_KEY0, PIN_IRQ_ENABLE);
rt_pin_irq_enable(PIN_KEY1, PIN_IRQ_ENABLE);
rt_pin_irq_enable(PIN_KEY2, PIN_IRQ_ENABLE);
rt_pin_irq_enable(PIN_WK_UP, PIN_IRQ_ENABLE);
}
头文件irq_key.h:
#include <rtthread.h>
#include <board.h>
#define PIN_KEY0 GET_PIN(D, 10) // PD10: KEY0 --> KEY
#define PIN_KEY1 GET_PIN(D, 9) // PD9: KEY1 --> KEY
#define PIN_KEY2 GET_PIN(D, 8) // PD8: KEY2 --> KEY
#define PIN_WK_UP GET_PIN(D, 11) // PD11: WK_UP --> KEY
void irq_key_init(void);