嗨对话框,
我的应用情况是:
我正在使用外部SPI传感器作为中断发生器,输出中断高,然后我开始从传感器获取FIFO数据。14580应该处于睡眠模式并节省电力的最多时间。
我尝试使外部中断工作如下。奇怪的事情是中断只是在没有睡觉时工作(LED将被点亮)。当它处于睡眠模式时,存在中断,系统和14580将从开始开始重置。能否请你帮忙?
1.我已经做了两个功能为主要功能时有中断,被称为
void wkup_callback_function(void)
{
gpio_setactive(LED_PORT,LED_PIN);
#if debug_log.
printf_string(“中断按钮11 \ r \ n”);
#万一
wkupct_enable_irq(0×001,0×001,1,0);
返回;
}
void Interrupt_enable2(空白)
{
wkupct_register_callback(wkup_callback_function);
wkupct_enable_irq(0×001,0×001,1,0);
}
2.主要功能的变化
int main_func(void)
{
.......
gpio_setinactive(LED_PORT,LED_PIN);
Interrupt_enable2();
.....
而(1)
{
....
3.设置配置文件
#undef cfg_external_wakeup.
#undef cfg_external_wakeup.
设备:
我们的系统始终通过以下配置将其放入扩展休眠模式
#定义CFG_MEM_MAP_EXT_SLEEP
#undef cfg_mem_map_deep_sleep.
嗨liuluan002,
尝试以你看到LED亮起唤醒时,初始化外设。此外,而不是在主函数中插入代码,你可以使用用户回调函数。例如,您可以初始化中断在user_app_on_init()函数,并重新初始化中断时,在ISR中断命中。
谢谢mt_dialog.
嗨对话框,
似乎系统在睡眠模式下重新启动,并从P00引脚击中中断。你能指导我为什么和如何解决这个问题吗?
嗨liuluan002,
尝试通过按钮实现中断,因为上面指示,检查是否发生了相同的问题。当您说系统重新启动时,中断击中时,您可以在中断发生时执行引导加载程序?当睡眠发生时中断时,您的系统是否会重置平台?请检查以下代码如何在睡眠时在SDK 5上启用中断。
1)保留并在User_periph_setup.c文件中配置GPIO:
保留_GPIO(LED,GPIO_PORT_1,GPIO_PIN_0,PID_GPIO);- gpio_reservations()函数
保留_GPIO(按钮,GPIO_PORT_1,GPIO_PIN_1,PID_GPIO);
GPIO_ConfigurePin(GPIO_PORT_1,GPIO_PIN_0,OUTPUT PID_GPIO,FALSE);- 配置引脚相应的LED引脚为亲套件
GPIO_ConfigurePin(GPIO_PORT_1,GPIO_PIN_1,INPUT_PULLUP,PID_GPIO,FALSE);-相应地配置销钉按钮引脚
注册user_app_init()回调中的呼叫函数
wkupct_register_callback(按_Button);
wkupct_enable_irq(0x200,0x200,1,0x14);
中断的回调函数:
空白_Button(空白)
{
如果(GetBits16(SYS_STAT_REG,PER_IS_DOWN))
periph_init();
wkupct_register_callback(按_Button);
wkupct_enable_irq(PIN_P11_SEL,PIN_POL_LOW,PIN_EVT_NUM,PIN_DB_TIME);// P1_1,极性低,1个事件,去抖动时间= 20毫秒
gpio_setactive(gpio_port_1,gpio_pin_0);
}
谢谢mt_dialog.
谢谢你现在的工作原理。还有一个问题:如何睡觉修复时间,然后唤醒做点什么?
嗨liuluan002,
您可以使用一个内核计时器并将其设置为经过一个固定的时间间隔(要小心,因为与当你强迫BLE醒来并不意味着它会立即唤醒通过中断设置一个计时器,你必须发送一个基本消息给kenrel,当供应的消息,使计时器请检查下面的FAQ)http://support.dialog-semiconductor.com/faq-page#n1508。在SDK 5中,这由app_easy_timer API处理。
谢谢mt_dialog.
嗨对话框,
如果我想在p01和p11上提供vakup,可以是高检测唤醒(p01和p11,带有下拉设置)。同时同时为唤醒按钮。如何制作代码?当我测试它失败时。
嗨liuluan002,
您应该使用wkupct_quadec司机,我不得到你想要醒来的第三只脚,但如果你想从P01和P11醒来然后检查以下行。
保留_GPIO(Button_1,GPIO_PORT_0,GPIO_PIN_1,PID_GPIO);
保留_GPIO(Button_2,GPIO_PORT_1,GPIO_PIN_1,PID_GPIO);
GPIO_ConfigurePin(GPIO_PORT_0,GPIO_PIN_1,INPUT_PULLDOWN,PID_GPIO,FALSE);
gpio_configurepin(gpio_port_1,gpio_pin_1,input_pulldown,pid_gpio,false);
wkupct_register_callback(wakeup_callback_cb);
wkupct_enable_irq(0x202,0x000,0x01,0x1);
在上面的代码中,您可以添加您想要用作Addingal唤醒的按钮的3rd引脚。
谢谢mt_dialog.
谢谢你。我解决了这个问题
嗨对话框,
我现在想用按钮P00来检测按下按钮。现在,我可以检测下面的代码按下按钮,但是我想使申请长按检测,你可以请提供此部分也代码?
空白_Button(空白)
{
如果(!(GetWord16(P2_DATA_REG)(1 << 4)))//将Button2
{
button_flag = 2;
}
if(!(getword16(p0_data_reg)&(1 << 0)))// button1
{
button_flag = 3;
}
如果(GetBits16(SYS_STAT_REG,PER_IS_DOWN))
periph_init();
wkupct_register_callback(按_Button);
wkupct_enable_irq(0x100001,0x100001,1,0×00);
}
空隙user_app_init(无效)
{
//初始化制造商具体数据
mnf_data_init();
default_app_on_init();
wkupct_register_callback(按_Button);
wkupct_enable_irq(0x100001,0x100001,1,0×00);
}
嗨对话框,
如何处理来自P01和P11的中断,同时进行不同的替代时间,也如何使它们与中断功能处理按钮释放也可以计算它们被按下的时间。还如何确保在两个引脚之间没有缺少任何事件?
嗨liuluan002,
在唤醒控制器中没有可用的硬件可用于不同的替代值,我想你应该在SW中实现某些东西,例如,您可以使用Systick Timer来对按下按下按钮并确定按下按钮何时按下按钮。关于测量按钮按下,遗憾的是内核定时器不会返回时间过去,因此您可以使用硬件计时器或Systick,但是在计时器计数时,您必须保持唤醒您可以使用lld_evt_time_get()来测量重新启动按钮时按下按钮并轮询定时器的时间。关于两个引脚之间的缺失事件,如果一个引脚处于中断状态,则另一个引脚不会发出中断,您将必须轮询唤醒寄存器。
谢谢mt_dialog.
嗨liuluan002,
您可以检查智能标签参考设计,它有一个按钮长按下的实现。
谢谢mt_dialog.