带有几个来源的唤醒定时器

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

你好,

我使用3个GPIO作为唤醒定时器源。两个源总是在同一级别上触发(一个LOW和一个HIGH),第三个源在两个级别上触发(在IRQ例程中,我切换这个GPIO的触发器)。我没有反弹时间(0毫秒),我期待一个中断,只要至少一个源发生(计数器比较阈值是1)。一切都很好。第一个源总是在它们预期的级别触发,第三个源总是在这两个级别触发。


// init序列:
hw_wkup_set_counter_threshold(1);
hw_wkup_set_debounce_time (0);
//等等

但是,当至少两个来源同时发生时,永远不会调用IRQ例程;而永远(我已经观察到中断例程,只有在两个源同时发生时才被调用)。如果我使用一个软件看门狗这就要求我的IRQ例程,这个调用解锁系统和中断再次抛出唤醒定时器(因为,我认为,在IRQ状态 - GPIO水平和/或触发条件 - 看门狗通话过程中被更新)。

我已阅读文档:

事件计数器是边缘敏感。检测到A.
主动边必须先检测到反向边
在它回到IDLE状态之前
开始等待新的主动边缘。

是我的问题吗?我无法绕过这个条件!我无法更改源级别(GPIO级别),我无法更改触发级别(因为我不知道我是否在死锁条件下)......

任何答复都将非常欣赏。

问候,
Guillaume B.

设备:
MT_dialog
离线
最后看到:3个月1周前
职员
加入:2015-06-08 34
嗨gbmej,

嗨gbmej,

当您的同时发出中断时,我不会看到任何问题,唤醒控制器的中断不会触发的是,例如,如果允许说明您,则唤醒控制器的中断将不会触发。已配置为从3个不同的GPIO唤醒设备,并且触发手机对于剩余的两个和高电平,对于剩余的GPIO而高。现在,如果那些中断已经被置位(前两者的前两个​​或高度的一个来源的低电平),则不会发生中断,直到断言的引脚将被解除断言。所以也许这就是你正在遇到的,而不是在中断同时触发时。

由于MT_dialog

GBMEJ.
离线
最后看到:2年6个月前
加入:2017-09-13 3
你好,

你好,

谢谢你的回答。我已经执行了更多的调查以减少我的用例。我现在有一个GPIO中断在高到低变化和另一个切换在每个中断。我观察到,当GPIO 2发生在GPIO 1中断之后时,没有问题。但是如果改变发生在GPIO 1中断结束之前,但在GPIO 2检查之后,我有锁


wakeuup_handler ()

hw_wkup_reset_interrupt();
if(checkgpio1condition())performgpio1job();
如果(checkGPIO2COndition ()) performGPIO2Job ();/ /切换触发

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

通过看门狗,我已经在锁定(执行但没有JOB2的作业)之后检查了GPIO状态:GPIO1高,GPIO2应该抛出中断......

问候,
Guillaume B.

MT_dialog
离线
最后看到:3个月1周前
职员
加入:2015-06-08 34
嗨gbmej,

嗨gbmej,

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

/ /全局变量

__RETAINED HW_GPIO_MODE my_gpio_mode = HW_GPIO_MODE_INPUT_PULLUP;
__ retated hw_gpio_func my_gpio_function;

静态void wkup_cb(空白)

#if dg_configBLACK_ORCA_IC_REV == BLACK_ORCA_IC_REV_A . #if dg_configBLACK_ORCA_IC_REV == black_orca_ic_rev . #
hw_wkup_reset_counter();
# endif
hw_wkup_reset_interrupt();
hw_gpio_get_pin_function(cfg_start_advertising_trigger_1_gpio_port,cfg_start_advertising_trigger_1_gpio_pin,&my_gpio_mode,&my_gpio_function);
if(my_gpio_mode == hw_gpio_mode_input_pulldown){
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,
my_gpio_mode!= hw_gpio_mode_input_pulldown?hw_wkup_pin_state_low:hw_wkup_pin_state_high);

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年6个月前
加入:2017-09-13 3
你好,

