你好,
我正在使用完整托管模式的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..。。?
嗨Igotit,
特定的函数只在完全嵌入式系统中定义,但是外部中断的唤醒过程是相同的....你必须配置你的引脚,注册你的回调并启用irq。
谢谢mt_dialog.
亲爱的对话框,
我已将我的系统配置为延长的睡眠模式准备好,似乎可以进入扩展的睡眠模式。但是,我发现系统无法根据我配置为强制唤醒的外部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
}
嗨Liuluan002,
你能解释一下你在做什么吗?一个按下和释放按钮方案是在智能标签参考设计中实现的,你可以看看那个参考设计,并检查是否适合你。
谢谢mt_dialog.
我想要做的是尝试将我的传感器链接在Dice LIS3DH中作为FIFO模式,中断可能会从中断到唤醒模式从睡眠模式读取数据。我也试图为14580创建一个按钮唤醒并完成任务。我正在尝试在SDK5上这样做,但是你的智能标签示例是在SDK3中,它也有很多消息让我处理,并不容易合并到我的应用程序中。能否请你帮忙?
嗨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.
谢谢你,现在它工作了