1、由于RTX使用了RTC1中断,导致频繁唤醒,无法进入睡眠状态。
2、思路:进入低功耗前,关闭RTC1电源,按键唤醒后重新配置RTC1。
伪代码:
进入低功耗前
1.关闭外设GPIO
nrf_gpio_cfg_default(N);
2.关闭串口
NRF_UART0->ENABLE = 0;
NRF_UART0->POWER = 0;
app_uart_close();
3.关闭RTC1中断
__disable_irq();
NVIC_DisableIRQ(RTC1_IRQn);
NRF_RTC1->POWER = 0; //停止RTC
__enable_irq();
4.设置按键中断
KEY_IRQn_INIT();
/*
内容举例
NRF_GPIO->PIN_CNF[Config_Key1_PORT_PIN] |= (GPIO_PIN_CNF_SENSE_Low << GPIO_PIN_CNF_SENSE_Pos);
NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_PORT_Msk; //使能中断
NVIC_SetPriority(GPIOTE_IRQn, 1); //中断优先级设定为1
NVIC_EnableIRQ(GPIOTE_IRQn); //使能总中断
*/
5.进入睡眠
sd_app_evt_wait();
按键中断函数:
void GPIOTE_IRQHandler(void) //GPIOTE中断服务函数
{
unsigned int expected_time;
if (NRF_GPIOTE->EVENTS_PORT != 0)
{
NRF_GPIOTE->EVENTS_PORT = 0; //中断清零
if (NRF_RTC1->POWER == 0)
{
NVIC_EnableIRQ(RTC1_IRQn);
NRF_RTC1->POWER = 1; //启动RTC
NRF_RTC1->EVENTS_TICK = 1; //启动计数
NRF_RTC1->TASKS_START = 1; //开启计数
NRF_RTC1->PRESCALER = 0x20; //设置时钟基准32768 0x20==32
}
if (nrf_gpio_pin_read(Config_Key5_PORT_PIN) == 0)//检测是否为该按键唤醒
{
}
}
}