【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);
}
串口输出:
RTC 通常使用低速外部时钟(LSE)或低速内部时钟(LSI)作为时钟源。LSE 的精度较高,建议优先选择。 在读写RTC寄存器时,需要注意寄存器的同步问题。某些寄存器可能需要在特定条件下才能访问或修改。 利用RTC模块可以设置时间闹钟,当当前时间与设定的时间匹配时,产生中断或者事件通知。 在代码中,使用HAL_RTC_Init函数初始化RTC。需要设置RTC的时钟源和校准参数。 设置完成后,闹钟将在指定时间触发中断。 对于更精确的时间控制,推荐使用外部晶振。 推荐使用 32.768kHz 晶振 可以通过外部32.768kHz晶振作为时钟源,实现低功耗运行。 如何配置RTC、设置时间、读取时间以及在LCD上显示时间。 在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变,只要后备区域供电正常即可。但在系统复位后会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。因此,在设置时间之前需要先取消备份区域(BKP)写保护。 通过VBAT引脚连接备用电池 因电源波动导致的RTC计时不准确或异常复位等问题。 推荐32.768kHz晶振作为外部低速晶振(LSE)。 注意,读取的时间数据通常是以BCD码格式存储的,需要转换为十进制数据才能进行后续处理。 参考STM32H745I-DISCO开发板的相关文档和示例代码 非常有价值的实验项目 在NVIC中配置RTC闹钟中断,并在中断服务函数中处理闹钟事件。当闹钟触发时,中断服务函数会被调用,可以在这里执行所需的操作,如点亮LED指示灯。 RTC 使用备份域电源,即使主电源关闭,只要备份域电源正常,RTC 仍能继续计时。 STM32H7的RTC模块支持低功耗模式,可以在系统进入待机或停止模式时继续运行。
页:
[1]
2