历史上的今天
今天是:2024年09月08日(星期日)
2021年09月08日 | STM32CubeMX配置RTC——基于(STM32G070+STM32CubeMX+HAL库+RTC)
2021-09-08 来源:eefocus
实验目的:
通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。
一、STM32CubeMX配置如下:
1.时钟树配置:
因为板子没有外部RTC晶振,所以只能使用内部32KHz晶振,时钟树配置如下:

2.RTC配置:

(1)关于Asynchronous Predivider value 和 Synchronous Predivider value填写多少,请看下面:


因为内部晶振是32KHz,所以毫无疑问应该选择LSI=32KHz即:
Asynchronous Predivider value :127
Synchronous Predivider value :249
(2)关于Hours、Minutes等这些初值没啥好疑问的,直接填写,但是Year需要注意一下,它是从1970年开始算起的,所以比如填写50就是2020年的意思。
二、STM32CubeMX配置生成的HAL库如下:
/**
******************************************************************************
* File Name : RTC.c
* Description : This file provides code for the configuration
* of the RTC instances.
******************************************************************************
* @attention
*
*
© Copyright (c) 2020 STMicroelectronics. * All rights reserved.
* All rights reserved.
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "rtc.h"
/* USER CODE BEGIN 0 */
RTC_TimeTypeDef GetTime; //µ¥Æ¬»úÄÚ²¿RTC¶Áȡʱ¼ä
RTC_DateTypeDef GetDate; //µ¥Æ¬»úÄÚ²¿RTC¶ÁÈ¡ÈÕÆÚ
uint8_t RTC_READ_Flag;
/* USER CODE END 0 */
RTC_HandleTypeDef hrtc;
/* RTC init function */
void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
/** Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 249;
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;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN Check_RTC_BKUP */
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date
*/
sTime.Hours = 19;
sTime.Minutes = 07;
sTime.Seconds = 00;
sTime.SubSeconds = 0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
sDate.Month = RTC_MONTH_SEPTEMBER;
sDate.Date = 8;
sDate.Year = 50;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
}
void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{
if(rtcHandle->Instance==RTC)
{
/* USER CODE BEGIN RTC_MspInit 0 */
/* USER CODE END RTC_MspInit 0 */
/* RTC clock enable */
__HAL_RCC_RTC_ENABLE();
__HAL_RCC_RTCAPB_CLK_ENABLE();
/* USER CODE BEGIN RTC_MspInit 1 */
/* USER CODE END RTC_MspInit 1 */
}
}
void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
{
if(rtcHandle->Instance==RTC)
{
/* USER CODE BEGIN RTC_MspDeInit 0 */
/* USER CODE END RTC_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_RTC_DISABLE();
__HAL_RCC_RTCAPB_CLK_DISABLE();
/* USER CODE BEGIN RTC_MspDeInit 1 */
/* USER CODE END RTC_MspDeInit 1 */
}
}
三、时间日期获取设置等:
1、自己重绘一个设置time的函数:
/* USER CODE BEGIN 1 */
void RTC_SetTime(u8 hour, u8 minute, u8 second)
{
/*##-2- Configure the Time #################################################*/
GetTime.Hours = hour;
GetTime.Minutes = minute;
GetTime.Seconds = second;
// GetTime.TimeFormat = RTC_HOURFORMAT12_AM;
GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
GetTime.StoreOperation = RTC_STOREOPERATION_RESET;
if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK)
{
}
}
/* USER CODE END 1 */
2、调用函数实现RTC:
1.首先初始化RTC时钟:
MX_RTC_Init();
2.接着设置time时间:
RTC_SetTime(11,59,50); //设置时间为11时59分50秒
3.然后调用HAL库函数实现time和date获取,有个细节要注意一下,需要先获取日期再获取时间,亲测直接获取时间会有问题:
HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新时间
完美,收工!!!
史海拾趣
|
前几天和论坛里一位聊天,说起工程师不能光闷头干活,也得注意交际,他也深表同意。 看上去工程师似乎只要闷头做自己的事就行了,但是和同事的交流、和领导的交流可能也会很重要。虽然技术是一个硬指标,但在哪里都是那些能说会道的人沾光。再说了 ...… 查看全部问答> |
|
比如把我的gprs modem 和开发版接起来,在开发版上进行ppp拨号,这时候建立ppp的两端是指 “开发版 和 基站” 还是 “开发版 和 猫” 或者 “猫 &nb ...… 查看全部问答> |
|
最近做一个基于GSM的家庭安全系统,需要GSM模块和视频模块在HT46的基础上,将不安全信息用短信发送给屋主,请问 (1)这方面的GSM只是需要从哪里开始入手学习,比较容易入门?而且需要尽快做出来,之前没有基础。 &nbs ...… 查看全部问答> |
|
我配置S3C2410的LCD控制器,点亮了LCD屏,但是画面存在错位。我的屏是320*240,TFT 屏的偏左侧有一道1.5cm宽的黑色条块,然后才是WinCE的桌面,然后屏的最左侧是原本应该在最右侧的图像。大概和下面的标注一样: 12 ...… 查看全部问答> |
|
wince下用c#开发pda里的mp3播放程序,代码是怎么写的,好象没有winmm.dll是吧。 wince下好象是没有winmm.dll的是吧。 谁知道哪里有这些资料的,谢谢了。会及时揭贴的。希望发一些好的资料给我参考下。 以前没怎么做过pda下的程序。… 查看全部问答> |
|
OPT这条伪指令的功能对源码设置列表输出选择,包括强制换页,强制行号变为零等, 1、设置后代码列表是在哪生成的? 2、OPT在实际应用中起到一个什么作用? 3、常应用于什么场合?… 查看全部问答> |
|
请问使用合众达的例子,合众达下的codec文件夹下的videnc_copy.c中XDAS_Int32 VIDENCCOPY_TI_process(IVIDENC_Handle h, XDM_BufDesc *inBufs, XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs){ &nbs ...… 查看全部问答> |




