cubmx+RTC(基础理念、闹钟和唤醒)+HAL库学习1

目录

1.RTC

1.1RTC基本概念

1.1.1RTC的简介

1.1.2RTC框图

1.2.RTC的功能说明

1.2.1时钟和预分频器

1.2.2实时时钟和日历

1.2.3可编程闹钟

1.2.4RTC的时间校准

1.2.5时间戳功能

1.2.6RTC的入侵检测

1.2.7校准时钟输出

1.2.8闹钟的复用输出

​编辑

1.2.9低功耗模式

1.2.10中断复位标志

1.3HAL库函数

1.4cubmx的参数讲解

1.4.1General

1.4.2Calendar Time

1.4.3Calendar Data

1.4.4alarm

1.4.5Wake UP


1.RTC

1.1RTC基本概念

1.1.1RTC的简介
  • 实时时钟 (RTC) 是一个独立的BCD定时器/计数器。RTC提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。两个32位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时(12或24小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为28、29(闰年)、30和31天。并且还可以进行夏令时补偿。其它32位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期

  • RTC的时钟来源 :从RTC的定时器特性来说,它是一个32位的计数器,只能向上计数。它使用的时钟源有三种, 分别为高速外部时钟的128分频(HSE/128)、低速内部时钟LSI以及低速外部时钟 LSE 使HSE分频时钟或LSI的话在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,因此没法保证RTC正常工作。因此RTC一般使用低速外部时钟LSE,频率通常为实时时钟模块中常用的32.768KHz,这是因为32768 = 2^{15},分频容易实现,所以它被广泛应用到RTC模块。
  • RTC的供电掉电,是指主电源VDD断开的情况,为了RTC外设掉电继续运行,必须接上锂电池给STM32的RTC、备份发卡通过VBAT引脚供电。当主电源VDD有效时,由VDD给RTC外设供电;而当 VDD掉电后,由VBAT给RTC外设供电。
  • RTC的数据存储:RTC中的数据都保存在属于RTC的备份域中,若主电源VDD和VBAT都掉电,那么备份域中保存的所有数据将丢失。 备份域除了RTC模块的寄存器,还有42个16位的寄存器可以在VDD掉电的情况下保存用户程 序的数据,系统复位或电源复位时,这些数据也不会被复位。在主电源VDD有效的情况下 (待机),RTC还可以配置闹钟事件使STM32退出待机模式
1.1.2RTC框图

  • 时间戳:就是某个外部事件上跳沿或下跳沿变化发生时刻的日历时间,例如行车记录仪在发生碰撞时保存的,发生碰撞时刻的RTC日期时间数据就是时间戳。启用RTC的时间戳功能。可以选择复用脚RTC_AF1或RTC_AF2作为事件源RTC_TS。监测其上跳沿及下跳沿变化。当复用引脚上发生事件时。RTC就将当前的日期时间数据,记录到时间戳寄存器。还会产生时间戳信号。响应此时间中断就可以读取出时间戳寄存器的数据
  • 影子寄存器:日历时间计数器的数值暂存寄存器,每隔两个RTCCLK周期就将当前的日历值复制到影子寄存器,当程序读取日期时间数据时,读取的是影子寄存器的内容。而不会影响日历计数器的工作
  • 备份寄存器:STM32F407上有20个32位备份寄存器这些备份寄存器是在备份域中的由备用电池VBAT供电在系统主电源关闭成复位时,备份寄存器的数据不会丢失所以可以用于保存用户定义数据当检测到入侵事件发生时MCU就会复位这20个备份寄存器的内容,MCU会产生中断事件信号同时还会记录时间戳数据
  • 参考信号RTC_REFINRTC的日历更新可以与一个参考时钟信号RTC_REFIN通常为50HZ成-60Hz同步,参考时钟信号RTC_REFIN的精度应该高于32.768kz的LSE时钟,启用RTC_REFIN检时日历仍然由LSE提供时钟,而RTC_REFIN用于补偿不准确的日历更新频率
  • RTC唤醒RTC还有两个可编程的闹钟A/B,如果设置了闹钟A/B的时间,则闹钟A/B设定时间会和当前日历时间对比,如果时间相等,会产生ALRA/BF事件
  • 入侵检测:也可以记录时间戳数据入侵检测输入信号源有两个可以配置为边缘检测或带滤波的电平检测

1.2.RTC的功能说明

1.2.1时钟和预分频器

  • 预分频器RTC_PRER由7位的异步预分频器PREDIV_A和15位的同步预分频器PREDIV_S组成。异步预分频器时钟CK_APRE用于为二进制RTC_SSR亚秒递减计数器提供时钟,同步预分频器时钟CK_SPRE用于更新日历。
  • 要使用频率为32.768kHz的LSE获得频率为1Hz的内部时钟 (ck_spre),需要将异步预分频系数设置为128,并将同步预分频系数设置为256。
  • 分频系数的最小值为 1,最大值为2^{22}
​​​​​​
  • ck_spre时钟既可以用于更新日历,也可以用作16位唤醒自动重载定时器的时基。为获得较
    短的超时周期,还可以将16位唤醒自动重载定时器与经可编程的4位异步预分频器分频的
    RTCCLK一同运行
1.2.2实时时钟和日历
  • RTC时间寄存器 (RTC_TR)

\

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于HAL库的STM32F1系列使用RTC闹钟唤醒停止模式的代码示例: ```c #include "stm32f1xx_hal.h" RTC_HandleTypeDef hrtc; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_RTC_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_RTC_Init(); while (1) { // 进入低功耗模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后继续执行 } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } void MX_RTC_Init(void) { RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; RTC_AlarmTypeDef sAlarm; hrtc.Instance = RTC; hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } sTime.Hours = 0x00; sTime.Minutes = 0x00; sTime.Seconds = 0x00; sTime.H12 = RTC_HOURFORMAT_24; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } sAlarm.AlarmTime.Hours = 0x00; sAlarm.AlarmTime.Minutes = 0x01; sAlarm.AlarmTime.Seconds = 0x00; sAlarm.AlarmTime.H12 = RTC_HOURFORMAT_24; sAlarm.AlarmMask = RTC_ALARMMASK_NONE; sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; sAlarm.AlarmDateWeekDay = 0x1; sAlarm.Alarm = RTC_ALARM_A; if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } if (HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x32F2) != HAL_OK) { Error_Handler(); } if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2) { Error_Handler(); } } void Error_Handler(void) { while (1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { } #endif void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { // RTC闹钟中断回调函数 // 在这里执行唤醒后的操作 // ... } ``` 这段代码初始化了RTC模块,并设置了闹钟的时间为每分钟的第一秒。在主循环中,通过调用`HAL_PWR_EnterSTOPMode()`函数进入低功耗模式,等待RTC闹钟中断唤醒。在`HAL_RTC_AlarmAEventCallback()`函数中,可以执行唤醒后的操作。请根据实际需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值