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