打印
[产品应用]

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

[复制链接]
499|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
其实程序问题排查起来还是比较需要耐心的

使用特权

评论回复
9
星辰大海不退缩| | 2024-11-22 18:02 | 只看该作者
感觉我像是程序问题

使用特权

评论回复
10
中国龙芯CDX| | 2024-11-24 14:54 | 只看该作者
从休眠模式下唤醒MCU需要进行中断处理

使用特权

评论回复
11
suiziq| | 2024-12-14 10:17 | 只看该作者
在进入休眠模式之前,你重新配置了PB06用于外部中断唤醒,但在休眠模式下,外部中断可能没有正确配置或使能。

使用特权

评论回复
12
hight1light| | 2024-12-14 10:19 | 只看该作者
中断标志清除,在进入休眠模式之前,确保所有中断标志已经清除。

使用特权

评论回复
13
miltk| | 2024-12-14 11:51 | 只看该作者
唤醒源配置,确保在进入休眠模式之前,已经正确配置了唤醒源(如PB06的外部中断)。

使用特权

评论回复
14
yuliangren| | 2024-12-15 06:11 | 只看该作者
确保在进入休眠模式之前,GPIO中断已经正确使能。

使用特权

评论回复
15
gongqijuns| | 2024-12-15 07:08 | 只看该作者
中断优先级,确保中断优先级配置正确,避免中断被屏蔽。

使用特权

评论回复
16
gra22ce| | 2024-12-15 10:42 | 只看该作者
休眠模式的配置可能存在问题,导致MCU无法正确响应外部中断。

使用特权

评论回复
17
eleg34ance| | 2024-12-15 11:21 | 只看该作者
确保选择了正确的休眠模式(如低功耗模式),并且该模式支持外部中断唤醒。

使用特权

评论回复
18
nqty| | 2024-12-15 13:13 | 只看该作者
时钟配置可能影响MCU的休眠和唤醒行为。

使用特权

评论回复
19
pe66ak| | 2024-12-15 14:18 | 只看该作者
时钟源选择,确保在休眠模式下,选择了合适的时钟源(如LSI),并且该时钟源能够支持外部中断唤醒。

使用特权

评论回复
20
tiakon| | 2024-12-15 17:11 | 只看该作者
确保在进入休眠模式之前,所有必要的时钟已经使能。

使用特权

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

本版积分规则

3

主题

6

帖子

0

粉丝