我用DA14580做一个项目,需要实现这样的功能:
1,如果DA14580在睡眠状态,按键长按2 s,蓝牙广播;如果DA14580在广播状态,按一键长按2 s,系统睡眠。
Int wakeup_handler(ke_msg_id_t)
void *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
如果(power_on_flag = = 1)
{
power_on_flag = 0;
app_timer_set (APP_LED_TIMER TASK_APP 10);
}
其他的
{
power_on_flag = 1;
app_timer_set (APP_LED_TIMER TASK_APP 10);
app_adv_start ();
}
}
空白app_button_enable(空白)
{
wkupct_register_callback (app_button_press_process);
如果GPIO_GetPinStatus(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
{
Wkupct_enable_irq (0x200, 0x200, 1,40);// P1_1,低极性,1事件,脱爆时间= 40ms
}
}
空白app_button_press_process(空白)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
{
periph_init ();
}
如果(app_ble_ext_wakeup_get ())
{
/ /唤醒祝福
#如果(EXT_SLEEP_ENABLED)
app_set_extended_sleep ();
# elif (DEEP_SLEEP_ENABLED)
app_set_deep_sleep ();
其他#
app_disable_sleep ();
# endif
SetBits32 (GP_CONTROL_REG BLE_WAKEUP_REQ 1);
app_ble_ext_wakeup_off ();
}
app_button_enable ();
SysTick_Config (160000 - 1);
}
空白SysTick_Handler(空白)
{
if (GPIO_GetPinStatus(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)==0)
{
key_press_time_count + +;
}
其他的
{
key_press_time_count = 0;
app_button_enable ();
SysTick - > CTRL & = ~ (SysTick_CTRL_TICKINT_Msk);
}
如果(power_on_flag = = 1)
{
如果(key_press_time_count = = 300) / / 3 s
{
key_press_time_count = 0;
SysTick - > CTRL & = ~ (SysTick_CTRL_TICKINT_Msk);
ke_msg_send_basic (APP_WAKEUP_MSG TASK_APP 0);
}
}
其他的
{
如果(key_press_time_count = = 200) / / 2
{
key_press_time_count = 0;
SysTick - > CTRL & = ~ (SysTick_CTRL_TICKINT_Msk);
ke_msg_send_basic (APP_WAKEUP_MSG TASK_APP 0);
}
}
}
我现在遇到的问题是:在睡眠状态下,我如果按按键的时间小于2 s(本次可以进入app_button_press_process),那么我再次按按键程序没有进入app_button_press_process函数。
如果每次按按键时间都大于2 s,整个系统工作正常。
小于2 s程序会执行SysTick_Handler中的这段
{
key_press_time_count = 0;
app_button_enable ();
SysTick - > CTRL & = ~ (SysTick_CTRL_TICKINT_Msk);
}
我如果这段程序中的“SysTick - > CTRL & = ~ (SysTick_CTRL_TICKINT_Msk);“屏蔽掉,系统也可以正常工作。
要实现我上门提到的功能有什么需要注意的地方吗?用什么方法可以实现啊?
能否把你的工程发出来看下
在你的函数基础上,做了一些修改。让按键的中断在systick中断没跑完之前不要进的去。另外就是用了systick_start和systick_stop。
bool button_check_start = false;
uint32_t start_clock = 0;
uint32_t end_clock = 0;
空白app_button_press_cb(空白)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
如果(app_ble_ext_wakeup_get ())
{
/ /唤醒祝福
#如果(EXT_SLEEP_ENABLED)
app_set_extended_sleep ();
# elif (DEEP_SLEEP_ENABLED)
app_set_deep_sleep ();
其他#
app_disable_sleep ();
# endif
SetBits32 (GP_CONTROL_REG BLE_WAKEUP_REQ 1);
app_ble_ext_wakeup_off ();
ke_msg_send_basic (APP_WAKEUP_MSG TASK_APP 0);
}
/ *添加* /
如果(button_check_start = = false)
{
start_clock = rwble_get_clock ();
button_check_start = true;
systick_start(16000年,真正的);
/ / SysTick_Config (160000 - 1);
}
/ *添加* /结束
app_button_enable ();
}
空白app_button_enable(空白)
{
如果(button_check_start = = false)
{
wkupct_register_callback (app_button_press_cb);
如果GPIO_GetPinStatus(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_polarization (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, wkupct_pin_polarization _low), //极性低
1, // 1事件
40);//调试时间= 0
}
}
.....
空白SysTick_Handler(空白)
{
如果(button_check_start = = true)
{
if (GPIO_GetPinStatus(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)==0)
{
key_press_time_count + +;
}
其他的
{
key_press_time_count = 0;
button_check_start = false;
SysTick - > CTRL & = ~ (SysTick_CTRL_TICKINT_Msk);
app_button_enable ();
返回;
}
如果(key_press_time_count = = 200) / / 2
{
key_press_time_count = 0;
SysTick - > CTRL & = ~ (SysTick_CTRL_TICKINT_Msk);
end_clock = rwble_get_clock ();
button_check_start = false;
systick_stop ();
app_button_enable ();
ke_msg_send_basic (APP_WAKEUP_MSG TASK_APP 0);
}
}
}
各位,我刚接触DA14580,这个芯片比较难懂,想问各位一点问题,我的工程和awesley类似,设备开机后进入睡眠待机,长按2 s工作,以15秒间隔开始广播100 ms,其余时间继续睡眠,长按2 s关机。现场除了按键之外都已经做的好,一开始以为用IO中断就可以唤醒,现在发现程序睡眠时,用IO中断时不能唤醒的,也没有这样的相关例程,还请各位赐教。