需求描述
执行完毕正常代码之后,让MCU进入待机模式,设置闹钟,自动让MCU从待机模式中被唤醒。可以用led点亮熄灭显示是否唤醒。
应用场景:比如设计一个野外温度自动采集的设备,规定每小时采集一次温度,就可以定义一个1小时的闹钟,定时唤醒,采集温度,采集完进入待机模式,可以大大降低设备功耗。
CubeMX配置
初始配置HAL 库:创建hal首要配置内容---查询相关函数的方法-CSDN博客
配置USART1:选择异步通讯模式,其他保持默认
配置RTC:激活时钟源,然后点击时钟配置页,勾选LSE(外部低速晶振),其余保持默认。
配置LED等:用来表示当前的工作状态,查找PA1选择Output,配置位通用推挽输出,默认高电平(关灯状态)。
生成代码:HAL 库:创建hal首要配置内容---查询相关函数的方法-CSDN博客
配置keil:魔法棒勾选MicroLIB,点击Debug配置自动复位。
书写代码
第一步 重写printf函数
在usart.c文件最下方书写,当然记得头文件引入<stdio.h>
cs
/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *file)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return ch;
}
/* USER CODE END 1 */
第二步书写 mian.c文件
cs
/* USER CODE BEGIN 2 */
// 清除标志位
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB))
{
printf("从待机模式唤醒!\n");
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
}
if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU))
{
printf("发生了唤醒事件!\n");
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
}
printf("低功率实验:待机模式...\n");
// 1. 开启LED灯,延时2s,模拟正常程序执行过程
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
HAL_Delay(2000);
/* USER CODE END 2 */
其中开启LED灯为了方便在main.h文件进行了宏定义
cs
#define LED2_Pin GPIO_PIN_1
#define LED2_GPIO_Port GPIOA
cs
while (1)
{
// 2. 进入待机模式
printf("正常代码执行完毕,3s后进入待机模式...\n");
HAL_Delay(3000);
printf("进入待机模式,等待5s后RTC闹钟唤醒...\n");
// 2.1 设置RTC闹钟
RTC_SetAlarm(5);
// 2.2 调库进入待机模式
HAL_PWR_EnterSTANDBYMode();
// 3. 以下代码不会执行
printf("从待机模式中唤醒...\n");
HAL_Delay(2000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
其中的设置RTC闹钟重写了一个函数在rtc.c文件的最下方
cs
// 定义设置闹钟的函数
void RTC_SetAlarm(uint32_t s)
{
// 1. 获取当前时间,类型就是RTC_TimeTypeDef
RTC_TimeTypeDef currTime;
HAL_RTC_GetTime(&hrtc, &currTime, RTC_FORMAT_BIN);
// 2. 调库设置闹钟
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = currTime.Hours;
sAlarm.AlarmTime.Minutes = currTime.Minutes;
sAlarm.AlarmTime.Seconds = currTime.Seconds + s - 1;
HAL_RTC_SetAlarm(&hrtc, &sAlarm, RTC_FORMAT_BIN);
}
/* USER CODE END 1 */