4个帖子/ 0新
最后一篇
威斯利
离线
最后一次露面:3年2个月前
加入:2015-07-07 12:08
按键唤醒

我用达DA14580做一个,需要实现这样的功能:
1,如果da14580在睡眠睡眠,按键长按2s,蓝牙广播;如果da14580在广播状态,按键a长按2s,系统睡眠。

int app_wakeup_handler(ke_msg_id_t const msgid,
void * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{

if(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();

}
}

void app_button_enable(void)
{
wkupct_register_callback(app_button_press_process);

if(gpio_getpinstatus(gpio_button_port,gpio_button_pin))
{
wkupct_enable_irq(0x200,0x200,1,40);// p1_1,极性低,1个事件,脱嘴时间= 40ms
}

}

void app_button_press_process(void)
{
if(getBits16(sys_stat_reg,per_is_down))
{
periph_init();
}

if(app_ble_ext_wakeup_get())
{

//唤醒这里的ble

#if(ext_sleep_enabled)
app_set_extended_sleep();
#elif(deep_sleep_enabled)
app_set_deep_sleep();
#别的
app_disable_sleep();
#万一

setbits32(gp_control_reg,ble_wakeup_req,1);
app_ble_ext_wakeup_off();

}

app_button_enable();
systick_config(160000-1);
}

void systick_handler(void)
{

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);

}

if(power_on_flag == 1)
{

if(key_press_time_count == 300)// 3s
{
key_press_time_count = 0;
systick-> ctrl&=〜(systick_ctrl_tickint_msk);
ke_msg_send_basic(app_wakeup_msg,task_app,0);

}
}
别的
{
if(key_press_time_count == 200)// 2s
{
key_press_time_count = 0;
systick-> ctrl&=〜(systick_ctrl_tickint_msk);
ke_msg_send_basic(app_wakeup_msg,task_app,0);
}
}

}

我现在是:在睡眠状态下,我如果按按键的时间小于2s(本次可以进入app_button_press_process),那么我再次按键程序没有进入app_button_press_process oces。


小于2s程序会传播Systick_Handler中的这段
{

key_press_time_count = 0;
app_button_enable();
systick-> ctrl&=〜(systick_ctrl_tickint_msk);

}

我要如果段程序中的“systick-> ctrl&=〜(systick_ctrl_tickint_msk);“屏蔽掉,系统也可以正式工作。

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

关键词:
设备:
Jelphi.
离线
最后一次露面:7个月2周前
职员
加入:2015-09-10 12:07
能否把你的工程发头看下

能否把你的工程发头看下

snowdream1.
离线
最后一次露面:9个月1周前
职员
加入:2014-08-17 14:25
在你的演数基础上,做了一切修改

在你的紊乱基础上,做了一切修改。让按键中的中间在systick中间没跑完之前不要。户外是用来了systick_start和systick_stop。

Bool Button_Check_Start = false;
uint32_t start_clock = 0;
uint32_t end_clock = 0;

void app_button_press_cb(void)
{

if(getBits16(sys_stat_reg,per_is_down))
periph_init();

if(app_ble_ext_wakeup_get())
{

//唤醒这里的ble

#if(ext_sleep_enabled)
app_set_extended_sleep();
#elif(deep_sleep_enabled)
app_set_deep_sleep();
#别的
app_disable_sleep();
#万一

setbits32(gp_control_reg,ble_wakeup_req,1);
app_ble_ext_wakeup_off();

ke_msg_send_basic(app_wakeup_msg,task_app,0);
}

/ *添加开始* /
if(button_check_start == false)
{
start_clock = rwble_get_clock();
button_check_start = true;

systick_start(16000,true);
// systick_config(160000-1);
}
/ *添加结尾* /

app_button_enable();

}

void app_button_enable(void)
{

if(button_check_start == false)
{
wkupct_register_callback(app_button_press_cb);
if(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_polarity(gpio_button_port,gpio_button_pin,wkupct_pin_polarity_low),//极性低
1,// 1事件
40);// debouncing time = 0
}

}

.....

void systick_handler(void)
{
if(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();
返回;
}

if(key_press_time_count == 200)// 2s
{
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,这个芯片比较难懂,想问各位各位问题,我的工程和威斯利类似,设备开启机后睡眠待手机,长按2s工作,以15s间隔开始100ms,其余时间继续睡眠,长按2s网上网。现场除了按键之外都已经好,一级开着用IO中炎就可以唤醒,现处于发布程序时,IO中源时间不吻,也没这样相赐教。