基于STM32H750的RTC自动唤醒

2023-08-10  

STM32H750 的实时时钟是一个独立的 BCD 定时器/计数器,且带了日历功能,它提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。

此外RTC 还有自动唤醒单元,RTC还可以补偿闰年闰月等等,还有备份区域(BKP)写保护,这些这里不细说了。

RTC 的简化框图

f24f5146-47ae-11ed-a3b6-dac502259ad0.png

时钟和分频

STM32H750 的 RTC 时钟源(RTCCLK)通过时钟控制器,可以从 LSE、LSI、HSE 时钟三选一,如图所示,有两个预分频器RTC_PRER

ck_spre 的时钟可由如下计算公式计算:

Fck_spre = Frtcclk/[(PREDIV_S+1)*( PREDIV_A+1)]

图中,ck_apre 也可作为 RTC 亚秒递减计数器(RTC_SSR)的时钟。

Fck_apre的计算公式如下:

Fck_apre=Frtcclk/( PREDIV_A+1)

当 RTC_SSR 寄存器递减到 0 的时候,会使用 PREDIV_S 的值重新装载 PREDIV_S,得到亚秒时间的精度是:1/256 秒,可以得到更加精确的时间数据。

STM32CubeIDE 配置

默认情况下是如图

f26c6290-47ae-11ed-a3b6-dac502259ad0.png

一般情况下使用LSE,这里我们需要在RCC使能

f2a317a4-47ae-11ed-a3b6-dac502259ad0.png

然后在RTC中使能时钟源,如果需要日历闹钟功能的可以在这里也使能上。

f2b860dc-47ae-11ed-a3b6-dac502259ad0.png

公式如下:

RTC时钟频率 = RTC时钟源 / ((Asynchronous Predivider value + 1) * (Synchronous Predivider value + 1))= 1Hz,也就是1秒

之后到时钟配置里面可以看到已经使能了

f2f508e8-47ae-11ed-a3b6-dac502259ad0.png

初始化


static void MX_RTC_Init(void)

{


  /* USER CODE BEGIN RTC_Init 0 */


  /* USER CODE END RTC_Init 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.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;

  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;

  if (HAL_RTC_Init(&hrtc) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN RTC_Init 2 */


  /* USER CODE END RTC_Init 2 */


}

可以看到outline里面有很多我们需要的函数,那么自己扩展就可以使用了

f31ac826-47ae-11ed-a3b6-dac502259ad0.png

This function configures the hardware resources used in this example


void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)

{

  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

  if(hrtc->Instance==RTC)

  {

  /* USER CODE BEGIN RTC_MspInit 0 */


  /* USER CODE END RTC_MspInit 0 */

  /** Initializes the peripherals clock

  */

    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;

    PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)

    {

      Error_Handler();

    }


    /* Peripheral clock enable */

    __HAL_RCC_RTC_ENABLE();

  /* USER CODE BEGIN RTC_MspInit 1 */


  /* USER CODE END RTC_MspInit 1 */

  }


}

可以按需定制自己的实现方式,RTC是特别实用的一个模块了。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。