[CW32L083系列]

低功耗模式配置后,电流未降低

[复制链接]
305|11
手机看帖
扫描二维码
随时随地手机跟帖
kakakayi|  楼主 | 2024-1-4 18:24 | 显示全部楼层 |阅读模式
参考标准库例子配置低功耗模式,是否存在问题呢
void System_Clk_Config(void)
{
    RCC_HSI_Enable( RCC_HSIOSC_DIV2); //配置系统时钟为HSI 24M
    //Enable Systick Clk
    InitTick(24000000ul); //初始化SysTick
}
void RCC_CLK_Config(void)
{

        //外设时钟使能
        __RCC_GPIOA_CLK_ENABLE();
        __RCC_GPIOB_CLK_ENABLE();
        __RCC_GPIOC_CLK_ENABLE();
        __RCC_GPIOF_CLK_ENABLE();

        __RCC_UART2_CLK_ENABLE();
       
        __RCC_BTIM_CLK_ENABLE();
        __RCC_DMA_CLK_ENABLE();       
}

void SleepModeTest(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    PWR_InitTypeDef PWR_InitStructure = {0};

    /* Configure all GPIO as analog to reduce current consumption on non used IOs */
    /* Enable GPIOs clock */
    /* Warning : Reconfiguring all GPIO will close the connexion with the debugger */
    //打开GPIO时钟
    REGBITS_SET( CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk | SYSCTRL_AHBEN_GPIOB_Msk |\
        SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk);

    GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStructure.IT = GPIO_IT_NONE;
    GPIO_InitStructure.Pins = GPIO_PIN_All;
    GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
    GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
    GPIO_Init(CW_GPIOC, &GPIO_InitStructure);
    GPIO_Init(CW_GPIOF, &GPIO_InitStructure);

    /* Disable GPIOs clock */
    REGBITS_CLR( CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk | SYSCTRL_AHBEN_GPIOB_Msk |\
        SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk);


    /*Suspend Tick increment to prevent wakeup by Systick interrupt.
    Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base)*/
    SuspendTick();
        BTIM_Cmd(CW_BTIM1, DISABLE);
       
        RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKEN);
    /* Request to enter SLEEP mode */
    //HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    PWR_InitStructure.PWR_Sevonpend = PWR_Sevonpend_Disable;
    PWR_InitStructure.PWR_SleepDeep = PWR_SleepDeep_Disable;
    PWR_InitStructure.PWR_SleepOnExit = PWR_SleepOnExit_Enable;
    PWR_Config(&PWR_InitStructure);
    PWR_GotoLpmMode();
       
        BTIM_Cmd(CW_BTIM1, ENABLE);
    /* Resume Tick interrupt if disabled prior to sleep mode entry*/
    ResumeTick();

}

int32_t main(void)
{
         
          System_Clk_Config();
          RCC_CLK_Config();
         
               
          bsp_usart2_init(9600);
          uart_device_init(DEV_UART2);
       
          GPIO_LED_Init();
               
           base_timer_init(1000,24);
           app_task_led_creat();

                while (1)
                {
                        /* code */
                        ParseDataFromUsart2();
                       
                        SysTickDelay(1000);
                        SysTickDelay(1000);
                        SysTickDelay(1000);
                        SysTickDelay(1000);
                        SysTickDelay(1000);
                        SleepModeTest();
                }

       
}

使用特权

评论回复
评论
xch 2024-1-5 13:04 回复TA
面粉兑水了进入浆糊模式。没看到进入低功耗模式的语句。 
pssyx| | 2024-1-5 10:52 | 显示全部楼层
本帖最后由 pssyx 于 2024-1-22 09:45 编辑

       1、不同工作模式下的电流值各是多少?正常情况下,MCU进入Sleep模式后,CPU 停止运行,功耗一定会降低的。
       2、虽然提供的代码不全,但可以判断Sleep模式下,UART/DMA等外设仍在工作,会消耗电流的。
       3、RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKEN);它的意思是:MCU从深度休眠唤醒后自动使用内部高速时钟(HSI),也就是说HSI时钟等于默认值8MHz,这是否会与你期望的24MHz不同?故建议此句更改为:RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKDIS);// 唤醒后使用当前时钟24MHz.
      4、PWR_InitStructure.PWR_SleepOnExit = PWR_SleepOnExit_Enable;建议更改为:PWR_InitStructure.PWR_SleepOnExit = PWR_SleepOnExit_Disable;否则执行PWR_GotoLpmMode();之后,MCU 会马上进入休眠模式,且在唤醒中断到来时,执行完中断ISR之后,MCU 会再次进入休眠模式。也就是说,语句PWR_GotoLpmMode();之后的所有代码都无法执行,自然main()循环也无法进行。
      5、如果可以,请使用DeepSleep模式代替Sleep模式,功耗会明显下降。

