本帖最后由 peng19106 于 2024-11-6 14:28 编辑
现在开发的项目需要低功耗,现在的工作逻辑是:无动作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);
}
|