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

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

你好,

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

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

我发现DSPS代码已经实现了外部唤醒功能,比如arch\u 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;
#如果开发\u调试
保留\u GPIO(EXT \u WAKEUP \u GPIO,(GPIO \u PORT)PORT,(GPIO \u PIN)PIN,PID \u GPIO);
#结束
if(极性== 0)//高电平
GPIO_ConfigurePin((GPIO_PORT)PORT,(GPIO_PIN)PIN,INPUT_PULLUP,PID_GPIO,false);//低电平有效。将默认设置为“输入高”。
else//高电平
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在我的例子中,我使用的是完全托管模式下的DSP(即!BLE\u APP\u PRESENT等于0)。
如果我改变所有的参数,我能实现gpio唤醒吗#如果((外部唤醒)&&(!BLE(应用程序存在)#if(外部_wakeup)
或者
三。我应该实现另一种方法吗http://support.dialog-semiconductor.com/how-can-i-handle-external-interr...。?

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

嗨Igotit,

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

谢谢mt_dialog.

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

亲爱的Dialog,

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

我改变了我的主要职能。在休眠部分添加了app_init_func()

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

int main函数(void)
{

//

sleep_mode_t sleep_mode;

//全球初始化
系统初始化();

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(重置_冻结_寄存器,FRZ _WDOG);//启动WDOG
#其他
setword16(set_freeeze_reg,frz_wdog);
#结束

#if(use_wdog)
setword16(WatchDog_reg,0xC8);// 200 * 10.24ms初始化的活动时间!
SetWord16(重置_冻结_寄存器,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\ U SetInactive(LED红色\ U端口,LED绿色\ U引脚);
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);

//等待中断恢复操作
注射用水();

//恢复操作
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))
//等待中断恢复操作
注射用水();

}
//恢复中断
全局\u INT \u START();
}

//在下面添加了块
#if(use_wdog)
SetWord16(看门狗_REG,0xC8);//重置WDOG!正常模式下200*10.24ms有效时间!
#结束
}
}

无效应用按钮按下cb(无效)
{

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

#if ble_prox_reporter.
如果(alert\u state.lvl!=PROXR(警报\u无)
{
app_proxr_alert_stop();
}
#endif//BLE\u PROX\u报告器

#if ble_findme_locator
if(ke_state_get(task_findl)== findl_connected)
{
app_findl_set_alert();
}
#结束

/*按下按钮,启动3sec gurd定时器检测按钮长按
**并恢复按钮GPIO上的极性以检测释放
*/
wkupct\u register\u callback(应用程序\u按钮\u释放\u 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_波特率_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);
//向任务应用程序发送消息。当BLE唤醒时,我们应该设置定时器应用程序按钮按下定时器
//ke\ u msg\ u send\ u basic(APP\ u WAKEUP\ u msg,TASK\ u 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\U 0,极性高,1个事件,去抖动时间=20ms

app_button_status = 0;

#if debug_log.
printf_字符串(“\r\n按钮释放”);
uart2_init(UART_波特率_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\ u msg\ u send\ u basic(APP\ u WAKEUP\ u msg,TASK\ u 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\u已启用

}

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\u button\u press\u cb和app\u button\u release\u cb。当按下按钮时,唤醒中断在app\u init\u func()中启用。唤醒中断被重新初始化,以相反极性触发(当按钮未按下时触发),按钮状态存储在一个变量中(app\u button\u status)。除此之外,一个定时器被启动来轮询按钮的状态(3秒后清除闪存中的数据)。使用的功能与SDK5几乎相同。

此外,您还可以查看您的其他帖子,以触发外部中断,而580处于睡眠模式。

http://support.dialog-semiconductor.com/external-proximity-reporter-app-...

谢谢mt_dialog.

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

谢谢,现在可以了