南来之风 发表于 2025-3-10 12:44

【STM32H745I-DISCO试用】RTC实时钟实验


RTC配置:
/*##-1- Configure the RTC peripheral #######################################*/
RtcHandle.Instance = RTC;

/* Configure RTC prescaler and RTC data registers */
/* RTC configured as follows:
      - Hour Format    = Format 24
      - Asynch Prediv= Value according to source clock
      - Synch Prediv   = Value according to source clock
      - OutPut         = Output Disable
      - OutPutPolarity = High Polarity
      - OutPutType   = Open Drain */
RtcHandle.Init.HourFormat   = RTC_HOURFORMAT_24;
RtcHandle.Init.AsynchPrediv   = RTC_ASYNCH_PREDIV;
RtcHandle.Init.SynchPrediv    = RTC_SYNCH_PREDIV;
RtcHandle.Init.OutPut         = RTC_OUTPUT_DISABLE;
RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
RtcHandle.Init.OutPutType   = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&RtcHandle) != HAL_OK)
{
    /* Initialization Error */
    Error_Handler();
}


增加串口输出
static void MX_USART3_UART_Init(void)
{

/* USER CODE BEGIN USART3_Init 0 */

/* USER CODE END USART3_Init 0 */

/* USER CODE BEGIN USART3_Init 1 */

/* USER CODE END USART3_Init 1 */
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN USART3_Init 2 */

/* USER CODE END USART3_Init 2 */

}在STM32H7XX_HAL_MSP.C中增加UART3初始化代码:
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
if(huart->Instance==USART3)
{
/* USER CODE BEGIN USART3_MspInit 0 */

/* USER CODE END USART3_MspInit 0 */

/** Initializes the peripherals clock
*/
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3;
    PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    /* Peripheral clock enable */
    __HAL_RCC_USART3_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**USART3 GPIO Configuration
    PB10   ------> USART3_TX
    PB11   ------> USART3_RX
    */
    GPIO_InitStruct.Pin = VCP_TX_Pin|VCP_RX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* USER CODE BEGIN USART3_MspInit 1 */

/* USER CODE END USART3_MspInit 1 */

}

}

实时获取RTC时间:
/**
* @briefDisplay the current time.
* @paramshowtime : pointer to buffer
* @retval None
*/
static void RTC_TimeShow(uint8_t* showtime)
{
RTC_DateTypeDef sdatestructureget;
RTC_TimeTypeDef stimestructureget;

/* Get the RTC current Time */
HAL_RTC_GetTime(&RtcHandle, &stimestructureget, RTC_FORMAT_BIN);
/* Get the RTC current Date */
HAL_RTC_GetDate(&RtcHandle, &sdatestructureget, RTC_FORMAT_BIN);
/* Display time Format : hh:mm:ss */
sprintf(aShowTime,"\r\n%02d:%02d:%02d",stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
HAL_UART_Transmit(&huart3, aShowTime, sizeof(aShowTime), 0xffffffff);
}


串口输出:

biechedan 发表于 2025-3-12 16:56

RTC 通常使用低速外部时钟(LSE)或低速内部时钟(LSI)作为时钟源。LSE 的精度较高,建议优先选择。

mickit 发表于 2025-3-12 20:11

在读写RTC寄存器时,需要注意寄存器的同步问题。某些寄存器可能需要在特定条件下才能访问或修改。

juliestephen 发表于 2025-3-12 22:26

利用RTC模块可以设置时间闹钟,当当前时间与设定的时间匹配时,产生中断或者事件通知。

robertesth 发表于 2025-3-12 22:49

在代码中,使用HAL_RTC_Init函数初始化RTC。需要设置RTC的时钟源和校准参数。

uytyu 发表于 2025-3-14 10:09

设置完成后,闹钟将在指定时间触发中断。

hudi008 发表于 2025-3-14 11:47

对于更精确的时间控制,推荐使用外部晶振。

loutin 发表于 2025-3-14 14:00

推荐使用 32.768kHz 晶振

bestwell 发表于 2025-3-14 15:08

可以通过外部32.768kHz晶振作为时钟源,实现低功耗运行。

alvpeg 发表于 2025-3-14 15:36

如何配置RTC、设置时间、读取时间以及在LCD上显示时间。

juliestephen 发表于 2025-3-14 17:15

在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变,只要后备区域供电正常即可。但在系统复位后会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。因此,在设置时间之前需要先取消备份区域(BKP)写保护。

uytyu 发表于 2025-3-14 23:12

通过VBAT引脚连接备用电池            

macpherson 发表于 2025-3-15 03:19

因电源波动导致的RTC计时不准确或异常复位等问题。

hearstnorman323 发表于 2025-3-15 07:52

推荐32.768kHz晶振作为外部低速晶振(LSE)。

kkzz 发表于 2025-3-15 12:48

注意,读取的时间数据通常是以BCD码格式存储的,需要转换为十进制数据才能进行后续处理。

i1mcu 发表于 2025-3-15 14:32

参考STM32H745I-DISCO开发板的相关文档和示例代码

qiufengsd 发表于 2025-3-15 15:32

非常有价值的实验项目            

backlugin 发表于 2025-3-15 15:54

在NVIC中配置RTC闹钟中断,并在中断服务函数中处理闹钟事件。当闹钟触发时,中断服务函数会被调用,可以在这里执行所需的操作,如点亮LED指示灯。

ccook11 发表于 2025-3-15 16:22

RTC 使用备份域电源,即使主电源关闭,只要备份域电源正常,RTC 仍能继续计时。

phoenixwhite 发表于 2025-3-15 16:43

STM32H7的RTC模块支持低功耗模式,可以在系统进入待机或停止模式时继续运行。
页: [1] 2
查看完整版本: 【STM32H745I-DISCO试用】RTC实时钟实验