你好,
我在完全托管模式下使用dsp。
我应该将gpio唤醒功能添加到DSPS中。
我发现DSPS代码已经在Arch_System.C中实现了外部唤醒功能,如以下代码。
#if ((EXTERNAL_WAKEUP) && (!BLE_APP_PRESENT)) //只在全嵌入式设计
/ **
****************************************************************************************
* @brief启用外部唤醒GPIO中断。
* @param[在]GPIO_PORT。外部唤醒信号的GPIO端口
* @param[在]GPIO_PIN。外部唤醒信号的GPIO管脚
* @param[在]极性。外部唤醒中断的极性。0 =活性低。1 =活性高
* @return空白。
****************************************************************************************
* /
ext_wakeup_enable(uint32_t port, uint32_t pin, uint8_t极性)
{
rwip_env.ext_wakeup_enable = 2;
#if development_debug.
保留_gpio(ext_wakeup_gpio,(gpio_port)端口,(gpio_pin)pin,pid_gpio);
#万一
If(极性== 0)//有效低
gpio_configurepin((gpio_port)端口,(gpio_pin)引脚,input_pullup,pid_gpio,false);//电源低。设置默认值以输入高。
否则//主动高
GPIO_ConfigurePin((GPIO_PORT) port, (GPIO_PIN) pin, INPUT_PULLDOWN, PID_GPIO, false);/ /活性高。设置默认为低输入。wkupct_register_callback (ext_wakeup_cb);
wkupct_enable_irq (1 <
的问题。
1.以上的GPIO唤醒功能在DSPS中是否只适用于全嵌入式设计?
2.在我的情况下,我正在使用完整托管模式的DSP(即BLE_APP_PRESENT等于0)。
如果我只是改变了所有的全部,我可以实现GPIO唤醒吗?#if((hyperent_wakeup)&&(!ble_app_present))
来#如果(EXTERNAL_WAKEUP)
.
或者
3. Sholld我实施了另一种方法http://support.dialog-semicondiondiondum/how-can-i-handle-external-inter ....?
嗨igotit,
特定功能仅在完全嵌入式系统中定义,但是来自外部中断的唤醒过程是相同的....您必须配置引脚,注册回调并启用IRQ。
由于MT_dialog
亲爱的对话框,
我已经将我的系统配置为扩展睡眠模式,似乎它可以进入扩展睡眠模式。但是我发现系统无法按照我配置的外部GPIO强制唤醒。我所做的改变是基于SDK5和“ble_app_barebone”项目
我改变了我的主要功能。在睡眠部件中添加app_init_func()
我还添加了这三个函数到user_barebone.c文件。
int main_func(void)
{
//
sleep_mode_t sleep_mode;
/ /全局初始化
system_init();
spi_lis3dh_peripheral_init ();
#如果DEBUG_LOG
// 2015-1-8
printf_string(“device_init \ r \ n”);
#万一
//添加了下面的块
#如果(USE_WDOG)
SetWord16 (WATCHDOG_REG 0 xc8);// 200 * 10.24ms = ~2秒激活时间!
SetWord16 (WATCHDOG_CTRL_REG 0);//当counter达到0时生成一个NMI,当它达到-16时重置WDOG (SYS) !
// WDOG可以被SW冻结!
setword16(reset_freeeze_reg,frz_wdog);//开始wdog.
#别的
SetWord16 (SET_FREEZE_REG FRZ_WDOG);
#万一
#如果(USE_WDOG)
SetWord16 (WATCHDOG_REG 0 xc8);// 200 * 10.24ms初始化活动时间!
setword16(reset_freeeze_reg,frz_wdog);//开始wdog.
#万一
而(1)
{
{做
//调度所有挂起的事件
schedule_while_ble_on ();
}
而((app_asynch_proc ()));//将控制权限授予应用程序,尝试关闭电源
//如果应用程序返回GOTO_SLEEP
/ / ((STREAMDATA_QUEUE) & & stream_queue_more_data ()));//将控制权限授予拖缆,尝试关闭电源
//如果应用程序返回GOTO_SLEEP
//等待中断,如果允许这样做,请睡觉
如果(((! BLE_APP_PRESENT) & & (check_gtl_state ())) | |
(BLE_APP_PRESENT))
{
/ /禁用中断
GLOBAL_INT_STOP ();
app_asynch_sleep_proc ();
gpio_setinactive(LEDID_PORT,LEDGREEN_PIN);
GPIO_SetInactive (LEDGREEN_PORT LEDGREEN_PIN);
sleep_mode = rwip_power_down();
if((sleep_mode == mode_ext_sleep)||(sleep_mode == mode_deep_sleep)))
{
// 0208
app_init_func ();
#如果DEBUG_LOG
printf_string(“mode_ext_sleep \ r \ n”);
#万一
//关闭收音机,无论允许的内容
arch_goto_sleep (sleep_mode);
//等待中断恢复操作
WFI();
//恢复操作
arch_resume_from_sleep ();
}
Else if (sleep_mode == mode_idle)
{
#如果DEBUG_LOG
printf_string(“空闲模式\ r \ n”);
#万一
|| . if (((!BLE_APP_PRESENT) && check_gtl_state())
(BLE_APP_PRESENT))
//等待中断恢复操作
WFI();
}
/ /恢复中断
global_int_start();
}
//添加了下面的块
#如果(USE_WDOG)
SetWord16 (WATCHDOG_REG 0 xc8);//重置wdog!200 * 10.24ms正常模式的活动时间!
#万一
}
}
void app_button_press_cb(void)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
#如果BLE_PROX_REPORTER
if(alert_state.lvl!= proxr_alert_none)
{
app_proxr_alert_stop();
}
#endif // ble_prox_reporter.
#如果BLE_FINDME_LOCATOR
if (ke_state_get(TASK_FINDL)) == FINDL_CONNECTED
{
app_findl_set_alert();
}
#万一
/ *按下按钮,启动3SEC GURD定时器以检测按钮长按
**和恢复按钮GPIO的极性,以检测释放
* /
wkupct_register_callback(app_button_release_cb);
Wkupct_enable_irq (0x001, 0x001, 1, 0x14);// P1_1,极性低,1事件,去噪时间= 20ms
app_button_status = 1;
#如果DEBUG_LOG
printf_string(“\ r \ nButton出版社”);
UART2_INIT(UART_BAUDRATE_115K2,3);
#万一
if(ke_state_get(TASK_APP) == APP_CONNECTABLE)
{
//只有在广告模式下才会醒来。只有在ADV模式下,用户才能清除绑定数据。
app_ble_force_wakeup ();
app_ble_ext_wakeup_off ();
GPIO_SetActive (LEDRED_PORT LEDGREEN_PIN);
//向Task_App发送消息。当ble醒来时,我们应该设置计时器app_button_press_timer
// ke_msg_send_basic(app_wakeup_msg,task_app,null);
app_easy_wakeup ();
}
/ * * /
}
空白app_button_release_cb(空白)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
//释放按钮,停止APP_BUTTON_PRESS_TIMER gurd timer
//并在按钮上还原极性GPIO以检测按钮按下
wkupct_register_callback (app_button_press_cb);
wkupct_enable_irq(0x001,0x000,1,0x14);// p0_0,极性高,1个事件,debouncing time = 20ms
app_button_status = 0;
#如果DEBUG_LOG
printf_string(“\ r \ nbutton发布”);
UART2_INIT(UART_BAUDRATE_115K2,3);
#万一
if(ke_state_get(TASK_APP) == APP_CONNECTABLE)
{
//只有在广告模式下才会醒来。只有在ADV模式下,用户才能清除绑定数据。
app_ble_force_wakeup ();
app_ble_ext_wakeup_off ();
GPIO_SetActive (LEDRED_PORT LEDGREEN_PIN);
//发送消息给TASK_APP。当BLE处于清醒状态时,我们应该清除计时器APP_BUTTON_PRESS_TIMER
// ke_msg_send_basic(app_wakeup_msg,task_app,null);
app_easy_wakeup ();
}
}
空白app_init_func(空白)
{
# ifdef CFG_EXTERNAL_WAKEUP
//设置按钮唤醒中断
wkupct_register_callback (app_button_press_cb);
Wkupct_enable_irq (0x200, 0x000, 1, 0x14);// P1_1,极性高,1事件,去噪时间= 20ms
#endif // wkup_enabled.
}
嗨liuluan002,
你能澄清你想要做的事情吗?按下和释放按钮方案在智能标签参考设计中实现,您是否可以查看参考设计并检查是否适合您。
由于MT_dialog
我尝试做的是尝试连接我的传感器,它是在你的骰子LIS3DH FIFO模式,中断可以从中断中出来,从睡眠模式唤醒14580读取数据。我还试图为14580创建一个按钮来唤醒并完成任务。我尝试在SDK5上做这个,但是你的智能标签例子是在SDK3,它也有很多消息要我处理,不容易合并到我的应用程序。你能帮忙吗?
嗨liuluan002,
智能标签虽然它是在SDK3上所需的是按钮按/发布实现,只需检查APP_BUTTON_PRESS_CB和APP_BUTTON_RELEASE_CB,在APP_INIT_FUNC()中启用了唤醒中断,当按下该按钮时,唤醒中断被重新安装以触发相反的触发极性(触发按钮未遵循的按钮),按钮状态存储在变量(App_Button_Status)中。除此之外,启动计时器以轮询按钮的状态(3秒后擦除闪存中的数据)。使用的功能与SDK5几乎相同。
你也可以看看你的另一篇文章,如何在580处于睡眠模式时触发外部中断。
http://support.dialog-semicondiondiondum/external-proximity-reporter-ap -...
由于MT_dialog
谢谢你现在的工作