【NUCLEO-L476RG开发】STM32L476低功耗模式初试
【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==0x08)&&(U2_Rxbuf==0x01))//====主模式
{
SysTick->CTRL|= SysTick_CTRL_ENABLE_Msk;
MX_USART2_UART_Init();
U2_buf=0x09;U2_buf=0x01;
HAL_UART_Transmit(&huart2,U2_buf,2,100);
}
if((U2_Rxbuf==0x08)&&(U2_Rxbuf==0x02))//====进入低功耗运行模式
{
//进入低功率运行模式,进行如下几步:
//降低系统时钟频率低于2兆赫。
//通过设置在PWR_CR1寄存器的LPR位,强迫调节器在低功耗模式。
SystemClock1M();
MX_USART2_UART_Init();
SET_BIT(PWR->CR1, PWR_CR1_LPR);
U2_buf=0x0A;U2_buf=0x02;
HAL_UART_Transmit(&huart2,U2_buf,2,100);
}
if((U2_Rxbuf==0x08)&&(U2_Rxbuf==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=0x0B;U2_buf=0x03;
HAL_UART_Transmit(&huart2,U2_buf,2,100);
}
if((U2_Rxbuf==0x08)&&(U2_Rxbuf==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=0x0D;U2_buf=0x08;
HAL_UART_Transmit(&huart2,U2_buf,2,100);
}
}
}
2.工程的建立:
工程在STM32CubeMx中建立配置了一个LPTIM1,一个TIM1, 三个UART分别为:LPUART1,UART2,UART4见下图:
时种配置见下图:
引脚配置见下图:
整个工程文件见附件:
(三)实验测试结果:
为了在实验结果中对低功耗运行有一个数字概念,将STM32L476RG-NUCLEO开发板的JP6跳线拆除,接一个万用表,
在电流挡测试电流消耗。
测试的结果为:在主普通模式下(系统频率80MHz)的电流消耗为 : 13.84mA
在低功耗运行模式(系统频率降为1MHz)的电流消耗为 : 0.85mA
在低功耗睡眠模式下的电流消耗为 : 0.78mA
主普通模式下的电流消耗为 : 13.84mA
低功耗运行模式的电流消耗为 : 0.85mA
低功耗睡眠模式下的电流消耗为 : 0.78mA
搜索
貌似这个万用表的精度不够吧 那个模块图画的很好。就是“各低功耗模式之间的转换”,用什么软件画的? 换个微安档的表测,这数据不大对 跟手册上的数据对比如何? 谢谢楼主 学习了。。。 再接再厉。 :hug::hug:很好地帖子 楼主,这个功耗还是很大呀 附件下载参考参考 数据没对,看看软件设置。 学习了,谢谢楼主 小哥,感觉你写的很不错能否给我也写一片。 谢谢楼主,很好的贴子:)
页:
[1]