网站建设公司找博行网站时间显示
2026/6/9 22:29:36 网站建设 项目流程
网站建设公司找博行,网站时间显示,网站群系统建设的目的,站外推广网站目录1 什么是低功耗#xff1f;2 STM32电源系统结构3 低功耗模式介绍3.1 睡眠模式#xff08;sleep mode#xff09;3.2 停机模式#xff08;stop mode#xff09;3.3 待机模式#xff08;standby mode#xff09;4 寄存器及库函数介绍小实验#xff1a;低功耗实验1 什…目录1 什么是低功耗2 STM32电源系统结构3 低功耗模式介绍3.1 睡眠模式sleep mode3.2 停机模式stop mode3.3 待机模式standby mode4 寄存器及库函数介绍小实验低功耗实验1 什么是低功耗STM32的低功耗low power mode特性是其嵌入式处理器系列的一个重要优势特别适用于需要长时间运行且功耗敏感的应用场景如便携式设备、物联网设备、智能家居系统等。在很多应用场合中都对电子设备的功耗要求非常苛刻如某些传感器信息采集设备仅靠小型的电池提供电源要求工作长达数年之久且期间不需要任何维护由于智慧穿戴设备的小型化要求电池体积不能太大导致容量也比较小所以也很有必要从控制功耗入手提高设备的续行时间。2 STM32电源系统结构3 低功耗模式介绍STM32具有运行、睡眠、停止和待机四种工作模式。上电后默认是在运行模式当内核不需要继续运行时可以选择后面三种低功耗模式。3.1 睡眠模式sleep mode在睡眠模式下CPU停止工作但所有外设如ADC、通信接口等仍然运行时钟继续运转。这适用于需要暂时关闭CPU但外围设备需要继续工作的场景。模式特点对系统影响小但是节能效果最差。在睡眠模式下所有的I/O引脚都保持它们在运行模式时的状态。进入条件当系统控制寄存器中的SLEEPDEEP位被清除通常为0并且SLEEPONEXIT位根据需求设置时如果设置为1则在最低优先级中断处理程序退出时进入Sleep模式如果为0则执行WFI或WFE时立即进入。执行WFIWait For Interrupt或WFEWait For Event指令来进入。唤醒条件任意一个中断都能将系统从Sleep模式唤醒。如果执行WFE指令进入Sleep模式则一旦发生唤醒事件时MCU将唤醒。3.2 停机模式stop mode在停机模式下CPU和核心外围设备的时钟会停止但部分唤醒源如外部中断和某些定时器仍然运行。这适用于需要长时间等待外部事件唤醒的应用如等待用户输入或外部信号。Stop模式实现了非常低的功耗同时保留了SRAM和寄存器的内容。模式特点节能效果好程序不会复位。但恢复时间较长比如震荡器需要重新起震等。在停机模式下所有的I/O引脚都保持它们在运行模式时的状态。退出停止模式HSI RC振荡器被选为系统时钟。进入条件需要将SLEEPDEEP位设置为1以进入深度睡眠模式然后通过设置电源控制/状态寄存器PWR_CSR中的PDDS位为0来选择进入Stop模式。根据需求设置LPDS位LPDS 0表示在深睡眠模式下电压调节器保持开启状态LPDS 1表示在深睡眠模式下电压调节器进入低功耗模式。执行WFIWait For Interrupt或WFEWait For Event指令来进入。在进入Stop模式之前通常需要关闭不必要的外设时钟并保存需要保留的状态信息。唤醒条件Stop模式可以通过外部中断如按键中断、USART接收中断等唤醒。RTC闹钟事件、USB唤醒、以太网ETH唤醒等也可以作为唤醒源但这些通常需要通过外部中断来触发。3.3 待机模式standby mode在该模式下CPU、外围设备和时钟都被关闭只保留唤醒逻辑和备份寄存器。这适用于不需要保留RAM内容且可以从复位状态恢复的设备常见于需要极低功耗且稀疏唤醒的应用。Standby模式是STM32中功耗最低的模式之一。模式特点节能效果最好但程序会复位只有少数条件唤醒。在Standby模式下大部分IO引脚处于高阻态只有复位引脚、TAMPER引脚如果配置为防侵入或校准输出和WKUP引脚可用作唤醒源。进入条件Standby模式进入前需要清除电源控制/状态寄存器PWR_CSR中的WUF位以确保没有未处理的唤醒标志。将SLEEPDEEP位设置为1以进入深度睡眠模式并设置PDDS位为1来选择进入Standby模式。执行WFI或WFE指令进入Standby模式。唤醒条件Standby模式可以通过WKUP引脚的上升沿唤醒。RTC闹钟事件也可以作为唤醒源。独立看门狗IWDG复位和NRST引脚上的外部复位也可以唤醒STM32但这通常用于系统复位而非低功耗唤醒。4 寄存器及库函数介绍小实验低功耗实验实验目的按下按键 2 进入低功耗模式睡眠、停机、待机按下按键 1 退出低功耗模式正常模式下LED1 闪烁进入停机模式LED2 长亮退出停机模式则 LED2 熄灭。硬件清单STM32ST-Link完整代码main.c#includesys.h#includeuart1.h#includedelay.h#includeled.h#includeuart1.h#includelpwr.h#includekey.hintmain(void){HAL_Init();/* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);/* 设置时钟, 72Mhz *///LED初始化led_init();//串口1初始化uart1_init(115200);//低功耗初始化lpwr_init();printf(打印测试hello world\r\n);uint8_ti0;while(1){if(key_scan()2){//进入睡眠模式//lpwr_enter_sleep();//进入停机模式//lpwr_enter_stop();//进入待机模式lpwr_enter_standby();}//200ms闪烁一次if(i%200){led1_toggle();}i;delay_ms(10);}}lpwr.c#includelpwr.h#includeled.h//低功耗初始化voidlpwr_init(void){GPIO_InitTypeDef gpio_initstruct;//使能GPIOB时钟__HAL_RCC_GPIOA_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.PinGPIO_PIN_0;//WEKEUP对应引脚gpio_initstruct.ModeGPIO_MODE_IT_RISING;//上升沿触发gpio_initstruct.SpeedGPIO_SPEED_FREQ_HIGH;//高速gpio_initstruct.PullGPIO_PULLDOWN;//下拉HAL_GPIO_Init(GPIOA,gpio_initstruct);//设置中断优先级HAL_NVIC_SetPriority(EXTI0_IRQn,2,2);//使能中断HAL_NVIC_EnableIRQ(EXTI0_IRQn);}//中断服务函数voidEXTI0_IRQHandler(void){//公共处理函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);}//进入睡眠模式voidlpwr_enter_sleep(void){//关闭滴答定时器HAL_SuspendTick();//进入低功耗睡眠模式HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);}//进入停机模式voidlpwr_enter_stop(void){//暂停滴答定时器HAL_SuspendTick();//点亮LED2代表进入停机模式led2_on();//进入停机模式HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);//熄灭LED2代表退出停机模式led2_off();//重新配置系统时钟stm32_clock_init(RCC_PLL_MUL9);/* 设置时钟, 72Mhz */}//进入待机模式voidlpwr_enter_standby(void){//使能电源时钟关闭电压调节器__HAL_RCC_PWR_CLK_ENABLE();//使能WAKEUP引脚的唤醒功能HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//清除唤醒标记否则讲持续保持唤醒状态__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//进入待机模式HAL_PWR_EnterSTANDBYMode();//测试代码会不会运行到下面led2_on();//不会运行到这里}lpwr.h#ifndef__LPWR_H__#define__LPWR_H__#includesys.h//低功耗初始化voidlpwr_init(void);//进入睡眠模式voidlpwr_enter_sleep(void);//进入停机模式voidlpwr_enter_stop(void);//进入待机模式voidlpwr_enter_standby(void);#endifkey.c#includekey.h#includedelay.h//初始化GPIOvoidkey_init(void){GPIO_InitTypeDef gpio_initstruct;//使能GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.PinGPIO_PIN_1;//KEY1KEY2对应引脚gpio_initstruct.ModeGPIO_MODE_INPUT;//输入gpio_initstruct.PullGPIO_PULLUP;//上拉gpio_initstruct.SpeedGPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,gpio_initstruct);}//按键扫描函数uint8_tkey_scan(void){//检测按键2是否按下if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)GPIO_PIN_RESET){//消抖delay_ms(10);//再次判断按键是否按下if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)GPIO_PIN_RESET){//如果确实按下那么等待按键松开while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)GPIO_PIN_RESET);//返回按键值return2;}}//返回默认值return0;}key.h#ifndef__KEY_H__#define__KEY_H__#includesys.hvoidkey_init(void);uint8_tkey_scan(void);#endifled.c#includeled.h#includesys.h//初始化GBIO口函数voidled_init(void){GPIO_InitTypeDef gpio_initstruct;//使能GPIOB时钟__HAL_RCC_GPIOB_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.PinGPIO_PIN_8|GPIO_PIN_9;//LED1LED2对应引脚gpio_initstruct.ModeGPIO_MODE_OUTPUT_PP;//推挽输出gpio_initstruct.SpeedGPIO_SPEED_FREQ_HIGH;//高速gpio_initstruct.PullGPIO_PULLUP;//上拉HAL_GPIO_Init(GPIOB,gpio_initstruct);//关闭LEDHAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);}//点亮LED1的函数voidled1_on(void){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);//拉低LED1引脚点亮LED1}//熄灭LED1的函数voidled1_off(void){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//拉高LED1引脚熄灭LED1}//翻转LED1的函数voidled1_toggle(void){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);//翻转LED1引脚电平}//点亮LED2的函数voidled2_on(void){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//拉低LED2引脚点亮LED2}//熄灭LED2的函数voidled2_off(void){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//拉高LED2引脚熄灭LED2}//翻转LED2的函数voidled2_toggle(void){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);//翻转LED2引脚电平}led.h#ifndef__LED_H__#define__LED_H__//初始化GBIO口函数voidled_init(void);//点亮LED1的函数voidled1_on(void);//熄灭LED1的函数voidled1_off(void);//翻转LED1的函数voidled1_toggle(void);//点亮LED2的函数voidled2_on(void);//熄灭LED2的函数voidled2_off(void);//翻转LED2的函数voidled2_toggle(void);#endif

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询