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 */
相关推荐
无畏jh1 小时前
TLE5012B磁阻芯片解读
嵌入式硬件·汽车嵌入式·磁阻芯片
培林将军2 小时前
Altium Designer 22的安装与汉化
嵌入式硬件·ad工具安装
idcardwang2 小时前
xl9555-IO拓展芯片
stm32·单片机·嵌入式硬件
Y1rong2 小时前
STM32之EXTI
stm32·单片机·嵌入式硬件
兆龙电子单片机设计2 小时前
【STM32项目开源】STM32单片机智能语音家居控制系统
stm32·单片机·嵌入式硬件·物联网·开源·自动化
TaidL2 小时前
茂捷M1020电感式编码器芯片赋能工业智能升级,适用于工业及机器人等领域的各种应用场景
单片机·嵌入式硬件
意法半导体STM322 小时前
【官方原创】SAU对NSC分区的影响 LAT1578
stm32·单片机·嵌入式硬件·mcu·信息安全·trustzone·stm32开发
SmartRadio2 小时前
MK8000(UWB射频芯片)与DW1000的协议适配
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·dw1000
LDR0062 小时前
芯片电路的引脚标识代表什么?
stm32·单片机·嵌入式硬件
恒锐丰小吕3 小时前
屹晶微 EG3116 600V高压、2A/2.5A驱动、双高有效输入逻辑的半桥栅极驱动芯片技术解析
嵌入式硬件·硬件工程