嗨,对话框中,
我的应用情况是:
我使用外部SPI传感器作为中断发生器,当它输出高中断后,我开始从传感器获得FIFO数据。14580的大部分时间应处于睡眠模式,以节省电力。
我尝试使外部中断工作如下。奇怪的是,这种干扰只有在不睡觉的时候才会起作用(LED会点亮)。当它处于睡眠模式时,一旦出现中断,系统和14580将从一开始复位。你能帮忙吗?
1.我已经做了两个功能为主要功能时有中断,被称为
空白wkup_callback_function(空白)
{
GPIO_SetActive (LED_PORT LED_PIN);
#如果DEBUG_LOG
printf_string(“中断BUTTON11 \ r \ n”);
# endif
wkupct_enable_irq(0×001,0×001,1,0);
返回;
}
空白interrupt_Enable2(空白)
{
wkupct_register_callback (wkup_callback_function);
wkupct_enable_irq(0×001,0×001,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_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_peripher_setup .c文件中保留和配置GPIO:
Reserve_gpio (led, gpio_port_1, gpio_pin_0, pid_gpio);——Gpio_reservations()函数
Reserve_gpio (button, 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 (press_button);
Wkupct_enable_irq (0x200, 0x200, 1, 0x14);
中断的回调函数:
空白press_button(空白)
{
如果(GetBits16(SYS_STAT_REG,PER_IS_DOWN))
periph_init();
wkupct_register_callback (press_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可用,以高检测唤醒可用(P01和P11与下拉设置)。同时P00为唤醒按钮。请问如何为它制作代码?当我测试失败时。
嗨Liuluan002,
您应该使用wkupct_quadec司机,我不得到你想要醒来的第三只脚,但如果你想从P01和P11醒来然后检查以下行。
Reserve_gpio (button_1, gpio_port_0, gpio_pin_1, pid_gpio);
Reserve_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);
在上面的代码中,你可以添加你的按钮的第3针,你想使用作为额外的唤醒。
由于MT_dialog
谢谢你!我已经解决了这个问题
嗨,对话框中,
我现在想用按钮P00来检测按下按钮。现在,我可以检测下面的代码按下按钮,但是我想使申请长按检测,你可以请提供此部分也代码?
空白press_button(空白)
{
如果(!(GetWord16(P2_DATA_REG)(1 << 4)))//将Button2
{
button_flag = 2;
}
如果(! (GetWord16 (P0_DATA_REG) & (1 < < 0))) / / Button1
{
button_flag = 3;
}
如果(GetBits16(SYS_STAT_REG,PER_IS_DOWN))
periph_init();
wkupct_register_callback (press_button);
wkupct_enable_irq(0x100001,0x100001,1,0×00);
}
空隙user_app_init(无效)
{
//初始化制造商具体数据
mnf_data_init();
default_app_on_init();
wkupct_register_callback (press_button);
wkupct_enable_irq(0x100001,0x100001,1,0×00);
}
嗨,对话框中,
如何处理来自P01和P11的中断不同的恢复时间,以及如何使他们处理按钮释放与中断功能,也计算他们按下多长时间。另外,如何确保没有错过任何事件之间的两个引脚?
嗨Liuluan002,
在唤醒控制器中没有硬件可用于不同的恢复值,我认为你应该在sw中实现一些东西,例如,你可以使用systick定时器来采样按钮被按下并确定何时按钮被按下。关于测量按钮按下,不幸的是,内核计时器不返回时间流逝,所以你可以使用硬件计时器或系统,但是,当计时器计数时,您必须保持清醒。您可以使用lld_evt_time_get()来测量按钮被按下的时间,并在按钮被释放时再次轮询计时器。关于两个引脚之间的丢失事件,如果一个引脚处于中断状态,另一个引脚不会发出中断,在这种情况下,你必须轮询唤醒寄存器。
由于MT_dialog
嗨Liuluan002,
您可以查看智能标签参考设计,它有一个实现按钮长按。
由于MT_dialog