双用PIN(WKUPCT_ENABLE_IRQ&GPIO_ENABLEQ)

4个帖子/ 0新
最后一篇
Justintuley
离线
最后一次露面:4 years 5 months ago
加入:2016-06-19 23:55
双用PIN(WKUPCT_ENABLE_IRQ&GPIO_ENABLEQ)

嗨,我在睡眠期间设立引脚唤醒设备时,我遇到了麻烦,并使用相同的PIN通过长键开始广告。

单独的长初级功能正常工作正常,我已经验证了PIN可以通过设置LED唤醒设备,但我无法一起工作。所以我想知道我如何使用1个引脚从睡眠中唤醒(WKUPCT_ENABLE_IRQ),如果我保持相同的引脚3秒钟,它也将启动广告(GPIO_ENABLEQ)。

设置GPIO中断:
//在BTN2中断调用此功能
gpio_registercallback(gpio2_irqn,button2_press);
//设置在下降边缘/高中中断
gpio_enableirq(btn2_port_rgd,btn2_pin_rgd,gpio2_irqn,falling_edge,false,10);

// long press on btn 2 starts adv
void button2_press(void)
{

开关(BTNState_e)
{
案例Btnlow://初始BTN按
btnState_e + +;
gpio_registercallback(gpio2_irqn,button2_press);
// chng在下次接下来的相反边缘中断
gpio_enableirq(btn2_port_rgd,btn2_pin_rgd,gpio2_irqn,rising_egce,false,10);
//开始计时器
tmrstrtbtn2 = systick_value();
btn2reeleased = false;
休息;

案例BTNHigh:// BTN释放
btnstate_e--;
gpio_registercallback(gpio2_irqn,button2_press);
// chng在下次接下来的相反边缘中断
gpio_enableirq(btn2_port_rgd,btn2_pin_rgd,gpio2_irqn,falling_edge,false,10);
//停止计时器
tmrstopbtn2 = systick_value();
btn2reeleased = true;
休息;

//开始广告的广告
}

设置WKUP定时器:
wkupct_register_callback(btn_wakeup_cb);
wkupct_enable_irq(wkup_en_btn2,wkup_actv_low,1,0);//引脚,有效低,1个事件,脱嘴时间= 0ms

void btn_wakeup_cb(void)
{
如果(GetBits16 (SYS_STAT_REG, PER_IS_DOWN))
{
periph_init();
}

button2_press(); // <--------- I don't think the GPIO interrupt is firing, so try calling it here?
}

调用button2_press()不起作用,由于GPIO中断未触发,因此我不会让回调以执行代码。
我去了这个错误吗?
谢谢。

设备:
lt_dialog(未经验证)
贾斯蒂堡,

贾斯蒂堡,
如果我正确地了解你的要求,“当按下键时,系统会唤醒。然后从那里开始,如果钥匙被按下超过3秒,则启动广告”。
我假设在您的应用程序中,DA1458X进入扩展睡眠模式。

当DA1458x睡眠时,GPIO模块已关闭。所有GPIO设置都不会保留。当系统被钥匙按下播放时,无需执行任何内容,即使仍被按下键也会再次睡眠。然后将设置设置为“函数”按钮()中的GPIO模块的设置消失。这可能是你没有得到GPIO中断。

你能做的一种方式是:

void btn_presschecker(void){
advertise if the btn is still pressed.
}
void btn_wakeup_cb(void){
如果按下BTN,请将呼叫回函数“BTN_PRESSCHECKER”注册到APP_EASY_TIMER,其到期为3S。
调用wakeup_enable()
}
void wakeup_enable(void){
注册到WKUPCT回调函数'btn_wakeup_cb';
如果BTN很高
wkupct_enable_irq(活跃低);
别的
wkupct_enable_irq(活跃高);
}

Justintuley
离线
最后一次露面:4 years 5 months ago
加入:2016-06-19 23:55
是的,我正在使用扩展

是的,我正在使用扩展的睡眠模式。并且感谢解释。现在我知道GPIO中断在睡眠期间不起作用。凭借您的建议,我将能够获得长期新闻功能。

我想我现在可能有另一个问题。到目前为止我写的一切都取决于GPIO_ENABLEISIRQ。我没有想到睡眠直到最后,现在我意识到我可能必须重新考虑我很多我的gpio代码。我正在开发的设备是一个自定义遥控器。当没有与中央设备没有连接时,长按钮只需要启动广告。所以你的建议将照顾那个。但是,在任何其他按钮上,我将客户端发送与每个按钮相关的值。我是否需要为每个按钮具有单独的功能?一个用于睡觉,一个用于不睡觉设置正确的中断?部分按钮具有双短/长按功能,并相应地发送Diff值。

否则,我可以为每个按钮设置多个wkupct_enable_irq?在调用WKUPCT_REGISTER_CALLBALLEALLBALLEALLBALLENTER后,我如何知道在呼叫CB函数后导致WKUPCT中断的按钮?

一旦从睡眠中醒来,是否可以手动设置GPIO中断?我想我可以扫描CB函数中的所有按钮,然后设置正确的中断,如果可能的话。只有3个按钮。

lt_dialog(未经验证)
贾斯蒂堡,

贾斯蒂堡,
您可以使用WKUPCT_ENABLE_IRQ设置多个GPIO,它共享唯一相同的回调函数/事件计数/脱嘴时间。您可以在wkupct_quadec.c中引用wkupct_enable_irq()函数。

由于回调函数在三个键之间共享,因此可以执行回调函数中的密钥扫描,以查看实际按下了哪一个。