本帖最后由 damiaa 于 2024-8-4 18:57 编辑
【NUCLEO H533RE】之五 时钟功能测试
一、打开stm32cubeide,配置时钟
RCC配置HSE和LSE 外部晶体
RTC选择Activate Clock Source(时钟源)和 Activate Calendar(日历)
检查时钟配置(Clock Config) 选LSE
时钟和日历,可以在这里配置,也可以在运行时设置
加入闹钟,下面就会出现闹钟的一些参数,可以在这里配置,也可以在运行时设置
闹钟的中断也可以选择
32.768的外部时钟就连接到RTC了,时钟日历也配置好了。
二、生成代码介绍
选择后保存产生代码。
main.c中就有了
rtc结构句柄
RTC_HandleTypeDef hrtc;
rtc初始化函数
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};
RTC_AlarmTypeDef sAlarm = {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 = 127;
hrtc.Init.SynchPrediv = 255;
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 */
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date
*/
sTime.Hours = 0x0;
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_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 0x1;
sDate.Year = 0x0;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
/** Enable the Alarm A
*/
sAlarm.AlarmTime.Hours = 0x8;
sAlarm.AlarmTime.Minutes = 0x30;
sAlarm.AlarmTime.Seconds = 0x0;
sAlarm.AlarmTime.SubSeconds = 0x0;
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(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN RTC_Init 2 */
/* USER CODE END RTC_Init 2 */
}
如果勾了报警中断 xxxxx_it.c就有报警中断的添加 这样还需要加报警的回调函数,这里没用到。
rtc的其他调用函数都在stm32h5xx_hal_rtc.h中可以看到。
三、加入代码
因为选择了报警中断A,如果要处理这个中断主程序中就要添加这个回调函数(选择了其他中断就要加入其他中断的回调函数)。
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
}
如果选择了报警B或其他中断也是和这类似的处理。
关于回调函数,ST还提供了一个HAL_RTC_RegisterCallback来注册自己的回调函数,但还要配置USE_HAL_RTC_REGISTER_CALLBACKS 为1 .这个麻烦。还不如使用同名的回调函数省事。其实其他中断也有这操作 比如串口什么的。
关于时间和日历的设置,初始化里面有了,可以搬来照抄。
如何读出时间和日历,这个我们在stm32H5xx_hal_rtc.c里面都可以找到它们的原型。
在串口函数中处理设置和读写时间的命令。
main函数中处理命令:
如上在主程序中加代码
- 初始化中就设置了时间,日期,报警等等.
- 做一个串口读的命令解析:
读时间getdt +回车(0x0d)
设置时间sett 12 30 09 +回车(0x0d)
设置日期setd 2 08 02 2024 +回车(0x0d)
设置报警seta 11 35 00 1+回车(0x0d)
- 回调函数中加入读命令解析程序,如果有读命令,做个标记。
- 主程序中处理串口数据
- 发现有数据回应串口数据应答。
-
四、编译下载调试,实验验证:
试用串口调试软件发送命令和接收数据,具体看下面视频:
9aa916874e8380e516b5bbba39e2400d
谢谢