打印
[STM32H7]

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

[复制链接]
1548|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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时间:
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Display the current time.
  * @param  showtime : 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模块可以设置时间闹钟,当当前时间与设定的时间匹配时,产生中断或者事件通知。

使用特权

评论回复
5
robertesth| | 2025-3-12 22:49 | 只看该作者
在代码中,使用HAL_RTC_Init函数初始化RTC。需要设置RTC的时钟源和校准参数。

使用特权

评论回复
6
uytyu| | 2025-3-14 10:09 | 只看该作者
设置完成后,闹钟将在指定时间触发中断。

使用特权

评论回复
7
hudi008| | 2025-3-14 11:47 | 只看该作者
对于更精确的时间控制,推荐使用外部晶振。

使用特权

评论回复
8
loutin| | 2025-3-14 14:00 | 只看该作者
推荐使用 32.768kHz 晶振

使用特权

评论回复
9
bestwell| | 2025-3-14 15:08 | 只看该作者
可以通过外部32.768kHz晶振作为时钟源,实现低功耗运行。

使用特权

评论回复
10
alvpeg| | 2025-3-14 15:36 | 只看该作者
如何配置RTC、设置时间、读取时间以及在LCD上显示时间。

使用特权

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

使用特权

评论回复
12
uytyu| | 2025-3-14 23:12 | 只看该作者
通过VBAT引脚连接备用电池              

使用特权

评论回复
13
macpherson| | 2025-3-15 03:19 | 只看该作者
因电源波动导致的RTC计时不准确或异常复位等问题。

使用特权

评论回复
14
hearstnorman323| | 2025-3-15 07:52 | 只看该作者
推荐32.768kHz晶振作为外部低速晶振(LSE)。

使用特权

评论回复
15
kkzz| | 2025-3-15 12:48 | 只看该作者
注意,读取的时间数据通常是以BCD码格式存储的,需要转换为十进制数据才能进行后续处理。

使用特权

评论回复
16
i1mcu| | 2025-3-15 14:32 | 只看该作者
参考STM32H745I-DISCO开发板的相关文档和示例代码

使用特权

评论回复
17
qiufengsd| | 2025-3-15 15:32 | 只看该作者
非常有价值的实验项目              

使用特权

评论回复
18
backlugin| | 2025-3-15 15:54 | 只看该作者
在NVIC中配置RTC闹钟中断,并在中断服务函数中处理闹钟事件。当闹钟触发时,中断服务函数会被调用,可以在这里执行所需的操作,如点亮LED指示灯。

使用特权

评论回复
19
ccook11| | 2025-3-15 16:22 | 只看该作者
RTC 使用备份域电源,即使主电源关闭,只要备份域电源正常,RTC 仍能继续计时。

使用特权

评论回复
20
phoenixwhite| | 2025-3-15 16:43 | 只看该作者
STM32H7的RTC模块支持低功耗模式,可以在系统进入待机或停止模式时继续运行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

274

帖子

2

粉丝