1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > STM32 低功耗STOP模式 RTC唤醒

STM32 低功耗STOP模式 RTC唤醒

时间:2019-06-09 06:08:50

相关推荐

STM32 低功耗STOP模式 RTC唤醒

芯片:STM32L071CB

开发环境:STM32CubeMX + keil5.33

使用实时时钟RTC的 WakeUpTimer定时器产生的中断将STM32从STOP低功耗模式下唤醒。

STOP模式: STM32低功耗运行模式之一,该模式下CPU会停止工作,但RAM中的数据仍然保留。待中断或事件触发后程序可以继续运行。

note:1、STOP模式退出后,系统时钟会自动配置为MSI或HSI,需要手动重新配置时钟,以及使用时钟的外设。

2、为了进一步降低STOP模式下的功耗,可以将GPIO设置为ANALOG输入模式,退出stop模式后重新配置GPIO

3、为了能够在STOP模式下进行调试,在main函数中添加 DBGMCU->CR |= DBGMCU_CR_DBG_STOP;

一、使用STM32CubeMX配置工程

1、配置STM32系统时钟,选择石英晶振,外部高速时钟HSE经锁相、倍频、分频后得到32M的系统时钟

2、配置一个用于控制LED灯的GPIO. 推挽输出模式,常拉低

3、配置RTC,激活时钟源、中断使能

RTC使用内部晶振LSI 37KHz 因此预分频系数设置为124 和 295 ,使分频后的时间正好是1秒。

(124+1)*(295+1) = = 37000

二、keil中添加功能性代码

实现的功能是LED灯点亮3秒,LED灯熄灭后进入STOP模式,由RTC定时4秒后唤醒。依次循环

/* USER CODE BEGIN WHILE */DBGMCU->CR |= DBGMCU_CR_DBG_STOP; /* 为了能够在停止模式下调试 */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET);HAL_Delay(3000);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET);//HAL_Delay(3000);if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 11560, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK){Error_Handler();}__HAL_RCC_PWR_CLK_ENABLE();//使能电源管理时钟HAL_PWREx_EnableUltraLowPower(); //使能超低功耗HAL_PWREx_EnableFastWakeUp(); //使能快速唤醒HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //进入低功耗STOP模式//退出stop模式后执行SystemClock_Config();MX_GPIO_Init();}/* USER CODE END 3 */

RTC的初始化配制函数如下:

static void MX_RTC_Init(void){/** Initialize RTC Only*/hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 124;hrtc.Init.SynchPrediv = 295;hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}/** Enable the WakeUp*/if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 11560, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK){Error_Handler();}}

RTC初始化配置中的HAL_RTCEx_SetWakeUpTimer_IT 需要保留,否则无法产生中断,系统将一直维持STOP

覆写中断回调函数:

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc){__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);}

清除PWR_FLAG_WU标志位是进入STOP模式的必要条件。

三、RTC定时时长的计算

函数 HAL_RTCEx_SetWakeUpTimer(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock) 中的参数WakeUpCounter 和WakeUpClock 决定定时的时长:

wakeup time =WakeUpCounter * (WakeUpClock /LSI)

本例中:wakeup time = 11560 *(16/37000) = 4s

四、后记

1、程序通过STLINK下载后,按键reset 进行复位,程序无法进入STOP模式,必须断电重启才能进入STOP模式。 不知原因,先行记录。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。