RTC是非常实用的时间,日期功能模块,STM32H7S78-DK提供RTC功能,在使能RTC模块的同时,也使能UART串口打印功能,方便后期展示RTC数据。
在图形化配置界面:
点击保存,检查生成的代码:
- static void MX_UART4_Init(void)
- {
- /* USER CODE BEGIN UART4_Init 0 */
- /* USER CODE END UART4_Init 0 */
- /* USER CODE BEGIN UART4_Init 1 */
- /* USER CODE END UART4_Init 1 */
- huart4.Instance = UART4;
- huart4.Init.BaudRate = 115200;
- huart4.Init.WordLength = UART_WORDLENGTH_8B;
- huart4.Init.StopBits = UART_STOPBITS_1;
- huart4.Init.Parity = UART_PARITY_NONE;
- huart4.Init.Mode = UART_MODE_TX_RX;
- huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- huart4.Init.OverSampling = UART_OVERSAMPLING_16;
- huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
- huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
- huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
- if (HAL_UART_Init(&huart4) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_SetTxFifoThreshold(&huart4, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_SetRxFifoThreshold(&huart4, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_DisableFifoMode(&huart4) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN UART4_Init 2 */
- /* USER CODE END UART4_Init 2 */
- }
- 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 */
- }
重定向printf
- #ifdef __GNUC__
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
- #else
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
- #endif
- PUTCHAR_PROTOTYPE
- {
- HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
- return ch;
- }
接下来打印日期与时间:
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] Display the current time and date.
- * @param showtime : pointer to buffer
- * @param showdate : pointer to buffer
- * @retval None
- */
- static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
- {
- RTC_DateTypeDef sdatestructureget;
- RTC_TimeTypeDef stimestructureget;
- /* Get the RTC current Time */
- HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
- /* Get the RTC current Date */
- HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
- /* Display time Format : hh:mm:ss */
- sprintf((char *)showtime, "%2d:%2d:%2d", stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
- /* Display date Format : mm-dd-yyyy */
- sprintf((char *)showdate, "%2d-%2d-%2d", sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);
- printf("\r\n%s", showtime);
- printf("\r\n%s", showdate);
- }
展示:
|