STM32H7S7x8 实时时钟(RTC)RTC提供自动唤醒以管理所有低功耗模式。实时时钟(RTC)是一个独立的BCD定时器/计数器。RTC提供具有可编程报警中断的时间时钟/日历。RTC还包括一个具有中断功能的周期性可编程唤醒标志。备份域重置后,所有RTC寄存器都受到保护,防止可能的寄生写入除了在特权模式下配置的访问之外。只要电源电压保持在工作范围内RTC就不会停止,无论设备状态如何(运行模式、低功耗模式或重置下)。
STM32H7S7x8 RTC主要特征如下:
•带有子秒、秒、分钟、小时(12或24格式)、日(日期)的日历
周)、日期(月中的某一天)、月份和年份。
•夏令时补偿可通过软件编程。
•具有中断功能的可编程报警。警报可以由任何人触发
日历字段的组合。
•自动唤醒单元生成周期性标志,触发自动唤醒
中断。
•参考时钟检测:可以使用更精确的第二源时钟(50或60 Hz)
用于提高日历精度。
•使用亚秒级移位功能与外部时钟精确同步。
•数字校准电路(周期性计数器校正):精度为0.95 ppm,在
几秒钟的校准窗口
•用于保存事件的时间戳功能
•可屏蔽中断/事件:
–警报A
–警报B
–唤醒中断
–时间戳
配置 开启RTC
开启串口打印
重写fputc()函数:
int fputc(int ch,FILE *f)
{
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart4,temp,1,2);
return ch;
} |
static void MX_RTC_Init(void)
{
/* USER CODE BEGIN RTC_Init 0 */
/* USER CODE END RTC_Init 0 */
RTC_PrivilegeStateTypeDef privilegeState = {0};
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
/* USER CODE BEGIN RTC_Init 1 */
/* USER CODE END RTC_Init 1 */
/** Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
hrtc.Init.BinMode = RTC_BINARY_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_NONE;
privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
if (HAL_RTCEx_PrivilegeModeSet(&hrtc, &privilegeState) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN Check_RTC_BKUP */
/* Set Date and Time (if not already done before)*/
/* Read the Back Up Register 0 Data */
if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2)
{
/* Configure RTC Calendar */
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date
*/
sTime.Hours = 0x2;
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
sDate.Month = RTC_MONTH_NOVEMBER;
sDate.Date = 0x8;
sDate.Year = 0x0;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN RTC_Init 2 */
/* Writes a data in a RTC Backup data Register0 */
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F2);
}
else
{
/* Check if the Power On Reset flag is set */
if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST) != RESET)
{
/* Turn on LD2: Power on reset occurred */
BSP_LED_On(LD2);
}
/* Check if Pin Reset flag is set */
if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
{
/* Turn on LD2: External reset occurred */
BSP_LED_On(LD2);
}
}
/* Clear source Reset Flag */
__HAL_RCC_CLEAR_RESET_FLAGS();
/* USER CODE END RTC_Init 2 */
}
<blockquote>static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
管理
[url=]更多操作[/url]
|