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

7个帖子/ 0新
最后一篇
我知道了
离线
最后一次露面:4年8个月前
加入: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;
#如果DEVELOPMENT_DEBUG
/ /设置端口为EXT_WAKEUP_GPIO, (GPIO_PORT) port, (GPIO_PIN) pin, PID_GPIO);
# endif
if(极性== 0)//高电平
GPIO_ConfigurePin((GPIO_PORT) port, (GPIO_PIN) pin, INPUT_PULLUP, PID_GPIO, false);/ /活性低。将default设置为输入高。
否则//活动高
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.在我的情况下,我使用完全托管模式的DSPS (I。e !BLE_APP_PRESENT = 0)。
我可以实现gpio唤醒,如果我只是改变所有的#if ((EXTERNAL_WAKEUP) && (!BLE_APP_PRESENT))#if(外部_wakeup)

3.我是否应该实现另一种方法http://support.dialog-semiconductor.com/how-can-i-handle-external-interr..。。?

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

嗨Igotit,

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

谢谢mt_dialog.

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

亲爱的对话框,

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

我已经改变了我的主要功能。与app_init_func()一起添加到休眠部分

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

int main_func(空白)
{

//

sleep_mode_t sleep_mode;

//全球初始化
system_init ();

spi_lis3dh_peripherall_init();

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

//下面添加块
#if(USE_WDOG)
SetWord16 (WATCHDOG_REG 0 xc8);// 200 * 10.24ms =〜2sec活跃时间!
setword16(WatchDog_Ctrl_reg,0);//当计数器到达0时生成NMI,并且在达到-16时重置WDOG(SYS)!
// WDOG可以通过SW冻结!
SetWord16 (RESET_FREEZE_REG FRZ_WDOG);/ /开始WDOG
其他#
setword16(set_freeeze_reg,frz_wdog);
# endif

#if(USE_WDOG)
SetWord16 (WATCHDOG_REG 0 xc8);// 200 * 10.24ms初始化的活动时间!
SetWord16 (RESET_FREEZE_REG FRZ_WDOG);/ /开始WDOG
# endif

而(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 (LEDRED_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”);
# endif

//关掉收音机和任何允许的东西
Arch_Goto_Sleep(Sleep_Mode);

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

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

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

if((!ble_app_present)&& check_gtl_state())||
(ble_app_present))
//等待中断恢复操作
注射用水();

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

//下面添加块
#if(USE_WDOG)
SetWord16 (WATCHDOG_REG 0 xc8);/ /重置WDOG !200 * 10.24ms正常模式激活时间!
# endif
}
}

空白app_button_press_cb(空白)
{

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

#if ble_prox_reporter.
如果(alert_state。级! = 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 ();
}
# endif

/*按下按钮,启动3秒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);
# endif

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);
# endif

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.
离线
最后一次露面:4个月2周前
职员
加入:2015-06-08 34
嗨Liuluan002,

嗨Liuluan002,

你能解释一下你在做什么吗?一个按下和释放按钮方案是在智能标签参考设计中实现的,你可以看看那个参考设计,并检查是否适合你。

谢谢mt_dialog.

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

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

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

嗨Liuluan002,

智能标签虽然是在SDK3上,你所需要的只是按钮按下/释放实现,只是检查app_button_press_cb app_button_release_cb app_init_func唤醒启用中断的()当按钮被按下唤醒中断触发初始化时相反的极性(触发当按钮被unpressed)和按钮状态存储在一个变量(app_button_status)。除此之外,还会启动一个定时器来轮询按钮的状态(在3秒后擦除flash中的数据)。所使用的函数与SDK5几乎相同。

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

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

谢谢mt_dialog.

Liuluan002.
离线
最后一次露面:8个月17个小时前
加入:2015-11-27 14:24
谢谢你,现在它工作了

谢谢你,现在它工作了