【NUCLEO-L476RG开发】STM32L476低功耗模式初试 在项目开发中经常用到低功耗MCU芯片,今用st币换到了一块STM32L476RG-NUCLEO开发板,由于本人对STM32CubeMx和 HAL库不熟悉,没有使用过,但对此板的低功耗比较感兴趣,还是花时间看了一点资料,好不容易完成了这个初步试验,先发表 这个简单的开发笔记,待以后更熟悉STM32CubeMx,HAL库和STM32L478后,再发一个比较全的开发笔记。 (一)STM32L476的低功耗模式总结: 该器件具有以下几个低功耗模式: 1. 睡眠模式(Sleep mode):CPU时钟关,所有的外设包括Cortex-M4核心外围设备象NVIC,SysTick,等能够唤 醒CPU在中断或事件发生。 2. 低功耗运行模式(Low-power run mode):这个模式是在当系统时钟频率为减少2兆赫以下时实现的。代码是 从SRAM或闪存执行。稳压器是在低功耗模式,以尽量减少调节器的工作电流。 3. 低功耗睡眠模式(Low-power sleep mode):这个模式从低功率运行模式进入:Cortex-M4是关闭的。 4. STOP1和STOP2模式:SRAM1,SRAM2和所有寄存器内容被保留。所有在电压域VCORE的时钟停止,PLL,MSI, 与HSI16和HSE是失能停止的。LSI和LSE可以保持运行。RTC可保持活跃。一些外围设备在停止模式检测唤醒 条件。使用唤醒能力,可以使能HSI16 RC振荡器。 在STOP2模式,大多数的电压域VCORE放在一个较低的泄漏模式。 在STOP1模式,提供最大数量的活动外设和唤醒源,较小的唤醒时间但比STOP2功耗高。 当从STOP1模式或STOP2模式退出时,系统时钟是MSI可到48MHz或使用HSI16,根据软件配置。 5.待机模式(Standby mide):VCORE电压域断电。然而,它是可以保存SRAM2内容: –待机模式时 当寄存器PWR_CR3的RRS位是置"1"时,SRAM2保留内容,在这种情况下,SRAM2由低功耗 稳压器提供。 当寄存器PWR_CR3的RRS位清零时,在这种情况下,主电压稳压器和低功率稳压器被关断。 在VCORE电压域的所有时钟停止,PLL,MSI,HSI16和HSE被禁用。LSI和LSE可以保持运行。 RTC保持活跃。当退出待机模式时,系统时钟是MSI从1兆赫至8兆赫。 6. 关机模式(Shutdown mode):VCORE电压域断电。在VCORE电压域所有的时钟停止, PLL,MSI,HSI16,LSI和HSE被禁用。LSE保持运转。 退出关机模式时,系统时钟是MSI在4兆赫。 在这种模式下,电源电压监测被禁用。 各低功耗模式之间的转换见下图: (二)实验内容及工程的建立: 1.本人主要想对低功耗运行模式和低功耗模式睡眠模式进行实验测试,根据各低功耗模式之间转换图,程序的方框图如下: 为了完成上面步骤,利用STLink的USB转串口功能,在程序中设计了USART2的响应,制定了一个简单的协议, 协议命令为二字节,通过STLink的USB转发送到USART2,协议具体如下: 发送 : 0x08 0x02 由主模式进入低功耗运行模式。系统频率使用MSI,频率降为1MHz。 发送 : 0x08 0x03 由低功耗运行模式进入主模式。系统频率使用HSI16,配置为80MHz。 在低功耗运行模式下 发送 : 0x08 0x08 由低功耗运行模式进入低功耗睡眠模式。 UART2命令响应代码如下: void U2_cmd(void) { if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET) if(HAL_UART_Receive(&huart2,U2_Rxbuf,2,100)==HAL_OK) { if((U2_Rxbuf[0]==0x08)&&(U2_Rxbuf[1]==0x01))//====主模式 { SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; MX_USART2_UART_Init(); U2_buf[0]=0x09; U2_buf[1]=0x01; HAL_UART_Transmit(&huart2,U2_buf,2,100); } if((U2_Rxbuf[0]==0x08)&&(U2_Rxbuf[1]==0x02))//====进入低功耗运行模式 { //进入低功率运行模式,进行如下几步: //降低系统时钟频率低于2兆赫。 //通过设置在PWR_CR1寄存器的LPR位,强迫调节器在低功耗模式。 SystemClock1M(); MX_USART2_UART_Init(); SET_BIT(PWR->CR1, PWR_CR1_LPR); U2_buf[0]=0x0A; U2_buf[1]=0x02; HAL_UART_Transmit(&huart2,U2_buf,2,100); } if((U2_Rxbuf[0]==0x08)&&(U2_Rxbuf[1]==0x03))//====退出低功耗运行模式进入主模式 { //退出低功耗运行模式,进行如下几步: //通过清除在PWR_CR1寄存器的LPR位,强迫调节器在主运行模式。 //等待直到PWR_SR2寄存器的REGLPF清零。 //提高系统时钟频率,恢复主运行模式的时钟频率。 CLEAR_BIT(PWR->CR1, PWR_CR1_LPR); while(HAL_IS_BIT_SET(PWR->SR2,PWR_SR2_REGLPF)); //HAL_IS_BIT_CLR(REG, BIT); SystemClock80M(); MX_USART2_UART_Init(); U2_buf[0]=0x0B; U2_buf[1]=0x03; HAL_UART_Transmit(&huart2,U2_buf,2,100); } if((U2_Rxbuf[0]==0x08)&&(U2_Rxbuf[1]==0x08)) //====进入睡眠模式 { SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //禁止系统中断 HAL_NVIC_DisableIRQ(LPTIM1_IRQn); HAL_NVIC_DisableIRQ(TIM1_UP_TIM16_IRQn); //禁止TIM1中断 HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI); U2_buf[0]=0x0D; U2_buf[1]=0x08; HAL_UART_Transmit(&huart2,U2_buf,2,100); } } } 2.工程的建立: 工程在STM32CubeMx中建立配置了一个LPTIM1,一个TIM1, 三个UART分别为PUART1,UART2,UART4见下图: 时种配置见下图: 引脚配置见下图: 整个工程文件见附件: |
貌似这个万用表的精度不够吧 |
那个模块图画的很好。就是“各低功耗模式之间的转换”,用什么软件画的? |
换个微安档的表测,这数据不大对 |
跟手册上的数据对比如何? |
谢谢楼主 |
学习了。。。 |
再接再厉。 |
很好地帖子 |
楼主,这个功耗还是很大呀 |
附件下载参考参考 |
数据没对,看看软件设置。 |
学习了,谢谢楼主 |
小哥,感觉你写的很不错能否给我也写一片。 |
谢谢楼主,很好的贴子 |
STM32L4 超低功耗微系列及相关探索学习板介绍
STM32L476程序烧录
【NUCLEO-L476RG开发】使用STM32L4开发板玩转心率传感器
[Nucleo-L4R5] STM32L4R5 驱动OLED
[Nucleo-L4R5] STM32L4R5 基于OLED显示二维码
STM32L432KC开箱测评------OLED显示
STM32L476建工程及点亮LED
【评测站】STM32L496G-DISCO - 高性价比的智能手表解决方案
【超低功耗STM32L4系列首秀】 收到板子了,
STM32L496G-DISCO的出厂源码在哪儿可以下载?