具有多个源的唤醒计时器

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
10个职位/ 0新
最后一篇
gbmej
离线
最后一次露面:2年9个月前
加入:2017年9月13日15:16
具有多个源的唤醒计时器

你好,

我使用3个GPIO作为唤醒定时器源。两个来源触发总是在同一水平(一个低一个高),在这两个级别的第三源(IRQ程序中,我切换此GPIO的触发)。我没有去抖时间(0毫秒)和我期待的中断只要至少一个发生源(计数器比较阈值为1)。一切运作良好。两个第一源始终触发他们的预期水平,并在这两个层面第三源触发器。


//初始序列:
硬件工作设置计数器阈值(1);
hw_wkup_set_debounce_time(0);
//等等

然而,当至少两个源同时出现时,IRQ例程永远不会被调用;而且永远(我观察到,只有当两个源同时出现时,才会调用中断例程)。如果我使用一个调用IRQ例程的软件看门狗,此调用将解锁系统,并再次抛出唤醒计时器中断(因为,我认为,IRQ条件-GPIO级别和/或触发条件-在看门狗调用期间更新)。

我已阅读文档:

事件计数器是边缘敏感。检测到A.
活性边缘的反向边缘必须首先检测
它可以追溯到空闲状态,并从那里前
开始等待新的活动边缘。

这是我的问题吗?我不能绕过这个条件!我无法更改源级别(GPIO级别)和触发器级别(因为我不知道是否处于死锁状态)。。。

如蒙答复,将不胜感激。

当做
Guillaume B.

设备:
mt_dialog.
离线
最后一次露面:6个月2周前
职员
加入:2015-06-08 11:34
嗨gbmej,

嗨gbmej,

如果同时发出中断,我看不到任何问题,例如,当其中一个中断源已断言为allready时,可能会发生的情况以及唤醒控制器不会触发的中断,例如,假设您已配置从3个不同的GPIO唤醒设备,并且前两个GPIO的触发器轮询率较低,其余GPIO的触发器轮询率较高。现在,如果其中一个中断被allready断言(前两个源中的一个为低,后两个为高),那么在断言的引脚被反断言之前,不会发生中断。所以,也许这就是你正在经历的,而不是当中断同时被触发时。

谢谢mt_dialog.

gbmej
离线
最后一次露面:2年9个月前
加入:2017年9月13日15:16
你好,

你好,

谢谢您的回答。我已经进行更多的研究,以减少我的使用情况。我现在有一个GPIO中断对高到低的变化,另一个切换其在每一个中断。当发生GPIO 2变化只是GPIO 1中断后,有没有问题,我观察。但是,如果GPIO中断1月底前,但GPIO 2检查后发生的变化,我有锁


wakeuup_handler()
{
hw_wkup_reset_interrupt();
如果(检查GPIO1条件())执行PIO1作业();
如果(checkGPIO2COndition())performGPIO2Job();//拨动扳机

//如果gpio2条件在gpio1中断期间在这里发生变化(我们称为performgpio1job()但不是performgpio2job())我有问题(GPIO中断从不抛出GPIO2。如果GPIO2条件发生在IRQ常规之后,我没有问题。
}

使用看门狗,我在锁定后检查了GPIO状态(执行了job1,但没有执行job2):GPIO1高,GPIO2应该抛出中断。。。

当做
Guillaume B.

mt_dialog.
离线
最后一次露面:6个月2周前
职员
加入:2015-06-08 11:34
嗨gbmej,

嗨gbmej,

我不确定我完全得到了这一点,你提到的部分当你锁定时让我感到困惑,试图复制你所提到的内容,我在HRP_Sensor中完成了以下测试,它已经实现了一个唤醒源。触发“静态”唤醒源触发低电平,默认引脚配置是上拉更改唤醒源(中断例程中的配置更改配置)具有最初相同的手机,以及执行更改的代码在下面连接。

//全局变量

__RETAINED HW_GPIO_MODE my_gpio_mode = HW_GPIO_MODE_INPUT_PULLUP;
__保留HW_GPIO_FUNC my_GPIO_函数;

