嗨,对话框中,
我的申请的情况是:
我使用外部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(0x001,0x001,1,0);
返回;
}
空白interrupt_Enable2(空白)
{
wkupct_register_callback (wkup_callback_function);
wkupct_enable_irq(0x001,0x001,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
设备:
我们的系统始终通过以下配置将其放入扩展休眠模式
#define 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,输出,pid_gpio,false);- 适用于Pro套件的LED引脚配置PIN
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(空白)
{
if(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,
您可以使用内核定时器并将其设置为在固定的时间间隔内经过(请注意通过中断设置计时器,因为当您强制唤醒时,从中插入并不意味着它立即醒来,您必须发送一个基本向kenrel消息以及消息何时服务以启用计时器,请检查以下常见问题)http://support.dialog-semicondiondiondum/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(空白)
{
if(!(getword16(p2_data_reg)&(1 << 4)))// button2
{
button_flag = 2;
}
如果(! (GetWord16 (P0_DATA_REG) & (1 < < 0))) / / Button1
{
button_flag = 3;
}
if(getBits16(sys_stat_reg,per_is_down))
periph_init();
wkupct_register_callback (press_button);
wkupct_enable_irq(0x100001,0x100001,1,0x00);
}
void user_app_init(void)
{
//初始化制造商特定数据
mnf_data_init();
default_app_on_init();
wkupct_register_callback (press_button);
wkupct_enable_irq(0x100001,0x100001,1,0x00);
}
嗨,对话框中,
如何处理来自P01和P11的中断不同的恢复时间,以及如何使他们处理按钮释放与中断功能,也计算他们按下多长时间。另外,如何确保没有错过任何事件之间的两个引脚?
嗨Liuluan002,
在唤醒控制器中没有硬件可用于不同的恢复值,我认为你应该在sw中实现一些东西,例如,你可以使用systick定时器来采样按钮被按下并确定何时按钮被按下。关于测量按钮按下,不幸的是,内核计时器不返回时间流逝,所以你可以使用硬件计时器或系统,但是,当计时器计数时,您必须保持清醒。您可以使用lld_evt_time_get()来测量按钮被按下的时间,并在按钮被释放时再次轮询计时器。关于两个引脚之间的丢失事件,如果一个引脚处于中断状态,另一个引脚不会发出中断,在这种情况下,你必须轮询唤醒寄存器。
由于MT_dialog
嗨Liuluan002,
您可以查看智能标签参考设计,它有一个实现按钮长按。
由于MT_dialog