4个职位/ 0个新
最后发表
awesley
离线
最后看到:3年2个月前
加入:2015-07-07 12:08
按键唤醒

我用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);“屏蔽掉,系统也可以正常工作。

要实现我上门提到的功能有什么需要注意的地方吗?用什么方法可以实现啊?

关键词:
设备:
Jelphi
离线
最后看到:7个月1周前
工作人员
加入:2015-09-10 12:07
能否把你的工程发出来看下

能否把你的工程发出来看下

snowdream1
离线
最后看到:8个月,4个星期前
工作人员
加入:14章25条的2014-08-17
在你的函数基础上,做了一些修改

在你的函数基础上,做了一些修改。让按键的中断在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);


jangwee
离线
最后看到:3年11个月前
加入:2016-07-06 02:39
各位,我刚接触DA14580,这个芯片比较难懂

各位,我刚接触DA14580,这个芯片比较难懂,想问各位一点问题,我的工程和awesley类似,设备开机后进入睡眠待机,长按2 s工作,以15秒间隔开始广播100 ms,其余时间继续睡眠,长按2 s关机。现场除了按键之外都已经做的好,一开始以为用IO中断就可以唤醒,现在发现程序睡眠时,用IO中断时不能唤醒的,也没有这样的相关例程,还请各位赐教。