打印
[产品应用]

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

[复制链接]
246|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
peng19106|  楼主 | 2024-11-6 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
}

  

使用特权

评论回复
沙发
小小蚂蚁举千斤| | 2024-11-6 13:54 | 只看该作者
中断不可用是程序问题吧,建议再排查一下

使用特权

评论回复
板凳
pssyx| | 2024-11-6 14:17 | 只看该作者
代码不全,至少有如下疑问:
1\IT_type的定义是否是GPIO_IT_FALLING?
2\HAL_GPIO_WritePin()是什么内容?可以删除它。
3\SYSCTRL_GotoSleep()是什么内容?
可以仿真调试,查找问题所在。
建议参考CW32L010 lib文件中的\Examples\GPIO\gpio_wakeup_filter例程。

使用特权

评论回复
地板
peng19106|  楼主 | 2024-11-6 14:31 | 只看该作者
pssyx 发表于 2024-11-6 14:17
代码不全,至少有如下疑问:
1\IT_type的定义是否是GPIO_IT_FALLING?
2\HAL_GPIO_WritePin()是什么 ...

1.这部分内容丢失了,在进入休眠模式前,重设置PB6为外部中断模式了key_io_config(GPIO_IT_FALLING);
2.重定义的IO的写函数
3.休眠设置__WFI()这些;
就是参考例程也出现问题

使用特权

评论回复
5
pssyx| | 2024-11-6 15:01 | 只看该作者
peng19106 发表于 2024-11-6 14:31
1.这部分内容丢失了,在进入休眠模式前,重设置PB6为外部中断模式了key_io_config(GPIO_IT_FALLING);
2. ...

试试注释掉GPIO_ConfigFilter(CW_GPIOB,  GPIOx_ICR_PIN6_Msk, GPIO_FLTCLK_LSI);
参考例程如果运行于CW32L010 StartKit的话,是ok的。

使用特权

评论回复
6
peng19106|  楼主 | 2024-11-6 15:34 | 只看该作者
pssyx 发表于 2024-11-6 15:01
试试注释掉GPIO_ConfigFilter(CW_GPIOB,  GPIOx_ICR_PIN6_Msk, GPIO_FLTCLK_LSI);
参考例程如果运行于CW3 ...

找到问题了,sleep任务本来是作为线程存在的,但是测试定时器的时候,挪到定时器了,导致了__WFI是在中断中去完成的,然后外部中断没办法唤醒MCU

使用特权

评论回复
7
peng19106|  楼主 | 2024-11-6 15:35 | 只看该作者
找到问题了,sleep任务本来是作为线程存在的,但是测试定时器的时候,挪到定时器了,导致了__WFI是在中断中去完成的,然后外部中断没办法唤醒MCU

使用特权

评论回复
8
OKAKAKO| | 2024-11-14 08:18 | 只看该作者
其实程序问题排查起来还是比较需要耐心的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