我用达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);“屏蔽掉,系统也可以正式工作。
要实现我上门提到有什么需要注意的地方吗?用途方法可以是吗?
能否把你的工程发头看下
在你的紊乱基础上,做了一切修改。让按键中的中间在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);
}
}
}
各位,我刚接触da14580,这个芯片比较难懂,想问各位各位问题,我的工程和威斯利类似,设备开启机后睡眠待手机,长按2s工作,以15s间隔开始100ms,其余时间继续睡眠,长按2s网上网。现场除了按键之外都已经好,一级开着用IO中炎就可以唤醒,现处于发布程序时,IO中源时间不吻,也没这样相赐教。