使用特权

评论回复
chenqianqian| | 2024-1-8 08:22 | 显示全部楼层
实测一下电流,看看和标称值相差多大?

使用特权

评论回复
中国龙芯CDX| | 2024-1-9 14:00 | 显示全部楼层
应该是相关外设没有停止说白了就是没有进入低功耗模式

使用特权

评论回复
kakakayi|  楼主 | 2024-1-19 14:30 | 显示全部楼层
pssyx 发表于 2024-1-5 10:52
1、不同工作模式下的电流值各是多少?正常情况下,MCU进入Sleep模式后,CPU 停止运行,功耗一定会降 ...

在不使用外设的情况下j进行测试,经过一段延时后直接进入休眠模式,电流由17mA下降至16mA
static void SleepModeTest(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    PWR_InitTypeDef PWR_InitStructure = {0};

    /* Configure all GPIO as analog to reduce current consumption on non used IOs */
    /* Enable GPIOs clock */
    /* Warning : Reconfiguring all GPIO will close the connexion with the debugger */
    //打开GPIO时钟
    REGBITS_SET( CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk | SYSCTRL_AHBEN_GPIOB_Msk |\
        SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk);

    GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStructure.IT = GPIO_IT_NONE;
    GPIO_InitStructure.Pins = GPIO_PIN_All;
    GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
    GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
    GPIO_Init(CW_GPIOC, &GPIO_InitStructure);
    GPIO_Init(CW_GPIOF, &GPIO_InitStructure);

    /* Disable GPIOs clock */
    REGBITS_CLR( CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk | SYSCTRL_AHBEN_GPIOB_Msk |\
        SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk);

   
    /*Suspend Tick increment to prevent wakeup by Systick interrupt.
    Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base)*/
    SuspendTick();
       
         // 唤醒后自动使用原时钟源(HSI)
    RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKDIS);
    /* Request to enter SLEEP mode */
    //HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    PWR_InitStructure.PWR_Sevonpend = PWR_Sevonpend_Disable;
    PWR_InitStructure.PWR_SleepDeep = PWR_SleepDeep_Disable;
    PWR_InitStructure.PWR_SleepOnExit = PWR_SleepOnExit_Enable;
    PWR_Config(&PWR_InitStructure);
    // PWR_GotoLpmMode();
        __WFI();
       
    /* Resume Tick interrupt if disabled prior to sleep mode entry*/
    ResumeTick();

   
}


int32_t main(void)
{
         
         RCC_HSI_Enable( RCC_HSIOSC_DIV6); //配置系统时钟为HSI 8M
    //Enable Systick Clk
    InitTick(8000000ul); //初始化SysTick
         
        while (1)
        {
                /* code */
        //        ParseDataFromUsart2();
               
                SysTickDelay(1000);
                SysTickDelay(1000);
                SysTickDelay(1000);
                SysTickDelay(1000);
                SysTickDelay(1000);
                SleepModeTest();
        }

       
}

使用特权

评论回复
kakakayi|  楼主 | 2024-1-19 16:35 | 显示全部楼层
目前问题以及排查,外围器件功耗过高导致电流降不下

使用特权

评论回复
pssyx| | 2024-1-19 16:55 | 显示全部楼层
kakakayi 发表于 2024-1-19 14:30
在不使用外设的情况下j进行测试,经过一段延时后直接进入休眠模式,电流由17mA下降至16mA
static void Sl ...

实测了你的代码,MCU正常电流1.7xmA,Sleep电流为0.65mA左右。
你测量的是MCU回路的电流吗?还是整机电源电流?请检查各外设!

使用特权

评论回复
kakakayi|  楼主 | 2024-1-20 12:53 | 显示全部楼层
pssyx 发表于 2024-1-19 16:55
实测了你的代码,MCU正常电流1.7xmA,Sleep电流为0.65mA左右。
你测量的是MCU回路的电流吗?还是整机电源 ...

是的,我这测试的是整机的电源电流,所以电流变化不明显;同时感谢您的指导

使用特权

评论回复
其实是不是整机在跑和高效任务

使用特权

评论回复
标准库例子配置低功耗模式应该没问题

使用特权

评论回复
OKAKAKO| | 2024-1-27 16:49 | 显示全部楼层
电路图上一下就清楚了

使用特权

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

本版积分规则

2

主题

6

帖子

0

粉丝