你好,

非常感谢您的答案,但我没有问题触发器切换。当GPIO中断发生在另一个GPIO中断时,我有一个问题。这是我的伪代码(请参阅附件)。

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

一切都很好,除了这个用例:

[在t +0ms时中断1]
- GPIOA降低
- 抛出中断
有效的GPIOA条件:我们唤醒GPIOA任务
- 无效的gpiob条件:我们不会切换gpiob触发器,我们不会唤醒gpiob任务
- 我们留下了中断

[任务GPIOA在T + 1ms]
- 我们读了传感器
- GPIOA水平返回高位

[T + 33ms的中断2]
—GPIOB进入LOW
- 抛出中断
- 无效的GPIOA条件:我们不唤醒GPIOA任务
- 有效的GPIOB条件:我们切换GPIOB触发器,我们唤醒GPIOB任务
- 我们留下了中断

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

[在t +40ms时中断3]
- GPIOA降低
- 抛出中断
唤醒GPIOA任务(有效的GPIOA条件)
-我们没有唤醒GPIOB任务(无效的GPIOB条件)
- 我们留下了中断

[T = + 41ms的任务GPIOA]
- 我们读了传感器
- GPIOA水平返回高位

如果GPIOB从低到高的级别在中断3之后被更新(我们有中断向量例程),没有错误。如果这个更新发生在GPIOB中断条件检查之后,但在离开中断向量例程之前,则不再抛出中断。这是锁。我认为内部唤醒状态机保持在KEY_RELEASE状态,因为GPIOA的key_hit回到了0,但与此同时,GPIOB的key_hit转到1…

再次感谢你的帮助
Guillaume

依恋:
MT_dialog
离线
最后看到:3个月1周前
职员
加入:2015-06-08 34
嗨gbmej,

嗨gbmej,

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

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

由于MT_dialog

GBMEJ.
离线
最后看到:2年6个月前
加入:2017-09-13 3
你好,

你好,

我锁定了唤醒计时器中断,而不是其他中断。只要我有了锁(几秒钟后;我的代码在几秒钟内工作得很好),唤醒计时器中断永远不会再次抛出。当我处于GPIOA级别变化的唤醒定时器中断功能中,并且GPIOB的条件在GPIOB条件检查之后变得有效,但在中断结束之前,我有锁。

我尝试过GPIO引脚重新配置(输入拉起然后向上向上等)+ UDPate的触发电平,没有更多的结果。

GPIOA任务在GPIOA中断时被唤醒(使用freertos二进制信号量)。在GPIOA任务唤醒之后,我将GPIOB状态存储在RAM中(级别,触发器)。当我遇到锁(看门狗)时,我打印GPIOB状态:中断条件满足,但没有中断(唤醒计时器中断)被抛出。如果我比较这个GPIOB状态和GPIOA中断期间的GPIOB状态(就在离开唤醒计时器中断之前,我也存储在RAM GPIOB状态),我可以看到GPIOB条件在ISR(唤醒计时器中断)结束之前没有满足,但在ISR之后满足。锁定后40ms, GPIOA的条件也得到了满足,但是中断(唤醒定时器中断)没有被抛出。

如果在我的看门狗回调期间,我称之为唤醒中断功能,这会解锁锁,然后中断继续工作......

谢谢你的帮助
Guillaume

MT_dialog
离线
最后看到:3个月1周前
职员
加入:2015-06-08 34
嗨gbmej,

嗨gbmej,

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

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

尝试使用分析仪检查信号并确保在信号断言时没有重叠,这意味着当另一个中断发生时,另一个不正常断言,因为这是唯一可以停止的条件唤醒控制器。

由于MT_dialog

GBMEJ.
离线
最后看到:2年6个月前
加入:2017-09-13 3
你好

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

PM_Dialog
离线
最后看到:3小时27分钟前
职员
加入:2018-02-08 11:03
嗨gbmej,

嗨gbmej,

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

谢谢,PM_Dialog