你好,支持,
我和devkit pro一起工作,当板上的按钮被按住时,CPU保持活跃。这大大降低了电池寿命。理想情况下,我希望这样的事情发生:
1.配置按钮以触发中断配置低极性。
2.当按下按钮时,将按钮中断设置为基于高极性开火。(松开按钮时将触发)
3.进入睡眠状态,直到按钮被释放。
4.一旦按钮被释放,配置中断为基于低极性(从而重置周期)
除了步骤3之外,上述步骤都运行良好。由于某些原因,当按下按钮时,CPU仍然处于活动状态,这将消耗0.14毫安(这将破坏我的电池寿命)。有可能让地方检察官去睡觉直到(4)发生吗?如果这是不可能的,我可以采取的另一种方法是:
1.配置按钮以触发中断配置低极性。
2.当按下按钮时,我们取消了引脚作为输入的配置,并启动一个50毫秒的计时器。(我在这里假设,如果我们取消配置引脚作为输入,DA将进入睡眠?不确定我们是否可以取消配置一个输入…)
3.50毫秒定时器后,配置引脚为输入,轮询其状态。如果输入仍然是低电平,则重新启动定时器,否则返回(1)。
对这一问题的任何投入都将非常感谢。
设备:
嗨svbutton,
你看到的功耗,我不认为是处理器处于活动状态(因为你还没有调用arch_ble_ext_wakeup_off),如果你检查专业板上的原理图,你会看到按钮是接地的,因为你已经配置了你的580引脚是一个上拉,以得到交易从高到低,你看到的是泄漏对地,而按钮是按下的。关于你的第二个选项,我认为它会工作,你可以重新配置你的引脚,当中断击中GPIO_ConfigurePin,并设置内核定时器和在内核定时器处理程序中重新配置引脚并读取状态。
由于MT_dialog
嗨MT_dialog,
感谢您的快速回复!只要按下按钮就调用GPIO_ConfigurePin来关闭它,关闭它的参数是什么?我是否将其配置为输出,或input_pulldown,或其他什么?我两种都试了,但似乎都不奏效。我应该将它配置为PID_GPIO以外的东西吗?
首先打开按钮,我调用以下命令:
//打开按钮
GPIO_ConfigurePin(MAIN_BUTTON_PORT, MAIN_BUTTON_PIN, INPUT_PULLUP, PID_GPIO, false);
我试着把按钮关掉,但电流似乎还是漏了:
//关闭按钮?
GPIO_ConfigurePin(MAIN_BUTTON_PORT, MAIN_BUTTON_PIN, INPUT_PULLDOWN, PID_GPIO, false);
GPIO_ConfigurePin(MAIN_BUTTON_PORT, MAIN_BUTTON_PIN, OUTPUT, PID_GPIO, false);
嗨svbutton,
尝试下面的代码。
void button_press(void) //按钮的ISR唤醒并设置一个计时器
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
GPIO_ConfigurePin(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, INPUT_PULLDOWN, PID_GPIO, false);
if (ke_state_get(TASK_APP) == APP_CONNECTABLE)
{
arch_ble_ext_wakeup_off ();
Poll_timer = app_easy_timer(5, poll_timer_handler);
}
}
ISR配置引脚为上拉并轮询引脚的状态
{
GPIO_ConfigurePin(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, INPUT_PULLUP, PID_GPIO, false);
如果(GPIO_GetPinStatus (GPIO_BUTTON_PORT GPIO_BUTTON_PIN))
{
user_advertise_operation ();
wkupct_register_callback (button_press);
wkupct_enable_irq(PIN_P11_SEL, PIN_POL_LOW, PIN_EVT_NUM, PIN_DB_TIME);// P1_1,极性低,1事件,去噪时间= 20ms
}
其他的
{
GPIO_ConfigurePin(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, INPUT_PULLDOWN, PID_GPIO, false);
Poll_timer = app_easy_timer(5, poll_timer_handler);
}
}
当您想要进入永久休眠状态时,请停止发布过程,并在广告取消完成时调用arch_ble_ext_wakeup_on()。
由于MT_dialog