静态空隙率wkup_cb(空隙率)
{

#如果dg_configBLACK_ORCA_IC_REV == BLACK_ORCA_IC_REV_A
硬件启动复位计数器();
#万一
hw_wkup_reset_interrupt();
hw_gpio_get_pin_函数(CFG_START_advertive_TRIGGER_1_gpio_端口、CFG_START_advertive_TRIGGER_1_gpio_pin、my_gpio_模式和my_gpio_函数);
如果(my_gpio_mode==HW_gpio_mode_INPUT_下拉列表){
my_gpio_mode = hw_gpio_mode_input_pullup;
} 别的 {
my_gpio_mode = HW_GPIO_MODE_INPUT_PULLDOWN;
}
hw_gpio_set_pin_function(cfg_start_advertising_trigger_1_gpio_port,cfg_start_advertising_trigger_1_gpio_pin,my_gpio_mode,hw_gpio_func_gpio);

hw_wkup_configure_pin(cfg_start_advertising_trigger_1_gpio_port,cfg_start_advertising_trigger_1_gpio_pin,true,
我的gpio模式=硬件-GPIO-模式-输入-下拉-硬件-工作-引脚-状态-低:硬件-工作-引脚-状态-高);

hw_cpm_trigger_sw_cursor();//这将有助于在每次识别电源分析器中断了细细的红线中断触发
hrp_wkup_cb();
}

在periph_init()中:

hw_gpio_set_pin_function(cfg_start_advertising_trigger_1_gpio_port,cfg_start_advertising_trigger_1_gpio_pin,my_gpio_mode,hw_gpio_func_gpio);

只要触发中断,然后从触发状态释放行,都会出现在触发状态,因此应该检查上面的片段上的更改以及引脚的唤醒状态如何基于该中断用于检查默认引脚配置HW_GPIO_SET_PIN_FUNCTION()的默认引脚,HW_GPIO_GET_PIN_FUNCTION()用于设置正确的默认PIN状态(与先前中断命中相反)。

谢谢mt_dialog.

gbmej
离线
最后一次露面:2年9个月前
加入:2017年9月13日15:16
你好,

你好,

非常感谢您的回答,但我对触发开关没有问题。在另一个GPIO中断期间发生GPIO中断时,我遇到了一个问题。这是我的伪代码(见附件)。

- GPIOA中断每40毫秒发生一次。GPIOA任务责任GPIOA水平从低到高(它是清除传感器中断的传感器读数)。
-GPIOB中断每200ms发生一次。当电平从高到低时,抛出第一个中断。我们切换触发器,从低到高检查。任务GPIOB强制GPIOB从低返回高(驱动GPIOB信号的源)。然后抛出第二个中断,我们再次切换。它就像一个按钮,用于获取新闻/发布事件,但在考虑新闻事件之前,源代码无法发布。

一切运作良好,除了这种使用情况:

[中断1在t + 0毫秒]
-GPIOA变低
-中断被抛出
- 有效GPIOA条件:我们唤醒GPIOA任务
- 无效的gpiob条件:我们不会切换gpiob触发器,我们不会唤醒gpiob任务
-我们不插嘴

[t+1ms时的任务GPIOA]
-我们读取传感器
-GPIOA水平恢复到高水平

[在t+33毫秒时中断2]
- GPIOB转到LOW
-中断被抛出
- 无效的GPIOA条件:我们不唤醒GPIOA任务
- 有效的GPIOB条件:我们切换GPIOB触发器,我们唤醒GPIOB任务
-我们不插嘴

[T + 34MS的任务GPIOB]
- 我们确认GPIOB级别让源工作(大约6到8毫秒)

[中断3在t + 40毫秒]
-GPIOA变低
-中断被抛出
- 我们唤醒GPIOA任务(有效GPIOA条件)
- 我们没有唤醒GPIOB任务(无效GPIOB条件)
-我们不插嘴

[T = + 41ms的任务GPIOA]
-我们读取传感器
-GPIOA水平恢复到高水平

如果GPIOB低到高的水平后立即中断3(我们已经离开中断向量例程),没有错误更新。如果只是GPIOB的检查中断条件之后,但在离开中断向量程序之前,发生此更新,没有更多的中断异常。这是锁。我觉得在KEY_RELEASE状态下的内部唤醒状态机停留,因为GPIOA回零,但在同一时间的key_hit,GPIOB的key_hit去1 ...

再次感谢你的帮助
guillaume.

依恋:
mt_dialog.
离线
最后一次露面:6个月2周前
职员
加入:2015-06-08 11:34
嗨gbmej,

嗨gbmej,

你的意思是,M0正在执行一个按钮按下的ISR时没有中断?那是对的吗 ?这与唤醒控制器无关,而是M0和NVIC如何运行,如果处理器在执行中断处理程序时进行中断,因为两个中断都具有相同的优先级,因此挂起的中断标志将是相同的设置为1,一旦上一个ISR被执行,它将再次调用它来服务挂起的中断,并且就我测试了这正是68倍的所做中断。

