【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗

目录

一、CubeMX配置RTC

[1.RTC实时重要一环------BKP 寄存器](#1.RTC实时重要一环——BKP 寄存器)

2.RTC实时时钟

2.1打开RTC并设置时间

2.2打开外部低速时钟

2.3代码实现:

二、单片机工作模式

1.低功耗睡眠模式(Sleep)

2.低功耗停止模式(Stop)

3.低功耗待机模式(StandBy)

三、看门狗

1.独立看门狗

2.窗口看门狗


一、CubeMX配置RTC

1.RTC实时重要一环------BKP 寄存器

BKP寄存器简介

BKP(Backup Registers)备份寄存器

BKP可用于存储用户应用程序数据。当VDD(2.03.6V)电源被切断,他们仍然由VBAT (1.83.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时他们也不会被复位

TAMPER引脚产生的侵入事件将所有备份寄存器内容清除

RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲

存储RTC时钟校准寄存器

用户数据存储容量:

20字节(中容量和小容量)/ 84字节(大容量和互联型)

小实验将要实现的现象:单片机掉电后,不会遗忘BKP寄存器中的数值!

硬件连接:(需要额外供电给VB引脚)

第一次先写:

HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,100);

uint32_t Ret= HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1);//断电后靠VBAT供电

OLED_ShowNum(0, 0, Ret, 4, 12);

运行后,第二次注释掉HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,100);并且把单片机供电拔了,继续运行,按道理说,这个Ret数值就会随着单片机断电变成0,但是当VDD电源被切断,他仍然由VBAT维持供电!所以数值会维持不变!

CubeMX配置简单使用BKP寄存器:

BKP 寄存器通常与 RTC 一起使用,在CubeIDE中假如需要使用BKP寄存器,需要先打开RTC

代码实现:

cpp 复制代码
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C2_Init();
  MX_RTC_Init();
  /* USER CODE BEGIN 2 */
	OLED_Init();//OLED初始化
	OLED_CLS();
	

//	HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,100);//写BKP
  uint32_t Ret= HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1);//断电后靠VBAT供电。读BKP

  OLED_ShowNum(0, 0, Ret, 4, 12);//显示数值


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			
   }
    /* USER CODE END 3 */
}

2.RTC实时时钟

CubeMX配置:

2.1打开 RTC 并设置时间

2.2打开外部低速时钟

配置RTC时钟源为LSE外部低速时钟

2.3代码实现:

cpp 复制代码
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_RTC_Init();
  MX_I2C2_Init();
  /* USER CODE BEGIN 2 */
  RTC_TimeTypeDef RTC_Time ;//时分秒
  RTC_DateTypeDef RTC_Date; //年月日
	
	OLED_Init();
	OLED_CLS();
	OLED_ShowStr(0, 0, "Data:20  -   -", 2);
	OLED_ShowStr(0, 2, "Time:", 2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_RTC_GetDate(&hrtc, &RTC_Date, RTC_FORMAT_BIN);
		HAL_RTC_GetTime(&hrtc,&RTC_Time, RTC_FORMAT_BIN);
		OLED_ShowNum(57, 0, RTC_Date.Year, 2, 16);
		OLED_ShowNum(78, 0, RTC_Date.Month, 2, 16);
		OLED_ShowNum(100, 0, RTC_Date.Date, 2, 16);
		
		OLED_ShowNum(57, 2, RTC_Time.Hours , 2, 16);
		OLED_ShowNum(78, 2, RTC_Time.Minutes, 2, 16);
		OLED_ShowNum(100, 2, RTC_Time.Seconds, 2, 16);
  }
  /* USER CODE END 3 */
}

效果:

二、单片机工作模式

1.低功耗睡眠模式(Sleep)

使用

cpp 复制代码
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);

打开睡眠模式。由于Hal库与标准库在管理系统时钟和低功耗模式时的处理方式不同,Hal库中需要多手动关闭SysTick定时器,因为SysTick定时器会周期性触发中断,会唤醒睡眠模式。

cpp 复制代码
HAL_SuspendTick();//关闭SysTick定时器
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();//恢复SysTick定时器

2.低功耗停止模式(Stop)

cpp 复制代码
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);//进入Stop模式
SystemClock_Config();//恢复时钟

3.低功耗待机模式(StandBy)

配置 PA0 为唤醒引脚:

代码:

cpp 复制代码
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

while(1)
{
  __HAL_RCC_PWR_CLK_ENABLE();
  HAL_PWR_EnterSTANDBYMode();
}

三、看门狗

1.独立看门狗

打开独立看门狗并设置预分频器和重装值:

cpp 复制代码
HAL_IWDG_Refresh(&hiwdg);//初始化完成后执行一次喂狗
//获取当前的复位是IWDG造成的复位还是按Rst键造成的复位
if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) 
{
    // IWDG reset flag is set
    OLED_ShowString(2, 1, "IWDGRST"); //OLED闪烁IWDGRST字符串
    HAL_Delay(500);
    OLED_ShowString(2, 1, " ");
    HAL_Delay(100);
    __HAL_RCC_CLEAR_RESET_FLAGS();
}
else
{
    OLED_ShowString(3, 1, "RST"); //OLED闪烁RST字符串
    HAL_Delay(500);
    OLED_ShowString(3, 1, " ");
    HAL_Delay(100);
}

while (1)
{
    HAL_IWDG_Refresh(&hiwdg);//喂狗
    HAL_Delay(1100);
}

2.窗口看门狗

代码:

cpp 复制代码
//获取当前的复位是WWDG造成的复位还是按Rst键复位,这里代码有大耗时,需要在
MX_WWDG_Init(); 之前
if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) 
{
    // IWDG reset flag is set
    OLED_ShowString(2, 1, "WWDGRST"); //OLED闪烁IWDGRST字符
    HAL_Delay(500);
    OLED_ShowString(2, 1, " ");
    HAL_Delay(100);
    __HAL_RCC_CLEAR_RESET_FLAGS();
}
else
{
    OLED_ShowString(3, 1, "RST"); //OLED闪烁RST字符
    HAL_Delay(500);
    OLED_ShowString(3, 1, " ");
    HAL_Delay(100);
}

MX_WWDG_Init();
while (1)
{
    HAL_Delay(40);
    HAL_WWDG_Refresh(&hwwdg);//喂狗
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);//开
}
相关推荐
_Kayo_3 小时前
VUE2 学习笔记6 vue数据监测原理
vue.js·笔记·学习
chenchihwen3 小时前
大模型应用班-第2课 DeepSeek使用与提示词工程课程重点 学习ollama 安装 用deepseek-r1:1.5b 分析PDF 内容
人工智能·学习
Ronin-Lotus3 小时前
嵌入式硬件篇---有线串口通信问题解决
单片机·嵌入式硬件·ttl·rs232·rs485·有线串口
超浪的晨3 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
Ronin-Lotus5 小时前
嵌入式硬件篇---zigbee无线串口通信问题
嵌入式硬件·zigbee·无线串口
GalaxySinCos5 小时前
08 51单片机之串口通信
单片机·嵌入式硬件·51单片机
悠哉悠哉愿意5 小时前
【电赛学习笔记】MaxiCAM 项目实践——与单片机的串口通信
笔记·python·单片机·嵌入式硬件·学习·视觉检测
快乐肚皮5 小时前
ZooKeeper学习专栏(五):Java客户端开发(原生API)详解
学习·zookeeper·java-zookeeper
慕y2745 小时前
Java学习第七十二部分——Zookeeper
java·学习·java-zookeeper
★YUI★6 小时前
学习游戏制作记录(剑投掷技能)7.26
学习·游戏·unity·c#