我正在使用ble_all_in_one示例并为我的功能进行修改。我在set_pad_function()中配置LED GPIO,并尝试在Button_Press_callback中制作GPIO。所以用例是按下按钮时打开LED。现在LED开启,但它在第二次的一小部分中。我不是在代码中转动LED,但似乎DA14583睡觉,由于LED关闭。即使DA14583睡觉,如何使LED保持终止?以下是来自BLE_ALL_IN_ONE示例代码的MODFIED代码:
//在user_periph_setup.c.中
void set_pad_functions(void)//设置GPIO端口功能模式
{
// ...其他现有代码
gpio_configurepin(gpio_red_led_port,gpio_red_led_pin,输出,pid_gpio,false);
gpio_configurepin(gpio_green_led_port,gpio_green_led_pin,输出,pid_gpio,false);
gpio_configurepin(gpio_blue_led_port,gpio_blue_led_pin,输出,pid_gpio,false);
}
//在user_all_in_one.c.中
静态void app_button_press_cb(void)
{
if(getBits16(sys_stat_reg,per_is_down))
{
periph_init();
}
if(arch_ble_ext_wakeup_get()))
{
ARCH_SET_SLEEP_MODE(app_default_sleep_mode);
ARCH_BLE_FORCE_WAKEUP();
ARCH_BLE_EXT_WAKEUP_OFF();
app_easy_wakeup();
}
gpio_setactive(gpio_green_led_port,gpio_green_led_pin);//由我添加
}
请让我知道我在这做了什么吗?
感谢您的帮助。
伊索斯,
你能试着描述一下你想要完成的东西吗?如果我理解正确,您想在DA14580开始广告时打开LED,并且设备应该转到睡眠模式并关闭LED的定时器到期时?如果我误解了什么,请纠正我。如果您意味着可能的解决方案将是以下内容:
请尝试这个,如果您有任何疑问,请告诉我。
谢谢,PM_DIALOG.
当我第一次按下按钮时打开LED并再次按下按钮时关闭LED。现在,按钮按下,LED开启,但随后它自动关闭,因为DA14583睡觉。即使DA14583睡觉,我也希望保持LED。我希望你现在明白问题陈述。如果您想要更多的阐述,请告诉我。
伊索斯,
当您进入睡眠模式时,设备会保留PIN状态,因此在您处于睡眠模式时,LED应保持开启,但在唤醒设备时,设备将运行Periph_init()函数,并且当执行该部分时,它也会执行该部分以默认状态重新配置引脚。因此,为了始终保持LED,您必须在醒来时“记住”引脚的状态,并且当PeripH_Init()函数执行时,您必须重新应用PIN的值睡眠。我告诉你一些澄清的事情。在SDK的BLE_APP_ALL_IN_ONE示例中,设备启动广告以获得10秒的预定义的时间(app_adv_data_update_to)。在定时器到期时,设备停止广告并进入深度睡眠模式。这意味着所有外围设备都会关闭,您可以从唤醒控制器唤醒。根据您的描述,您想在设备广告时打开/ LED?请注意,DA14583将在广告或连接间隔之间转到睡眠模式。 The code snippet that you have posted into your initial post, will turn on the led when the device wake up from the permanent sleep mode.
谢谢,PM_DIALOG.
感谢您的回复。我认为你误解了我的usecase。我不想在广告开始/停止上打开/关闭LED开/关。我的用例与广告无关。按下按钮时,我想打开LED,保持LED直到按下按钮。用户释放按钮时,请关闭LED。我希望这可以澄清我的用例。
因此,您对此线程的最后一个响应不会解决我的usecase的问题。你能给出正确的解决方案吗?
伊索斯,
在user_all_in_one.c文件中,您应该执行以下修改:
Bool LED_FLAG__ATtribute __((部分(“RETENT_MEM_AREA0”),ZERO_INIT));// @retention内存
LED_FLAG =!LED_FLAG;
如果(LED_FLAG == TRUE)
{
gpio_setactive(gpio_led_port,gpio_led_pin);
}
否则if(led_flag == false)
{
gpio_setinactive(gpio_led_port,gpio_led_pin);
}
app_button_enable();
在user_periph_setup.c文件中:
GPIO_CONFIGUREPIN(GPIO_LED_PORT,GPIO_LED_PIN,输出,PID_GPIO,LED_FLAG);
该设备启动广告,它在广告间隔之间睡眠。因此,每次设备唤醒时,将执行BLE_WAKEUP_LP_HANDLLer,如果您检查此致电触发PERIPH_INIT()函数。因此,为了始终保持LED,您必须在醒来时“记住”引脚的状态,并且当PeripH_Init()函数执行时,您必须重新应用PIN的值睡眠。
谢谢,PM_DIALOG.