我有一个问题,ke_time不是每次都成功执行。
详细:
在SDK 3.0.6中,我使用了一个按钮P23来启动系统。
空白app_button_enable(空白)
{
wkupct_register_callback (app_button_press_cb);
/ /如果!(GPIO_GetPinStatus(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN))) //按钮是p23
Wkupct_enable_irq (0x80000, 0, 1, 10);// P2_3,极性低,1 0x40000
}
在app_button_press_cb(空白)
我添加这个:
havekey_flag = 1;
如果(keytimescn > = 1)
{
keytimescn = 0;
ke_timer_clear (SCAN_KEY_TIMER TASK_APP);
}
keytimescn + +;
if(PW_ON_OFF!=0) //关闭电源
{
/ / ke_timer_init ();
GPIO_SetInactive (GPIO_TI_LED_PORT GPIO_TI_LED_PIN);//进入这里,led是亮的
ke_timer_set (SOTF_PW_TIMER TASK_APP 200);//只在这里调用SOTF_PW_TIMER的函数
/ / app_force_active_mode ();
}
其他的
{//搜索400MS_key
GPIO_SetInactive (GPIO_ALERT_LED_PORT, GPIO_ALERT_LED_PIN);//进入这里,led是亮的
button_type = BUTTONTYPE_400MS;
ke_timer_set (SCAN_KEY_TIMER TASK_APP 40);
/ / app_force_active_mode ();
}
这里我加了味精
enum APP_MSG
{
APP_MODULE_INIT_CMP_EVT = KE_FIRST_MSG (TASK_APP),
SOTF_PW_TIMER,
............
............
}
/*默认状态处理器定义。*/
EXTERN const struct ke_msg_handler app_default_state[] =
{
(ke_msg_func_t) poweron_soft_handler}, {SOTF_PW_TIMER
(ke_msg_func_t) gapm_device_ready_ind_handler}, {GAPM_DEVICE_READY_IND
.............
...........
}
在处理函数:
Int poweron_soft_handler(ke_msg_id_t const msgid,
空白const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
GPIO_SetInactive (GPIO_ALERT_LED_PORT GPIO_ALERT_LED_PIN);//在这里输入。led亮着
{//soft poweron是第一优先级
PW_ON_OFF = 0;
been_tip_flag = 0;
app_adv_start ();
led_been_loop = TIP_LOOP_LEDON;
ke_timer_set (LEN_BEEN_TIP_TIMER TASK_APP 1);
}
ke_timer_clear (SOTF_PW_TIMER TASK_APP);
返回(KE_MSG_CONSUMED);
}
I press key P23 to high one time last 6s {greater than in set here (ke_timer_set(SOTF_PW_TIMER,TASK_APP,200) 2s};
已进入步骤:
GPIO_SetInactive (GPIO_TI_LED_PORT GPIO_TI_LED_PIN);//进入这里,led是亮的
但有时这一步并不在:
GPIO_SetInactive (GPIO_ALERT_LED_PORT GPIO_ALERT_LED_PIN);//在这里输入。led亮着
所以系统不是每次都是开机的。
我的问题是:
ke_timer_set (SOTF_PW_TIMER TASK_APP 200);//只在这里调用SOTF_PW_TIMER的函数
但有时这个函数
poweron_soft_handler
不是叫成功。
为什么?
附加:
我看到了这个
http://support.dialog-semiconductor.com/faq/how-use-ketimer-during-wakeu..。
但在3.0.6没有这个味精
struct create_new_timer_struct *req = KE_MSG_ALLOC(APP_CREATE_NEW_TIMER, TASK_APP, TASK_APP,
create_new_timer_struct);
create_new_timer_struct
和
APP_CREATE_NEW_TIMER
不包括在我使用的SDK(3.0.6)。
你可以遵循以下步骤:
{
uint16_t延迟;
uint16_t task_id;
uint16_t timer_id;
};
在app.h
希望它可以帮助。
或有时输入KE_timer任务函数是延时大于15秒;
或者KE_timer任务函数根本不是动作。
请帮帮我。
非常感谢。
嗨YuanhangWu
你的设备不工作的最可能的原因是,你正试图设置一个ke_timer,而设备还没有被唤醒。当你通过唤醒计时器唤醒你的设备时,没有人保证BLE核心是清醒的,软件计时器是BLE核心的一部分。即使你强制你的BLE唤醒它也不确定定时器是否设置正确,因为它需要一些时间来唤醒核心。作为一个工作,你可以尝试的是首先通过使用app_check_BLE_active()函数来检查BLE是否处于活动状态,然后按照描述设置计时器http://support.dialog-semiconductor.com/faq/how-use-ketimer-during-wakeu..。在这里。您可以添加结构和消息,因为它是由summer20100514描述的。通过这种方式,您将向应用程序发送一条关于创建计时器的消息,并且您肯定地知道,当您调用ke_timer_set时,BLE将被唤醒。
由于MT_dialog
谢谢MT_dialog,
谢谢summer20100514。
在每个ke_timer_set()函数之前,我都要添加这个
如果(app_ble_force_wakeup ())
app_ble_ext_wakeup_off ();
目前没有发现问题。
这样处理的话,隐藏了什么风险?
嗨YuanhangWu,
我们不能确定这将导致的副作用,解决问题的方法是上面描述的。可能发生的情况是,即使执行了app_ble_force_wakeup(),并且BLE启动了唤醒,它也需要一些时间,直到BLE唤醒,这可能会导致与之前相同的问题。这个解决方案的目的是确保当ke_timer_set()被调用时BLE是清醒的,这就是为什么首先要向内核发送一条消息来设置ke_timer。
由于MT_dialog
谢谢MT_dialog summer20100514。
我使用ke_timer_set()作为你之前给出的建议;
当按键按下时,我间隔100ms读取GPIO管脚。
如果也按下,则keytimescn++;
所以我调用ke_timer_set()在ke_timer_func;回调了几次。
但测试结果如下:
有时,ke_timer_set()不运行;
所以我用systick来解决它。
但这不是在睡眠中工作,所以,什么时候按压,我就会醒来直到按压完成。
这样处理的话,隐藏了什么风险?
嗨YuanhangWu,
如果我的理解是正确的,你将在唤醒处理程序中保持da直到你的按钮被释放,在唤醒处理程序中,你将设置systick并开始计数。我能想到的唯一一件事是,你应该确保你的时钟被正确地设置,这样系统就能正确地馈电。否则,你的时机就会不准确。
由于MT_dialog