嗨对话框,
我的申请情况如下:
我正在使用外部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(0x001,0x001,1,0);
返回;
}
void Interrupt_enable2(空白)
{
wkupct_register_callback(wkup_callback_function);
wkupct_enable_irq(0x001,0x001,1,0);
}
2.主要功能的变化
int main_func(无效)
{
.......
gpio_setinactive(LED_PORT,LED_PIN);
Interrupt_enable2();
.....
而(1)
{
....
3.设置配置文件
#undef cfg_external_wakeup.
#undef cfg_external_wakeup.
设备:
我们的系统始终通过以下配置将其放入扩展休眠模式
#定义CFG\u MEM\u MAP\u EXT\u SLEEP
#undef cfg_mem_map_deep_sleep.
你好,刘銮002,
尝试在醒来时初始化外围设备,以便看到led亮起。也可以使用用户回调函数,而不是在主函数中插入代码。例如,您可以在user_app_on_init()函数中初始化中断,并在中断到达ISR时重新初始化中断。
谢谢mt_dialog.
嗨对话框,
似乎系统在睡眠模式下重新启动,并从P00引脚击中中断。你能指导我为什么和如何解决这个问题吗?
你好,刘銮002,
尝试通过按钮实现中断,因为上面指示,检查是否发生了相同的问题。当您说系统重新启动时,中断击中时,您可以在中断发生时执行引导加载程序?当睡眠发生时中断时,您的系统是否会重置平台?请检查以下代码如何在睡眠时在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_配置引脚(GPIO_端口_1,GPIO_引脚_0,输出,PID_GPIO,假);-为pro套件配置相应的引脚LED引脚
GPIO_配置引脚(GPIO_端口_1,GPIO_引脚_1,输入_上拉,PID_GPIO,错误)-相应地配置销钉按钮引脚
注册user_app_init()回调中的呼叫函数
wkupct_register_callback(按_Button);
wkupct_enable_irq(0x200,0x200,1,0x14);
中断的回调函数:
空白_Button(空白)
{
if(GetBits16(系统状态寄存器,PER向下))
periph_init();
wkupct_register_callback(按_Button);
wkupct_enable_irq(引脚P11_SEL,引脚POL_LOW,引脚EVT_NUM,引脚DB_TIME);//P1_1,极性低,1个事件,去抖动时间=20ms
gpio_setactive(gpio_port_1,gpio_pin_0);
}
谢谢mt_dialog.
谢谢你,现在可以了。一more question: how to sleep for a fix period of time, then wakeup to do something?
你好,刘銮002,
您可以使用内核计时器,并将其设置为在固定的时间间隔内运行(请小心通过中断设置计时器,因为当您强制BLE唤醒时,并不意味着它立即唤醒,您必须向kenrel发送一条基本消息,当消息被提供以启用计时器时,请查看以下常见问题解答)http://support.dialog-semiconductor.com/faq-page#n1508。在SDK 5中,这由app_easy_timer API处理。
谢谢mt_dialog.
嗨对话框,
如果我想在p01和p11上提供vakup,可以是高检测唤醒(p01和p11,带有下拉设置)。同时同时为唤醒按钮。如何制作代码?当我测试它失败时。
你好,刘銮002,
您应该使用wkupct_quadec驱动程序,我没有您想要唤醒的第三个pin,但是如果您想要从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_配置引脚(GPIO_端口_0,GPIO_引脚_1,输入_下拉,PID_GPIO,错误);
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))//按钮2
{
button_flag = 2;
}
if(!(getword16(p0_data_reg)&(1 << 0)))// button1
{
button_flag = 3;
}
if(GetBits16(系统状态寄存器,PER向下))
periph_init();
wkupct_register_callback(按_Button);
wkupct启用irq(0x100001、0x100001、1、0x00);
}
作废用户\应用\初始化(作废)
{
//初始化特定于制造商的数据
mnf_data_init();
_init()上的默认_app_;
wkupct_register_callback(按_Button);
wkupct启用irq(0x100001、0x100001、1、0x00);
}
嗨对话框,
如何处理来自P01和P11的中断,同时进行不同的替代时间,也如何使它们与中断功能处理按钮释放也可以计算它们被按下的时间。还如何确保在两个引脚之间没有缺少任何事件?
你好,刘銮002,
在唤醒控制器中没有可用的硬件可用于不同的替代值,我想你应该在SW中实现某些东西,例如,您可以使用Systick Timer来对按下按下按钮并确定按下按钮何时按下按钮。关于测量按钮按下,遗憾的是内核定时器不会返回时间过去,因此您可以使用硬件计时器或Systick,但是在计时器计数时,您必须保持唤醒您可以使用lld_evt_time_get()来测量重新启动按钮时按下按钮并轮询定时器的时间。关于两个引脚之间的缺失事件,如果一个引脚处于中断状态,则另一个引脚不会发出中断,您将必须轮询唤醒寄存器。
谢谢mt_dialog.
你好,刘銮002,
您可以检查智能标签参考设计,它有一个按钮长按下的实现。
谢谢mt_dialog.