野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 308|回复: 3

STM32低功耗的停止模式

[复制链接]
发表于 2025-5-13 14:01:18 | 显示全部楼层 |阅读模式

int main(void)
{
        uint32_t SYSCLK_Frequency=0;
        uint32_t HCLK_Frequency=0;
        uint32_t PCLK1_Frequency=0;
        uint32_t PCLK2_Frequency=0;
        uint32_t SYSCLK_Source=0;
       
        /* 初始化系统时钟为72MHz */
        SystemClock_Config();
        /* 初始化LED */
        LED_GPIO_Config();       
        /* 初始化调试串口,一般为串口1 */
        DEBUG_USART_Config();       
        /* 初始化按键为中断模式,按下中断后会进入中断服务函数        */
        EXTI_Key_Config();
       
        printf("\r\n 欢迎使用野火  STM32 F103 开发板。\r\n");
    printf("\r\n 野火F103 停止模式例程\r\n");
       
        printf("\r\n 实验说明:\r\n");

        printf("\r\n 1.本程序中,绿灯表示STM32正常运行,红灯表示睡眠状态,蓝灯表示刚从停止状态被唤醒\r\n");
        printf("\r\n 2.程序运行一段时间后自动进入停止状态,在停止状态下,可使用KEY1或KEY2唤醒\r\n");
        printf("\r\n 3.本实验执行这样一个循环:\r\n ------》亮绿灯(正常运行)->亮红灯(停止模式)->按KEY1或KEY2唤醒->亮蓝灯(刚被唤醒)-----》\r\n");
        printf("\r\n 4.在停止状态下,DAP下载器无法给STM32下载程序,\r\n 可按KEY1、KEY2唤醒后下载,\r\n 或按复位键使芯片处于复位状态,然后在电脑上点击下载按钮,再释放复位按键,即可下载\r\n");

        while(1)
        {       
                /*********执行任务***************************/
                printf("\r\n STM32正常运行,亮绿灯\r\n");

                LED_GREEN;       
                HAL_Delay(2000);               
                /*****任务执行完毕,进入睡眠降低功耗***********/

                printf("\r\n 进入停止模式,亮红灯,按KEY1或KEY2按键可唤醒\r\n");

                //使用红灯指示,进入睡眠状态
                LED_RED;
                //暂停滴答时钟,防止通过滴答时钟中断唤醒
                HAL_SuspendTick();
                /* 进入停止模式,设置电压调节器为低功耗模式,等待中断唤醒 */
                HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
                //等待中断唤醒  K1或K2按键中断       
                /***被唤醒,亮蓝灯指示***/
                LED_BLUE;
                //根据时钟寄存器的值更新SystemCoreClock变量
                SystemCoreClockUpdate();
                //获取唤醒后的时钟状态       
                SYSCLK_Frequency = HAL_RCC_GetSysClockFreq();
                HCLK_Frequency   = HAL_RCC_GetHCLKFreq();
                PCLK1_Frequency  = HAL_RCC_GetPCLK1Freq();
                PCLK2_Frequency  = HAL_RCC_GetPCLK2Freq();
                SYSCLK_Source    = __HAL_RCC_GET_SYSCLK_SOURCE();
                //这里由于串口直接使用HSI时钟,不会会影响串口波特率
                printf("\r\n刚唤醒的时钟状态:\r\n");
                printf(" SYSCLK频率:%d,\r\n HCLK频率:%d,\r\n PCLK1频率:%d,\r\n PCLK2频率:%d,\r\n 时钟源:%d (0表示HSI,8表示PLLCLK)\n",
                SYSCLK_Frequency,HCLK_Frequency,PCLK1_Frequency,PCLK2_Frequency,SYSCLK_Source);                  
                /* 从停止模式唤醒后配置系统时钟:启用HSE、PLL*/
                /* 选择PLL作为系统时钟源(HSE和PLL在停止模式下被禁用)*/
                SYSCLKConfig_STOP();
               
                //被唤醒后,恢复滴答时钟                       
                HAL_ResumeTick();
                //获取重新配置后的时钟状态
                SYSCLK_Frequency = HAL_RCC_GetSysClockFreq();
                HCLK_Frequency   = HAL_RCC_GetHCLKFreq();
                PCLK1_Frequency  = HAL_RCC_GetPCLK1Freq();
                PCLK2_Frequency  = HAL_RCC_GetPCLK2Freq();
                SYSCLK_Source    = __HAL_RCC_GET_SYSCLK_SOURCE();
               
                //重新配置时钟源后始终状态
                printf("\r\n重新配置后的时钟状态:\r\n");
                printf(" SYSCLK频率:%d,\r\n HCLK频率:%d,\r\n PCLK1频率:%d,\r\n PCLK2频率:%d,\r\n 时钟源:%d (0表示HSI,8表示PLLCLK)\n",
                SYSCLK_Frequency,HCLK_Frequency,PCLK1_Frequency,PCLK2_Frequency,SYSCLK_Source);

                HAL_Delay(2000);       
                       
                printf("\r\n 已退出停止模式\r\n");
                //继续执行while循环
        }
}

回复

使用道具 举报

 楼主| 发表于 2025-5-13 14:02:10 | 显示全部楼层
有知道的吗?求大佬解惑。
回复 支持 反对

使用道具 举报

发表于 2025-5-16 16:24:06 | 显示全部楼层
有什么问题
回复 支持 反对

使用道具 举报

发表于 2025-6-2 12:43:52 | 显示全部楼层
不知道要解答啥问题?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-6-13 17:33 , Processed in 0.141369 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表