DSP,如何在完整托管模式下实现外部GPIO唤醒。

7个帖子/ 0新
最后一篇
我知道了
离线
最后一次露面:4年6个月前
加入:2015-03-16 03:52
DSP,如何在完整托管模式下实现外部GPIO唤醒。

你好,

我正在使用完整托管模式的DSP。

我应该将GPIO唤醒功能添加到DSP中。

我发现DSPS代码已经在Arch_System.c中实现了外部唤醒功能,如以下代码。

#if((external_wakeup)&&(!ble_app_present))//只有完整的嵌入式设计
/ **
****************************************************************************************
* @brief启用外部唤醒GPIO中断。
* @param [in] gpio_port。外部唤醒信号的GPIO端口
* @param [in] gpio_pin。外部唤醒信号的GPIO引脚
* @param [in]极性。外部唤醒中断的极性。0 =电源低。1 =活跃高
* @return void。
****************************************************************************************
* /
void ext_wakeup_enable(uint32_t端口,uint32_t pin,uint8_t极性)
{
rwip_env.ext_wakeup_enable = 2;
#if development_debug.
Letail_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)端口,(gpio_pin)引脚,input_pulldown,pid_gpio,false);//主动高。将默认值设置为低电平。

wkupct_register_callback(ext_wakeup_cb);

wkupct_enable_irq(1 <

问题。
1. DSP中的上述GPIO唤醒功能仅适用于全嵌入式设计?
2.在我的情况下,我正在使用完整托管模式(即!ble_app_present等于0)的DSP。
如果我只是改变了所有的全部,我可以实现GPIO唤醒吗?#if((hyperent_wakeup)&&(!ble_app_present))#if(外部_wakeup)
或者
3. Sholld我实施了另一种方法http://support.dialog-semicondiondiondum/how-can-i-handle-external-inter ...。?

设备:
mt_dialog.
离线
最后一次露面:2个月2周前
职员
加入:2015-06-08 11:34
嗨Igotit,

嗨Igotit,

特定函数仅在完全嵌入式系统中定义,但外部中断的唤醒过程是相同的....您必须配置引脚,注册回调并启用IRQ。

谢谢mt_dialog.

Liuluan002.
离线
最后一次露面:6个月5天前
加入:2015-11-27 14:24
亲爱的对话框,

亲爱的对话框,

我已将我的系统配置为延长的睡眠模式准备好,似乎可以进入扩展的睡眠模式。但是,我发现系统无法根据我配置为强制唤醒的外部GPIO。我改变了什么是基于SDK5和“BLE_APP_BAREBONE”的项目

我改变了我的主要功能。在睡眠部分中添加了app_init_func()

我还添加了我还在user_barebone.c文件中添加了这三个函数。

int main_func(void)
{

//

sleep_mode_t sleep_mode;

//全球初始化
system_init();

spi_lis3dh_peripherall_init();

#if debug_log.
// 2015-1-8
printf_string(“device_init done \ r \ n”);
#万一

//添加了下面的块
#if(use_wdog)
setword16(WatchDog_reg,0xC8);// 200 * 10.24ms =〜2sec活跃时间!
setword16(WatchDog_Ctrl_reg,0);//当计数器到达0时生成NMI,并且在达到-16时重置WDOG(SYS)!
// WDOG可以通过SW冻结!
setword16(reset_freeeze_reg,frz_wdog);//启动wdog.
#别的
setword16(set_freeeze_reg,frz_wdog);
#万一

#if(use_wdog)
setword16(WatchDog_reg,0xC8);// 200 * 10.24ms初始化的活动时间!
setword16(reset_freeeze_reg,frz_wdog);//启动wdog.
#万一

而(1)
{

做 {
//安排所有待处理的事件
schedule_hile_ble_on();
}
而((app_asynch_proc())));//授予控件到应用程序,尝试掉电
//如果应用程序返回goto_sleep
//((streeData_queue)&& stree_queue_more_data()));//授予对拖缆的控制,尝试向下掉电
//如果应用程序返回goto_sleep
//等待中断,如果允许这样做,请睡觉
if(((!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();

#if debug_log.
printf_string(“mode_ext_sleep \ r \ n”);
#万一

//关闭收音机,无论允许的信息
Arch_Goto_Sleep(Sleep_Mode);

//等待中断恢复操作
WFI();

//恢复操作
ARCH_RESUME_FROM_SLEEP();
}
否则if(sleep_mode == mode_idle)
{

#if debug_log.
printf_string(“空闲模式\ r \ n”);
#万一

if((!ble_app_present)&& check_gtl_state())||
(ble_app_present))
//等待中断恢复操作
WFI();

}
//恢复中断
global_int_start();
}

//添加了下面的块
#if(use_wdog)
setword16(WatchDog_reg,0xC8);//重置wdog!200 * 10.24ms正常模式的活动时间!
#万一
}
}

void app_button_press_cb(void)
{

if(getBits16(sys_stat_reg,per_is_down))
periph_init();

#if ble_prox_reporter.
if(alert_state.lvl!= proxr_alert_none)
{
app_proxr_alert_stop();
}
#endif // ble_prox_reporter.

#if 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;

#if 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(LEDID_PORT,LEDGREEN_PIN);
//向Task_App发送消息。当ble醒来时,我们应该设置计时器app_button_press_timer
// ke_msg_send_basic(app_wakeup_msg,task_app,null);
app_easy_wakeup();
}
/ ** /

}

void app_button_release_cb(void)
{
if(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个事件,脱嘴时间= 20ms

app_button_status = 0;

#if 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(LEDID_PORT,LEDGREEN_PIN);
//向Task_App发送消息。我们应该清除Timer App_Button_Press_Timer时醒来时

// ke_msg_send_basic(app_wakeup_msg,task_app,null);
app_easy_wakeup();
}
}

void app_init_func(void)
{

#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.

}

mt_dialog.
离线
最后一次露面:2个月2周前
职员
加入:2015-06-08 11:34
嗨Liuluan002,

嗨Liuluan002,

你能澄清你想要做的事情吗?在智能标签参考设计中实现了一台压力和释放按钮方案,您是否可以查看该参考设计并检查是否适合您。

谢谢mt_dialog.

Liuluan002.
离线
最后一次露面:6个月5天前
加入:2015-11-27 14:24
我想要做的就是尝试

我想要做的是尝试将我的传感器链接在Dice LIS3DH中作为FIFO模式,中断可能会从中断到唤醒模式从睡眠模式读取数据。我也试图为14580创建一个按钮唤醒并完成任务。我正在尝试在SDK5上这样做,但是你的智能标签示例是在SDK3中,它也有很多消息让我处理,并不容易合并到我的应用程序中。能否请你帮忙?

mt_dialog.
离线
最后一次露面:2个月2周前
职员
加入:2015-06-08 11:34
嗨Liuluan002,

嗨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-app -...

谢谢mt_dialog.

Liuluan002.
离线
最后一次露面:6个月5天前
加入:2015-11-27 14:24
谢谢你现在有效

谢谢你现在有效