嗨对话框,
我的申请情况是:
我使用的是外部SPI传感器中断发生器,它的输出后的中断要高,然后我开始得到来自传感器的FIFO数据。大部分时间在14580应该是在睡眠模式,以节省电力。
我尽量让外部中断工作原理如下。奇怪的事情是,当它是不睡觉的中断唯一的工作(LED会点亮)。当它处于睡眠模式时,有中断,系统和14580将是从一开始就复位。能否请你帮忙?
1.我为主函数做了两个函数,当有中断时将被调用
空隙wkup_callback_function(无效)
{
GPIO_SetActive(LED_PORT,LED_PIN);
#如果DEBUG_LOG
printf_string( “中断来BUTTON11 \ r \ n”);
#万一
Wkupct_enable_irq (0x001, 0x001, 1,0);
返回;
}
空隙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,
尝试通过按钮来实现中断正如我上面和内检查指示是否出现同样的问题VE。当你说在系统重新启动时中断命中,你可以看到当中断发生时的引导程序执行?是您的系统会平台复位时,中断睡眠时发生?请检查下面的代码如何睡觉时的SDK 5能中断。
1)储备和配置的GPIO在user_periph_setup.c文件:
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,0×14);
你的中断的回调函数:
空隙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事件,去噪时间= 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提供的wakup是高检测唤醒可用(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的,0×01,为0x1);
在上面的代码,你可以添加按钮的第3脚,你想作为一个addiitional唤醒使用。
谢谢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, 0x00);
}
空白user_app_init(空白)
{
//初始化制造商特定数据
mnf_data_init ();
default_app_on_init ();
wkupct_register_callback(press_button);
Wkupct_enable_irq (0x100001, 0x100001, 1, 0x00);
}
嗨对话框,
如何从P01和P11的中断处理的不同去抖动时间,还如何让他们对付按钮释放与中断功能还要计算他们是如何长按。同时如何确保不会错过两个引脚之间的任何事件?
嗨liuluan002,
有没有可用于唤醒控制器不同的去抖动值的硬件,我想你应该实现在西南的东西,例如,你可以使用系统定时器定时采样按钮按下,当按一定的按钮决定。关于测量按下按钮,不幸的是,内核定时器不返回时间的流逝,这样你就可以使用一个硬件定时器或系统定时器,但你必须在定时器计数的,你可以使用lld_evt_time_get()来衡量,以保持清醒当再次按下按钮和poll计时器按钮时relased的时间。关于两个引脚之间的失踪事件,如果一个引脚处于中断状态的其他引脚不会发出中断,你将不得不轮询唤醒寄存器这种情况。
谢谢mt_dialog.
嗨liuluan002,
您可以检查智能标记参考设计,它有一个按钮,长按实现。
谢谢mt_dialog.