你好对话框,
我正在通过DA1469x上的LIS2DE12为运动检测生成外部中断。我的问题是当设备移动或检测到运动时,中断处理程序没有被调用。
我跟进了DA1469x教程外部中断辅导的。
在这里我为此实施了sharinf代码..请帮助我在这些问题中的问题?
void wakeup_interrupt_cb(void)
{
hw_wkup_reset_interrupt();
uint32\t状态;
/ *读取port0 * /
status=hw\u wkup\u get\u status(hw\u GPIO\u PORT\u 0);
/ *检查potr0 * /
if(status&(1 << hw_gpio_pin_12)){
/ *通知主要任务* /
OS_TASK_NOTIFY_FROM_ISR(ACC_MAIN_H,0x1,OS_NOTIFY_SET_BITS);
/*清除闩锁状态*/
hw_wkup_clear_status(hw_gpio_port_0,(1 << HW_GPIO_PIN_12));
/ *检查potr0 * /
}
}
静态void lis2_wakeupeventstask(void * pvparameters)
{
国际号码;
OS\ U底座\类型ret;
UINT32_T ULNOTIFIONVALUE;
lis2de12_int1_src_t src;
hw\u wkup\u init(空);
hw_wkup_register_gpio_p0_interrupt(wakeup_interrupt_cb,1);
hw_wkup_gpio_configure_pin(hw_gpio_port_0,hw_gpio_pin_12,true,hw_wkup_pin_state_low);
/ *启用WKUP控制器的中断* /
hw_wkup_enable_irq();
启用WakeUpdetect(Li2DE12_HDL);
/ *寄存器BLE_MULTI_LINK任务由看门狗监视* /
wdog_id = sys_watchdog_register(false);
for(;;){
printf(“lis2_wakeupeventstask任务\ r \ n”);
/ *在每个循环上通知看门狗* /
sys_watchdog_notify(wdog_id);
/ *在OS_TASK_NOTIFY_WAIT()屏蔽时暂停看门狗* /
sys_watchdog_suspend(wdog_id);
/*等待任何通知位,然后将其全部清除*/
RET = OS_TASK_NOTIFY_WAIT(0,OS_TASK_NOTIFY_ALL_BITS,&ulnotifiedValue,OS_TASK_NOTIFY_FOREVER);
/ *这必须永远阻止,直到收到任务通知。所以
返回值必须为OS\u TASK\u NOTIFY\u SUCCESS*/
OS\u ASSERT(ret==OS\u TASK\u NOTIFY\u SUCCESS);
/ *读取轮询模式的int引脚1
*或读取SRC状态寄存器
* /
if(ulnotifiedvalue&0x1)
{
lis2de12_int1_gen_source_get(li2de12_hdl,&src);
if(src.xh || src.yh || src.zh)
{
hw_gpio_set_inactive(hw_gpio_port_0,hw_gpio_pin_24);
hw_gpio_pad_latch_enable(hw_gpio_port_0,hw_gpio_pin_24);
hw_gpio_pad_latch_disable(hw_gpio_port_0,hw_gpio_pin_24);
启用WakeUpdetect(Li2DE12_HDL);
}
其他
{
硬件gpio\设置\激活(硬件gpio\端口\ 0,硬件gpio\引脚\ 24);
hw_gpio_pad_latch_enable(hw_gpio_port_0,hw_gpio_pin_24);
hw_gpio_pad_latch_disable(hw_gpio_port_0,hw_gpio_pin_24);
enableInActivityDetect(li2de12_hdl);
}
}
/ *主要申请* /
sys_watchdog_notify_and_resume(wdog_id);
}
}
静态void prvsetuphardware(void)
{
hw_gpio_pad_latch_disable_all();//。。。以避免任何未使用的浮动销。
/*
*添加一个PDC LUT条目,以便在端口0上发生事件后唤醒M33核心
*这一点很重要,因为当设备进入睡眠状态时,M33会关闭。
* /
uint32_t pdc_wkup_gpio_id_1 = hw_pdc_add_entry(hw_pdc_lut_entry_val(hw_gpio_port_0,
HW_GPIO_PIN_12,HW_PDC_MASTER_CM33,0));
os_assert(pdc_wkup_gpio_id_1!= hw_pdc_invalid_lut_index);
/*玩这个把戏!*/
hw_pdc_set_pending(pdc_wkup_gpio_id_1);
hw_pdc_acknowledge(pdc_wkup_gpio_id_1);
/ * init硬件* /
/ *将自动调用'periph_init()'
*现在和设备的每一个唤醒* /
pm\u系统初始化(periph\u init);
/ *在处理任何GPIO引脚之前启用COM电源域* /
hw_sys_pd_com_enable();
/ *加速度计中断引脚* /
hw_gpio_configure_pin(hw_gpio_PORT_0,hw_gpio_pin_12,hw_gpio_MODE_INPUT_PULLUP,hw_gpio_FUNC_gpio,true);//加速计_INT1
hw_gpio_pad_latch_enable(hw_gpio_port_0,hw_gpio_pin_12);
hw\ U gpio\ pad\ U latch\ U disable(hw\ U gpio\ U PORT\ U 0,hw\ U gpio\ U PIN\ U 12);
/ *处理GPIO引脚后禁用COM电源域* /
hw_sys_pd_com_disable();
}
感谢和问候,
zinal。
嗨zinal,
谢谢你的问题。似乎唤醒控制器配置正确。请尝试使用lis2_wakeupeventstask()中的hw_wkup_configure_pin()而不是hw_wkup_gpio_configure_pin()?还请从教程中设置与WKUP_INIT()相同的替代时间。
此外,如果探测P0\u12(唤醒引脚),当LIS2DE12生成中断时,是否能够检测到下降沿?LIS2DE12是否产生上升沿或下降沿中断?
谢谢,PM_DIALOG.
你好PM\U对话框
是的,我尝试过hw_wkup_configure_pin(),并且还有key_wakup中断,我正在使用gpio_wakeup中断,这可能不会在为唤醒控制器提到的da1469x的BSP教程中给出去抖动时间,然后我加入了淘汰时间对我的设备没有影响。
而且我想从你那里知道,我们如何从软件中探测P0_12 Beacuse我第一次这样做,所以我不知道如何?你能帮助吗?
感谢和问候,
zinal。
嗨zinal,
我在前面的评论中的意思是使用逻辑分析仪工具或万用表来探测P0×12引脚。你能检测到中断吗?pin的状态如何?
谢谢,PM_DIALOG.
你好,PM\U对话,
我能够通过HW_GET_PIN_STATUS()验证PIN的状态,并且在设备运动检测到BEACUSE上的PIN状态时,我已经为运动检测配置了中断,但是在此之后interrupt_handler不会被调用。
谢谢,
zinal。
你好,PM\U对话,
你能回复我这个问题吗?它会有所帮助。
我能够得到引脚状态和引脚状态正在改变,而运动检测的设备上,GPIO的P0\u12,但不执行中断处理程序,它仍然在等待一个中断。
我使用hw_get_pin_status()调试此GPIO P0_12()等待中断,每当移动设备时它会很高。
我不能得到什么可能是中断配置的问题。
我正在使用USB Pro套件,以便无法通过逻辑分析仪调试。
谢谢,
zinal。
嗨zinal,
你能在调试模式下运行它吗?
生成中断时引脚的状态是多少?它高或低吗?
谢谢,PM_DIALOG.
你好,PM\U对话,
谢谢你的回复。
现在我能够得到不变的逆行
hw_wkup_gpio_configure_pin(hw_gpio_port_0,hw_gpio_pin_12,true,hw_wkup_pin_state_low);
使用hw_wkup_gpio_configure_pin(hw_gpio_port_0,hw_gpio_pin_12,true,hw_wkup_pin_state_high);现在它正在工作。
我有一个问题
我怎样才能让设备在不移动的设备上睡眠?当设备以睡眠模式移动时,wakup是可能的吗??
谢谢,
zinal。
嗨zinal,
很高兴你可以叫醒它!问题是唤醒引脚极性。
>>如何将设备放在设备上未移动和壁带有睡眠模式时的设备睡觉,这是可能的吗??
你能澄清一下你的新要求吗?
谢谢,PM_DIALOG.