现在,在你的情况下,我看到你的引脚与下拉和上拉内部电阻配置,我可以想像,这是中断到锁的原因,也许在的情况下,外部设备不能正常行驶的线路在特定的述上拉电阻将发生,并保持该中断信号,用于唤醒控制器断言,我想是一个切换其状态的至少一个销源,这是足够的,以不发生中断和唤醒控制器等待对于中断报告另一个中断之前断言。所以,你可以尝试或者不使用内部引体向上的情况下,你是一定的,外部传感器正确驱动线,或者如果你想使用内部电阻,你应该改变电阻,以相反的默认状态那将触发唤醒,像我在以前的文章中提到,为了改变默认的引脚配置使用hw_gpio_set_pin_function()的状态。

谢谢mt_dialog.

gbmej
离线
最后一次露面:2年9个月前
加入:2017年9月13日15:16
你好,

你好,

我对唤醒定时器中断的锁,而不是在其它中断。只要我有一个锁(几秒钟后,我的代码在几秒钟效果很好),唤醒定时器中断不会再抛出。当我在唤醒定时器中断功能由于GPIOA水平的变化和GPIOB的条件只是GPIOB条件检查后,但在中断年底前生效,我有锁。

我尝试过gpio引脚重新配置(输入上拉,下拉,上拉等)+udpate的触发电平,没有更多的结果。

GPIOA任务(使用FreeRTOS的二进制信号)唤醒在GPIOA中断程序。就在GPIOA任务唤醒后,我存储在RAM(电平,触发)的GPIOB状态。当我遇到锁(看门狗),我打印GPIOB状态:中断条件满足,但没有中断(唤醒定时器中断)被抛出。如果我在GPIOA中断期间比较与GPIOB状态这GPIOB状态(只留下唤醒定时器中断之前,我存储在RAM GPIOB状态也是如此),我可以看到GPIOB条件ISR(唤醒定时器中断结束前不满意),但ISR后满意。后锁后40毫秒,GPIOA的条件再次满足太多,但中断(唤醒定时器中断)不会抛出。

如果在我的看门狗回调期间调用唤醒中断函数,这将解锁锁,然后中断继续工作。。。

Thanlks您的帮助
guillaume.

mt_dialog.
离线
最后一次露面:6个月2周前
职员
加入:2015-06-08 11:34
嗨gbmej,

嗨gbmej,

唤醒定时器中断是我所讨论的,源可能是许多引脚,但唤醒定时器的中断是一个。如果有一个唤醒中断和ISR执行,然后在ISR执行期间又一次击中相同的中断,则将设置待处理的位(WKUP_GPIO_IRQN),并且只要ISR提供服务即可重新调用以服务待处理打断。

也许发生了以下情况,GPIOA变低(及其低触发),因此ISR运行,并且您提到任务正在读取传感器的状态以释放中断,因此瞬间有一个句点xGPIOA中断发生在断开中断的那一刻,即唤醒控制器不会接受来自其他源(包括GPIOB)的中断,因为GPIOA的状态仍然被断言,它与...不一定GPIOB中断的条件,如果仍然追随GPIOA,因此仍然触发GPIOB。

尝试使用分析仪检查信号,并确保当中断发生时,信号的断言没有重叠,这意味着当一个中断发生时,另一个中断未被断言为allready,因为这是唯一可能使唤醒控制器失速的条件。

谢谢mt_dialog.

gbmej
离线
最后一次露面:2年9个月前
加入:2017年9月13日15:16
你好

你好
我更新了我的代码要使用锁存模式(第4.3章)。结果是更好的。但是,我有一个关于清除中断问题:功能hw_wkup_reset_interrupt在具有多个中断源的示例中永远不会调用。这是一个错误吗?
当做
Guillaume B.

PM_DIALOG.
离线
最后一次露面:1天2小时前
职员
加入:2018-02-08 11:03
嗨gbmej,

嗨gbmej,

hw_wkup_reset_interrupt()是一个API函数,而不是回调函数,因此任何用户指定的中断回调都必须调用它,以清除中断标志。如果不调用此函数,应用程序将永远不会调用它,因此这不是错误。有关更多信息,请阅读3.2中的步骤2。初始化功能一章的要点,从我们的支持页面开始一个项目教程。

谢谢,PM_DIALOG.