唤醒定时器与几个来源

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
10个帖子/ 0个新帖子
最后发表
gbmej
离线
最后看到:2年10个月前
加入:2017-09-13 3
唤醒定时器与几个来源

你好,

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


/ /初始化序列:
hw_wkup_set_counter_threshold (1);
hw_wkup_set_debounce_time (0);
/ /等

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

我在文档中读过:

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

是我的问题吗?我不能绕过这个条件!我不能改变源电平(GPIO电平),也不能改变触发器电平(因为我不知道我是否处于死锁状态)…

任何回复都将不胜感激。

问候,
Guillaume B。

设备:
MT_dialog
离线
最后看到:7个月2天前
工作人员
加入:2015-06-08 34
嗨gbmej,

嗨gbmej,

我没有看到任何问题,当中断在同一时间发出,什么可能发生和中断从唤醒控制器将不会触发是当一个中断源已经断言,例如,如果让我们举例说,你已经配置从3个不同的gpios和触发器极化是低的前两个和高的其余一个。现在,如果一个中断已经被断言(低为前两个源之一或高为后一个源),那么没有中断将发生,直到断言引脚将被取消断言。所以,也许这就是你正在经历的,而不是当这些干扰同时被触发时。

由于MT_dialog

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

你好,

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


wakeuup_handler ()

hw_wkup_reset_interrupt ();
如果(checkGPIO1COndition ()) performGPIO1Job ();
如果(checkGPIO2COndition ()) performGPIO2Job ();/ /切换触发

//如果GPIO1中断期间GPIO2条件改变(我们已经调用了performGPIO1Job(),但没有调用performGPIO2Job()),我有问题(GPIO中断永远不会被GPIO2抛出)。如果在IRQ例程之后GPIO2条件发生了变化,我没有问题。

通过看门狗,我检查了锁之后的GPIO状态(执行了job1但没有执行job2): GPIO1是HIGH, GPIO2应该抛出中断…

问候,
Guillaume B。

MT_dialog
离线
最后看到:7个月2天前
工作人员
加入:2015-06-08 34
嗨gbmej,

嗨gbmej,

我不确定我是否准确地理解这一点,你提到的部分,当你得到锁让我有点困惑,试图复制你提到的,我已经在hrp_sensor中做了以下测试,它已经实现了一个唤醒源。“静态”唤醒源被触发为LOW,默认引脚配置为PULLUP,改变唤醒源(在中断程序中改变配置的那个)最初具有相同的极性,执行改变的代码附在下面。

/ /全局变量

__RETAINED HW_GPIO_MODE my_gpio_mode = HW_GPIO_MODE_INPUT_PULLUP;
__RETAINED HW_GPIO_FUNC my_gpio_function;

静态孔隙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,真的,
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_get_pin_function()用于检查默认引脚配置hw_gpio_set_pin_function()用于设置正确的默认引脚状态(与前面的中断击中相反)。

由于MT_dialog

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

你好,

非常感谢你的回答,但我对触发按钮没有问题。我有一个问题,当一个GPIO中断发生在另一个GPIO中断。这是我的伪代码(见附件)。

—每40ms发生一次GPIOA中断。GPIOA任务强制GPIOA级别从LOW返回HIGH(这是一个清除传感器中断的传感器读取)。
—GPIOB中断每200ms发生一次。第一个中断被抛出时,电平从高到低。我们拨动触发器,现在检查LOW到HIGH。任务GPIOB强制GPIOB从LOW返回HIGH(驱动GPIOB信号的源)。然后第二个中断被抛出,我们再次切换。这就像一个按钮,获取新闻/发布事件,但源不能发布,直到考虑到新闻事件。

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

[在t +0ms时中断1]
—GPIOA进入LOW
中断被抛出
有效的GPIOA条件:我们唤醒GPIOA任务
无效的GPIOB条件:我们不切换GPIOB触发器,我们不唤醒GPIOB任务
-我们离开中断

[任务GPIOA at t +1ms]
-我们读取了传感器
—GPIOA恢复到高

[在t +33ms时中断2]
—GPIOB进入LOW
中断被抛出
无效的GPIOA条件:我们不唤醒GPIOA任务
-有效的GPIOB条件:我们切换GPIOB触发器,我们唤醒GPIOB任务
-我们离开中断

[任务GPIOB at t +34ms]
-我们ack GPIOB级别,让源代码工作(大约6到8毫秒)

[在t +40ms时中断3]
—GPIOA进入LOW
中断被抛出
唤醒GPIOA任务(有效的GPIOA条件)
-我们没有唤醒GPIOB任务(无效的GPIOB条件)
-我们离开中断

[任务GPIOA at t = +41ms]
-我们读取了传感器
—GPIOA恢复到高

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

再次感谢你的帮助
Guillaume

附件:
MT_dialog
离线
最后看到:7个月2天前
工作人员
加入:2015-06-08 34
嗨gbmej,

嗨gbmej,

你的意思是当M0执行按下按钮的ISR时没有中断?对吗?这与唤醒控制器无关,但M0和NVIC是如何操作的,如果处理器得到一个中断而另一个中断正在执行中断处理程序,由于两个中断具有相同的优先级,挂起的中断标志将被设置为1,一旦前一个ISR被执行,它将再次被调用来服务挂起的中断,就我所测试的而言,这正是68x所做的。

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

由于MT_dialog

gbmej
离线
最后看到:2年10个月前
加入: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
离线
最后看到:7个月2天前
工作人员
加入:2015-06-08 34
嗨gbmej,

嗨gbmej,

唤醒定时器中断是我正在谈论的,来源可能是许多引脚,但从唤醒定时器中断是一个。如果有一个唤醒中断和ISR执行,然后在ISR执行期间有另一个相同的中断命中,挂起位(WKUP_GPIO_IRQn)将被设置,当ISR被服务时,它将被重新调用来服务挂起中断。

可能发生以下情况,GPIOA变低(低触发),所以ISR运行,你提到一个任务正在读取传感器的状态,以释放中断,所以从GPIOA中断发生的时刻到中断被取消断言的时刻有一个周期x,唤醒控制器不接受来自其他来源(包括GPIOB)的中断,因为GPIOA的状态仍然被断言,它与GPIOB的中断条件没有关系,如果他们满足或不满足,因为GPIOA仍然断言GPIOB不会被触发。

试着检查一个分析器的信号中断发生时,确保没有重叠的断言的信号,这意味着当一个中断发生其他不是已经断言,因为这是唯一的条件是可以拖延醒来控制器。

由于MT_dialog

gbmej
离线
最后看到:2年10个月前
加入:2017-09-13 3


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

PM_Dialog
离线
最后看到:1周4天前
工作人员
加入:2018-02-08 11:03
嗨gbmej,

嗨gbmej,

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

谢谢,PM_Dialog