STM32H750XB_RT-THREAD/43-RTC实时时钟/RTC—闹钟实验/User/rtc/bsp_rtc.c
2025-07-21 14:34:29 +08:00

240 lines
6.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2019-xx-xx
* @brief RTC驱动
******************************************************************************
* @attention
*
* 实验平台:野火 STM32H743 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "stm32h7xx.h"
#include "./RTC/bsp_rtc.h"
#include "./usart/bsp_usart.h"
#include "./lcd/bsp_lcd.h"
#include "./led/bsp_led.h"
#include "./beep/bsp_beep.h"
RTC_HandleTypeDef Rtc_Handle;
__IO uint8_t Alarmflag =0;
/**
* @brief 设置时间和日期
* @param 无
* @retval 无
*/
void RTC_TimeAndDate_Set(void)
{
RTC_DateTypeDef RTC_DateStructure;
RTC_TimeTypeDef RTC_TimeStructure;
// 初始化时间
RTC_TimeStructure.TimeFormat = RTC_H12_AMorPM;
RTC_TimeStructure.Hours = HOURS;
RTC_TimeStructure.Minutes = MINUTES;
RTC_TimeStructure.Seconds = SECONDS;
RTC_TimeStructure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
RTC_TimeStructure.StoreOperation = RTC_STOREOPERATION_RESET;
HAL_RTC_SetTime(&Rtc_Handle,&RTC_TimeStructure, RTC_FORMAT_BIN);
// 初始化日期
RTC_DateStructure.WeekDay = WEEKDAY;
RTC_DateStructure.Date = DATE;
RTC_DateStructure.Month = MONTH;
RTC_DateStructure.Year = YEAR;
HAL_RTC_SetDate(&Rtc_Handle,&RTC_DateStructure, RTC_FORMAT_BIN);
HAL_RTCEx_BKUPWrite(&Rtc_Handle,RTC_BKP_DRX, RTC_BKP_DATA);
}
/**
* @brief 显示时间和日期
* @param 无
* @retval 无
*/
void RTC_TimeAndDate_Show(void)
{
uint8_t Rtctmp=0;
char LCDTemp[100];
RTC_TimeTypeDef RTC_TimeStructure;
RTC_DateTypeDef RTC_DateStructure;
while(1)
{
// 获取日历
HAL_RTC_GetTime(&Rtc_Handle, &RTC_TimeStructure, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&Rtc_Handle, &RTC_DateStructure, RTC_FORMAT_BIN);
// 每秒打印一次
if(Rtctmp != RTC_TimeStructure.Seconds)
{
// 打印日期
printf("The Date : Y:20%0.2d - M:%0.2d - D:%0.2d - W:%0.2d\r\n",
RTC_DateStructure.Year,
RTC_DateStructure.Month,
RTC_DateStructure.Date,
RTC_DateStructure.WeekDay);
//液晶显示日期
//先把要显示的数据用sprintf函数转换为字符串然后才能用液晶显示函数显示
sprintf(LCDTemp,"The Date : Y:20%0.2d - M:%0.2d - D:%0.2d - W:%0.2d",
RTC_DateStructure.Year,
RTC_DateStructure.Month,
RTC_DateStructure.Date,
RTC_DateStructure.WeekDay);
LCD_SetColors(LCD_COLOR_RED,LCD_COLOR_BLACK);
LCD_DisplayStringLine_EN_CH(8,(uint8_t *)LCDTemp);
// 打印时间
printf("The Time : %0.2d:%0.2d:%0.2d \r\n\r\n",
RTC_TimeStructure.Hours,
RTC_TimeStructure.Minutes,
RTC_TimeStructure.Seconds);
//液晶显示时间
sprintf(LCDTemp,"The Time : %0.2d:%0.2d:%0.2d",
RTC_TimeStructure.Hours,
RTC_TimeStructure.Minutes,
RTC_TimeStructure.Seconds);
LCD_DisplayStringLine_EN_CH(10,(uint8_t *)LCDTemp);
// (void)RTC->DR;
if(Alarmflag)
{
Alarmflag++;
if(Alarmflag < 30)
{
LED2_TOGGLE;
BEEP_TOGGLE;
}
else
Alarmflag = 30;
}
}
Rtctmp = RTC_TimeStructure.Seconds;
}
}
/**
* @brief RTC配置选择RTC时钟源设置RTC_CLK的分频系数
* @param 无
* @retval 无
*/
void RTC_CLK_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
// 配置RTC外设
Rtc_Handle.Instance = RTC;
/*使能 PWR 时钟*/
__HAL_RCC_RTC_ENABLE();
/* PWR_CR:DBF置1使能RTC、RTC备份寄存器和备份SRAM的访问 */
HAL_PWR_EnableBkUpAccess();
#if defined (RTC_CLOCK_SOURCE_LSI)
/* 使用LSI作为RTC时钟源会有误差
* 默认选择LSE作为RTC的时钟源
*/
/* 初始化LSI */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/* 选择LSI做为RTC的时钟源 */
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
#elif defined (RTC_CLOCK_SOURCE_LSE)
/* 初始化LSE */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/* 选择LSE做为RTC的时钟源 */
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
/* Configures the External Low Speed oscillator (LSE) drive capability */
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_HIGH);
#endif /* RTC_CLOCK_SOURCE_LSI */
/* 使能RTC时钟 */
__HAL_RCC_RTC_ENABLE();
/* 等待 RTC APB 寄存器同步 */
HAL_RTC_WaitForSynchro(&Rtc_Handle);
/*=====================初始化同步/异步预分频器的值======================*/
/* 驱动日历的时钟ck_spare = LSE/[(255+1)*(127+1)] = 1HZ */
/* 设置异步预分频器的值 */
Rtc_Handle.Init.AsynchPrediv = ASYNCHPREDIV;
/* 设置同步预分频器的值 */
Rtc_Handle.Init.SynchPrediv = SYNCHPREDIV;
Rtc_Handle.Init.HourFormat = RTC_H12_AMorPM;
/* 用RTC_InitStructure的内容初始化RTC寄存器 */
if (HAL_RTC_Init(&Rtc_Handle) != HAL_OK)
{
printf("\n\r RTC 时钟初始化失败 \r\n");
}
}
/*
* 要使能 RTC 闹钟中断,需按照以下顺序操作:
* 1. 配置 NVIC 中的 RTC_Alarm IRQ 通道并将其使能。
* 2. 配置 RTC 以生成 RTC 闹钟(闹钟 A 或闹钟 B
*
*
*/
void RTC_AlarmSet(void)
{
RTC_AlarmTypeDef RTC_AlarmStructure;
/* RTC 闹钟中断配置 */
__HAL_RCC_SYSCFG_CLK_ENABLE();
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
/* EXTI 配置 */
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
/* 使能RTC闹钟中断 */
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
/* 设置闹钟时间 */
RTC_AlarmStructure.Alarm = RTC_Alarm_X;
RTC_AlarmStructure.AlarmTime.TimeFormat = RTC_H12_AMorPM;
RTC_AlarmStructure.AlarmTime.Hours = ALARM_HOURS;
RTC_AlarmStructure.AlarmTime.Minutes = ALARM_MINUTES;
RTC_AlarmStructure.AlarmTime.Seconds = ALARM_SECONDS;
RTC_AlarmStructure.AlarmMask = ALARM_MASK;
RTC_AlarmStructure.AlarmDateWeekDaySel = ALARM_DATE_WEEKDAY_SEL;
RTC_AlarmStructure.AlarmDateWeekDay = ALARM_DATE_WEEKDAY;
HAL_RTC_SetAlarm_IT(&Rtc_Handle, &RTC_AlarmStructure, RTC_FORMAT_BIN);
}
/**
* @brief Alarm callback
* @param hrtc : RTC handle
* @retval None
*/
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
/* 闹钟时间到蜂鸣器标志位置1 */
Alarmflag = 1;
}
/**********************************END OF FILE*************************************/