查看: 37|回复: 1

CW32L010从休眠模式下唤醒MCU的问题

[复制链接]
  • TA的每日心情

    7 天前
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    292

    主题

    26

    回帖

    2978

    积分

    管理员

    积分
    2978
    发表于 2024-11-12 09:26:03 | 显示全部楼层 |阅读模式
    现在开发的项目需要低功耗,现在的工作逻辑是:无动作10s后,MCU进入休眠模式,然后在用户按下按键后,外部中断唤醒MCU。    在10s计时满足后,关闭定时器,重新配置PB06,用于外部中断唤醒,然后进入休眠模式。
        但是现在遇到一个问题是,进入休眠模式后,外部中断无法唤醒MCU。
        请教一下各位,问题是哪一点,配置外部中断不可用?休眠模式配置不对还是时钟配置问题?
        1.计时满足后,会进入休眠模式

           //关闭相关外设
           // baseTime_disable();
           //MCU进入休眠状态
           key_io_config(GPIO_IT_FALLING);
           rt_thread_delay(10);
           Sys_ctrl_sleep();
        2.定时器关闭,key重配置
    void baseTime_disable(void)
    {
        BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_UPDATE);
        BTIM_Cmd(CW_BTIM1,DISABLE);
        __SYSCTRL_BTIM123_CLK_DISABLE();
    }


    /* key配置 */
    void key_io_config(uint32_t IT_type)
    {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        __SYSCTRL_GPIOB_CLK_ENABLE();
            
            GPIO_DeInit(CW_GPIOB,GPIO_PIN_6);
            //KEY --> PB6
            GPIO_InitStruct.IT = IT_type;                                                //GPIO_IT_NONE                  GPIO_IT_FALLING
            GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;                //GPIO_MODE_INPUT                GPIO_MODE_INPUT_PULLUP
            GPIO_InitStruct.Pins = GPIO_PIN_6;
            GPIO_Init(CW_GPIOB,&GPIO_InitStruct);

            HAL_GPIO_WritePin(CW_GPIOB,GPIO_PIN_6,(GPIO_PinState)GPIO_PIN_SET);
            
            if( IT_type != GPIO_IT_NONE )
            {
                    GPIO_ConfigFilter(CW_GPIOB,  GPIOx_ICR_PIN6_Msk, GPIO_FLTCLK_LSI);
                    // while( PB06_GETVALUE() );
                    GPIOB_INTFLAG_CLR(GPIOx_ICR_PIN6_Msk);
                    NVIC_EnableIRQ(GPIOB_IRQn);
            }
    }



        3.外部中断回调函数
    void GPIOB_IRQHandler(void)
    {
        /* USER CODE BEGIN */
            GPIOB_IRQHandlerCallback();
        /* USER CODE END */
    }


    /* GPIOB外部中断回调函数 */
    void GPIOB_IRQHandlerCallback(void)
    {
            if( REGBITS_GET(CW_GPIOB->ISR, GPIOx_ISR_PIN6_Msk) > 0 )
        {
            GPIOB_INTFLAG_CLR(GPIOx_ICR_PIN6_Msk);
                    sys_para.wakeup = 1;

        }
    }


        4.休眠模式配置
    /**
    **        @brief                进入休眠模式
    **/
    void Sys_ctrl_sleep(void)
    {
        PWR_InitTypeDef     PWR_InitStruct = {0};

            SYSCTRL_GotoSleep();

        sys_para.wakeup = 1;
        MCU_wakeup_peripherals();
    }



    void MCU_wakeup_peripherals(void)
    {
            if( sys_para.wakeup == 0 )
                    return ;
            
            SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV12);
            
            sys_para.wakeup = 0;
            sys_para.status = STATUS_WORK;
            
            GPIO_Port_config();
            baseTime_config(999,3);
    }

  • TA的每日心情

    7 天前
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    292

    主题

    26

    回帖

    2978

    积分

    管理员

    积分
    2978
     楼主| 发表于 2024-11-12 09:27:24 | 显示全部楼层
    1\IT_type的定义是否是GPIO_IT_FALLING?
    这部分内容丢失了,在进入休眠模式前,重设置PB6为外部中断模式了key_io_config(GPIO_IT_FALLING);
    2\HAL_GPIO_WritePin()是什么内容?可以删除它。
    重定义的IO的写函数
    3\SYSCTRL_GotoSleep()是什么内容?
    休眠设置__WFI()这些;
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    友情链接:

    返回顶部 返回列表