当前位置: 首页 > article >正文

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>

/* 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文件

  /* 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文件进行了宏定义

#define LED2_Pin GPIO_PIN_1
#define LED2_GPIO_Port GPIOA
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文件的最下方

// 定义设置闹钟的函数
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 */


http://www.kler.cn/a/488748.html

相关文章:

  • Unity + Firebase + GoogleSignIn 导入问题
  • mysql message from server: “Too many connections“
  • 基于Springboot+Vue的仓库管理系统
  • android源码编译后,为什么emulator一直黑屏或者停止android界面
  • 数据集-目标检测系列- 电话 测数据集 call_phone >> DataBall
  • mybatisX插件的使用,以及打包成配置
  • [ LeetCode 75 ] 283 移动零(JavaScript)
  • mysql -> 达梦数据迁移(mbp大小写问题兼容)
  • Ubuntu | PostgreSQL | 解决 ERROR: `xmllint` is missing on your system.
  • 学习第六十四行
  • 创建一个Spring Boot项目
  • 使用PVE快速创建虚拟机集群并搭建docker环境
  • 安全运维管理 10.1环境管理
  • GPU算力平台|在GPU算力平台部署LLama3大模型的详细教程
  • system securiry: supervisor password required
  • 在 Visual Studio Code 中使用 qmake 构建和调试 Qt 项目
  • python调用window库全屏截图生成bmp位图学习
  • TrustRAG:增强RAG系统鲁棒性与可信度的创新框架
  • 儿童玩具加拿大SOR/2011-17测试安全标准
  • Transformer:深度学习的变革力量
  • ffmpeg 常用命令 案例
  • 【Uniapp-Vue3】在组件中通过props进行数据传递
  • Vue.js 组件开发:从基础到进阶
  • 蓝桥杯嵌入式速通(1)
  • Java的 BIO、NIO、AIO?分别的作用和用法
  • YCM托管YashanDB报错 /home/yashan/.yasboot/.env is not existed