你好对话框,
我在DA1469x上通过LIS2DE12为运动检测生成外部中断。我的问题是中断处理程序没有被调用时,设备已经移动或运动检测。
我跟进了DA1469x教程外部中断教程。
在这里我为此实施了sharinf代码..请帮助我在这些问题中的问题?
void wakeup_interrupt_cb(void)
{
hw_wkup_reset_interrupt();
uint32_t状态;
/ *读取port0 * /
状态= hw_wkup_get_status (HW_GPIO_PORT_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)
{
int8_t wdog_id;
OS_BASE_TYPE ret;
uint32_t ulNotifiedValue;
lis2de12_int1_src_t src;
hw_wkup_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);
为了 (;;) {
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_TASK_NOTIFY_SUCCESS */
OS_ASSERT (ret = = OS_TASK_NOTIFY_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);
}
别的
{
hw_gpio_set_active (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);
enableInactivityDetect (li2de12_hdl);
}
}
/ *主要申请* /
sys_watchdog_notify_and_resume(wdog_id);
}
}
静态void prvsetuphardware(void)
{
hw_gpio_pad_latch_disable_all ();/ /……避免任何未使用的浮动引脚。
/*
*添加一个PDC LUT条目,以便在PORT0上发生事件后唤醒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_system_init (periph_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);/ / ACCELEROMETER_INT1
hw_gpio_pad_latch_enable(hw_gpio_port_0,hw_gpio_pin_12);
hw_gpio_pad_latch_disable (HW_GPIO_PORT_0 HW_GPIO_PIN_12);
/ *处理GPIO引脚后禁用COM电源域* /
hw_sys_pd_com_disable ();
}
感谢和问候,
zinal。
嗨zinal,
谢谢你的问题。似乎唤醒控制器配置正确。请尝试使用lis2_wakeupeventstask()中的hw_wkup_configure_pin()而不是hw_wkup_gpio_configure_pin()?还请从教程中设置与WKUP_INIT()相同的替代时间。
另外,如果探测P0_12(唤醒引脚),当LIS2DE12生成中断时,是否能够检测下降沿?LIS2DE12是否产生上升沿或下降沿中断?
谢谢,PM_DIALOG.
你好PM_Dialog
是的,我尝试过hw_wkup_configure_pin(),并且还有key_wakup中断,我正在使用gpio_wakeup中断,这可能不会在为唤醒控制器提到的da1469x的BSP教程中给出去抖动时间,然后我加入了淘汰时间对我的设备没有影响。
而且我想从你那里知道,我们如何从软件中探测P0_12 Beacuse我第一次这样做,所以我不知道如何?你能帮助吗?
感谢和问候,
zinal。
嗨zinal,
在我之前的评论中,我的意思是使用逻辑分析仪工具或万用表来探测P0_12引脚。你能检测到中断吗?引脚的状态是什么?
谢谢,PM_DIALOG.
你好PM_Dialog,
我能够通过HW_GET_PIN_STATUS()验证PIN的状态,并且在设备运动检测到BEACUSE上的PIN状态时,我已经为运动检测配置了中断,但是在此之后interrupt_handler不会被调用。
谢谢,
zinal。
你好PM_Dialog,
你能回复我这个问题吗?它会有所帮助。
我能够得到引脚状态和引脚状态正在改变,而运动检测设备上的GPIO P0_12,但不执行interrupt_handler,它仍然在等待中断。
我使用hw_get_pin_status()调试此GPIO P0_12()等待中断,每当移动设备时它会很高。
我不能得到什么可能是中断配置的问题。
我正在使用USB Pro套件,以便无法通过逻辑分析仪调试。
谢谢,
zinal。
嗨zinal,
你能在调试模式下运行它吗?
生成中断时引脚的状态是多少?它高或低吗?
谢谢,PM_DIALOG.
你好PM_Dialog,
谢谢你的回复。
现在我能够得到不变的逆行
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);现在它正在工作。
我有一个问题
我怎么能把设备放在睡眠设备不移动和唤醒时,它移动与睡眠模式是可能的??
谢谢,
zinal。
嗨zinal,
很高兴你能唤醒它!问题是唤醒针的极性。
>>如何将设备放在设备上未移动和壁带有睡眠模式时的设备睡觉,这是可能的吗??
你能说明一下你的新要求吗?
谢谢,PM_DIALOG.