你好,
我正在使用DA14580 BLE的基本套件。
板上有两个LED连接。我使用定时器处理器闪烁led和使用PWM控制强度。
在这之后,我修改了睡眠和唤醒按钮(GPIO中断)的代码,下面是我发布的论坛链接。
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。
在按照上面的逻辑开发睡眠和唤醒后工作良好,但修改了睡眠和唤醒的代码后,我面临以下一些问题。
1.LED闪烁处理程序不是完美的工作,以前的工作很好,闪烁已经做随机不按设置定时器处理程序使用“app_easy_timer”函数。
2.我用PWM控制强度,现在PWM行为也是随机的。有时很亮,有时很暗。
我调用了“app_easy_timer”函数在唤醒时创建处理程序,调用“app_easy_timer_cancel”函数在睡眠时取消处理程序。
请问我该如何解决以上问题?
谢谢
设备:
嗨JBaczuk,
当你提到你修改了sleep的代码时,我想你的意思是你已经启用了sleep模式。因为你已经启用了睡眠模式,要知道设备将关闭所有的外围设备,定时器,uarts, spi等为了进入睡眠,如果你设置了定时器或切换LED等,没有任何检查将保持设备清醒。但是要注意的是,当580进入睡眠模式时,它将锁定设备的gpio,这意味着它将保持引脚的状态到它进入睡眠模式之前的状态。所以你看到的是,在每一个唤醒(为了宣传或保持连接),所有的外围设备都被初始化并开始运行,一旦你进入睡眠,PWM关闭,LED保持在睡眠前的状态。为了使PWM正常工作你必须让设备保持清醒,和有关领导你要销的状态保存在一个自定义变量来初始化状态,当设备醒来(580年将保持睡眠的状态,但只要你醒来periph_init函数将在重新启动和运行别针在原来的状态,因此,必须将引脚的状态保存在一个变量中,并在唤醒时在peripher_init函数中应用这个值)。
由于MT_dialog
MT_dialog,
谢谢您的回复。很抱歉,我会澄清我的问题。当我第一次给设备上电时,它立即进入深度睡眠:
arch_set_deep_sleep ();
arch_ble_ext_wakeup_on ();
app_button_enable ();
没有led,定时器,或pwm已经被使用。
然后,当按钮被按下时,我们使用ble_app_sleepmode示例中的代码唤醒设备:
静态孔隙app_button_enable(空白)
{
app_easy_wakeup_set (app_wakeup_cb);
wkupct_register_callback (app_button_press_cb);
GPIO_ConfigurePin(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, INPUT_PULLUP, PID_GPIO, false);
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
40);//恢复时间= 0
}
静态孔隙app_wakeup_cb(空白)
{
if (ke_state_get(TASK_APP) == APP_CONNECTABLE)
{
user_app_adv_start ();
mode = POWER_ON;
led_pattern(模式);
}
}
但是,似乎有什么东西干扰了led。我们有2个led,都使用timer2和pwm2(为1个led)和pwm3(为另一个),当他们循环(开和关每秒钟左右),有些东西关闭他们(约3次每秒)。
我在想是不是睡眠模式影响了计时器。它们只在设备唤醒时初始化,所以我不认为深度睡眠导致它忘记PWM或计时器(它们没有启动,直到设备唤醒)。
嗨JBaczuk,
如上所述,当设备处于睡眠模式(为了只提供BLE事件而唤醒和进入睡眠)时,580将关闭所有外围设备。因此,为了有PWM和计时器工作,没有中断从唤醒和睡眠过程,你将不得不禁用睡眠,而计时器正在运行(你可以通过使用arch_disable_sleep()在运行时做到这一点)。这将保持设备清醒和定时器工作在PWM模式以及。在你完成之后,你可以通过arch_set_deep_sleep()或arch_set_extended_sleep()重新启用睡眠模式。
由于MT_dialog