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 */
相关推荐
可喜~可乐1 小时前
CAN总线入门指南:从原理到实践
c++·stm32·单片机·硬件工程
冰糖雪莲IO4 小时前
【江协STM32】9-4/5 USART串口数据包、串口收发HEX数据包&串口收发文本数据包
网络·stm32·嵌入式硬件
无聊到发博客的菜鸟4 小时前
STM32中的MCO
stm32·单片机·嵌入式硬件
Echo_cy_4 小时前
STM32 I2C通信外设
stm32·单片机·嵌入式硬件
半个番茄4 小时前
STM32 : PWM 基本结构
stm32·单片机·嵌入式硬件
qq_459730036 小时前
STM32-ADC模数转换
stm32·单片机·嵌入式硬件
半个番茄7 小时前
STM32 : GPIO_TypeDef
stm32·单片机·嵌入式硬件
厉昱辰8 小时前
51单片机入门基础
单片机·嵌入式硬件·51单片机
JaneZJW8 小时前
江科大STM32入门——UART通信笔记总结
笔记·stm32·单片机·嵌入式