stm32l053r8t6的时钟唤醒程序解析
当你学习stm32l053r8t6这款芯片时,必定要用到他的低功耗功能,所以进入低功耗模式是必须要学习一下的。
官方例程如下
int main(void)
{
/* STM32L0xx HAL library initialization:
- Configure the Flash prefetch, Flash preread and Buffer caches
- Systick timer is configured by default as source of time base, but user
can eventually implement his proper time base source (a general purpose
timer for example or other time source), keeping in mind that Time base
duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
handled in milliseconds basis.
- Low Level Initialization
*/
HAL_Init();
/* Configure LED2 */
BSP_LED_Init(LED2);
/* Configure the system clock to 2 MHz */
SystemClock_Config();
/* Configure the system power */
SystemPower_Config();
/* Check and handle if the system was resumed from StandBy mode */
if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
{
/* Clear Standby flag */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
}
/* Insert 5 seconds delay */
HAL_Delay(5000);
/*The Following Wakeup sequence is highly recommended prior to each Standby mode entry
mainly when using more than one wakeup source this is to not miss any wakeup event.
- Disable all used wakeup sources,
- Clear all related wakeup flags,
- Re-enable all used wakeup sources,
- Enter the Standby mode.
*/
/*Disable all used wakeup sources*/
HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);
/*Re-enable all used wakeup sources*/
/*## Setting the Wake up time ############################################*/
/* RTC Wakeup Interrupt Generation:
Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI))
Wakeup Time = Wakeup Time Base * WakeUpCounter
= (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI)) * WakeUpCounter
==> WakeUpCounter = Wakeup Time / Wakeup Time Base
To configure the wake up timer to 4s the WakeUpCounter is set to 0x1FFF:
RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16
Wakeup Time Base = 16 /(~39.000KHz) = ~0,410 ms
Wakeup Time = ~4s = 0,410ms * WakeUpCounter
==> WakeUpCounter = ~4s/0,410ms = 9750 = 0x2616 */
HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0x2616, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
/*Clear all related wakeup flags*/
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
/*Enter the Standby mode*/
HAL_PWR_EnterSTANDBYMode();
while (1)
{
}
}
上边的例子展示了系统是如何进入休眠模式的。以及如何被RTC唤醒的通过外部的引脚20来产生触发事件。例子还说明了如何进入rtc功耗的休眠模式。
软件配置成2Mhz.系统滴答每1ms中断,低速时钟LSI被用做RTC。
20引脚每4s产生一个上升沿来唤醒。
从休眠模式中唤醒后,程序就相当于复位后的重启,也不用再配置RTC,
注意:例子不能在调试模式下运行,是因为MO+核不在状态中在低功耗模式下,所以被禁止了。
核会被占用,当如下配置后。
@note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select
the RTC clock source; in this case the Backup domain will be reset in
order to modify the RTC Clock source, as consequence RTC registers (including
the backup registers) and RCC_CSR register are set to their reset values.
@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
@note The application need to ensure that the SysTick time base is always set to 1 millisecond
to have correct HAL operation.
@par Directory contents
用到的文件目录
- PWR/PWR_STANDBY_RTC/Inc/stm32l0xx_conf.h Library Configuration file
- PWR/PWR_STANDBY_RTC/Inc/stm32l0xx_it.h Header for stm32l0xx_it.c
- PWR/PWR_STANDBY_RTC/Inc/main.h header file for main.c
- PWR/PWR_STANDBY_RTC/Src/system_stm32fl0xx.c STM32L0xx system clock configuration file
- PWR/PWR_STANDBY_RTC/Src/stm32l0xx_it.c Interrupt handlers
- PWR/PWR_STANDBY_RTC/Src/main.c Main program
- PWR/PWR_STANDBY_RTC/Src/stm32l0xx_hal_msp.c HAL MSP module
@par Hardware and Software environment
- This example runs on STM32L051xx, STM32L052xx, STM32L053xx STM32L062xx and
STM32L063xx device lines RevZ Rev A.
- This example has been tested with STMicroelectronics STM32L053R8-Nucleo board Rev C
and can be easily tailored to any other supported device and development board.
- STM32L053R8-Nucleo Set-up
- Use LED2 connected to PA.05 pin
- Connect an amperemeter to JP6 to measure the IDD current