STM32 拓展 RTC案例1:使用闹钟唤醒待机模式 (HAL库)

需求描述

执行完毕正常代码之后,让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 */
相关推荐
zd84510150015 分钟前
proteus OLED12864仿真
单片机·嵌入式硬件·proteus
qq_2151383271 小时前
【Proteus仿真】【32单片机-A007】PT100热敏温度检测系统设计
单片机·嵌入式硬件
LaoZhangGong1233 小时前
语法: lcd_load( buffer_pointer, offset, length);
经验分享·单片机·嵌入式硬件·pic单片机
Leiditech__4 小时前
汽车氛围灯400V浪涌防护方案之SD3002P4-3的应用实践
嵌入式硬件·汽车·硬件工程·emc·mosfet
不不不丶4 小时前
STM32——RTC实时时钟
stm32·嵌入式硬件·实时音视频
damo王6 小时前
STM32 的编程方式总结
stm32·单片机·嵌入式硬件
Likeadust6 小时前
依靠视频设备轨迹回放平台EasyCVR构建视频监控,为幼教连锁园区安全护航
大数据·网络·人工智能·音视频·实时音视频
板栗焖小鸡7 小时前
Odrive0.5.1-FOC电机控制 arm_cos_f32.cpp arm_sin_f32.cpp代码实现(二)
arm开发·单片机·嵌入式硬件
板栗焖小鸡7 小时前
Odrive0.5.1-FOC电机控制 arm_cos_f32.cpp arm_sin_f32.cpp代码实现(一)
arm开发·单片机·嵌入式硬件
买辣椒用券7 小时前
STM32 vs ESP32:如何选择最适合你的单片机?
stm32·单片机·嵌入式硬件