嗨对话框,
我的申请情况是:
我正在使用外部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_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事件,去噪时间= 20ms
gpio_setactive(gpio_port_1,gpio_pin_0);
}
谢谢mt_dialog.
谢谢,现在它管用了。还有一个问题:如何睡觉修复时间,然后唤醒做点什么?
嗨liuluan002,
您可以使用一个内核计时器,消逝在一个固定的时间间隔(小心通过中断设置一个计时器,因为当你强迫BLE醒来并不意味着它立即醒来,你必须发送消息到一个基本kenrel当消息服务启用定时器请检查以下常见问题)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, 0x00);
}
空白user_app_init(空白)
{
//初始化制造商特定数据
mnf_data_init ();
default_app_on_init ();
wkupct_register_callback(按_Button);
Wkupct_enable_irq (0x100001, 0x100001, 1, 0x00);
}
嗨对话框,
如何处理来自P01和P11的中断,同时进行不同的替代时间,也如何使它们与中断功能处理按钮释放也可以计算它们被按下的时间。还如何确保在两个引脚之间没有缺少任何事件?
嗨liuluan002,
在唤醒控制器中没有可用的硬件可用于不同的替代值,我想你应该在SW中实现某些东西,例如,您可以使用Systick Timer来对按下按下按钮并确定按下按钮何时按下按钮。关于测量按钮按下,遗憾的是内核定时器不会返回时间过去,因此您可以使用硬件计时器或Systick,但是在计时器计数时,您必须保持唤醒您可以使用lld_evt_time_get()来测量重新启动按钮时按下按钮并轮询定时器的时间。关于两个引脚之间的缺失事件,如果一个引脚处于中断状态,则另一个引脚不会发出中断,您将必须轮询唤醒寄存器。
谢谢mt_dialog.
嗨liuluan002,
您可以检查智能标签参考设计,它有一个按钮长按下的实现。
谢谢mt_dialog.