打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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)//检测是否为该按键唤醒
        {
            
        }
    }
}
posted on 2022-08-13 11:01  xuejianqiang  阅读(72)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033