在线时间28 小时
UID50982
ST金币0
蝴蝶豆0
注册时间2008-5-30
中级会员
- 最后登录
- 2020-7-11
|
a0a.1 32b0c
【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见下图:
时种配置见下图:
引脚配置见下图:
整个工程文件见附件:
My_L476_1.rar
(9.12 MB, 下载次数: 500)
|
-
评分
-
查看全部评分
|