蓝桥杯嵌入式学习笔记(9):RTC程序设计

目录

前言

1. RTC介绍

2. 使用CubeMx进行源工程配置

3. 代码编程

3.1 准备工作

3.2 进行bsp_rtc.h编写

3.3 进行bsp_rtc.c编写 

3.4 main.c编写

3.4.1 头文件引用

3.4.2 变量声明 

3.4.3 子函数声明

3.4.4 函数实现

3.4.5 main函数编写

4. 代码实验

5. 总结 


前言

因本人备赛蓝桥杯嵌入式省赛,故编写此学习笔记进行学习上的记录。

上文我们实现了TIM程序设计,本文我们进行RTC程序设计

1. RTC介绍

RTC是一个独立的定时器,RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。

从STM32G4系列微控制器参考手册的时钟树图可以看出,RTCCLK 时钟源可以是 HSE/32、LSE 或 LSI 时钟。

LSE 时钟位于 RTC 域中,而 HSE 和 LSI 时钟则不在 RTC 域中。

  • 如果选择 LSE 作为 RTC 时钟:

        即使 VDD 电源关闭,RTC 仍可继续工作,前提是VBAT电源得到维持。

  • 如果选择LSI作为RTC时钟:

        如果 VDD 电源断电,则无法保证 RTC 状态。

  • 如果将除以预分频器的 HSE 时钟用作 RTC 时钟:

        如果 VDD 电源断电或内部电压调节器已关闭电源(从 VCORE 域断开电源)。

当RTC时钟为LSE或LSI时,RTC在系统下保持时钟和功能重置。

2. 使用CubeMx进行源工程配置

-【Pinout&Configuration】

-【Timers】

-【RTC】

         -【Mode】

                -【Activate Clock Source】和【Activate Calendar】

-在【Clock Configuration】配置RTC时钟源为HSE_RTC,时钟源频率为750KHz。

RTC时钟频率 = RTC时钟源 / ((Asynchronous Predivider value + 1) * (Synchronous Predivider value + 1)) 

         -【Parameter Settings】

                 -【Asynchronous Predivider Value】设置为124

                -【Synchronous Predivider value 】设置为5999。

这样,RTC时钟频率就为1Hz。

配置完成后,我们去生成源文件。

3. 代码编程

3.1 准备工作

接下来我们在Test_Project工程里的Src文件夹创建BSP\RTC\bsp_rtc.c,同理,在Inc文件夹创建BSP\RTC\bsp_rtcm.h。这就是我们后面要编写的中间层代码文件。

打开Test_Project工程,进行文件Group的添加

在bsp_rtc.c中添加依赖文件

#include "RTC/bsp_rtc.h"

随后进行编译。

添加stm32g4xx_hal_rtc.c和stm32g4xx_hal_rtc_ex.c驱动文件

在stm32g4xx_hal_conf.h中去掉#define HAL_RTC_MODULE_ENABLED 的注释。 

#define HAL_RTC_MODULE_ENABLED   

3.2 进行bsp_rtc.h编写

通过Source工程生成的tim模块进行剪裁修改,h文件如下

/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes */extern RTC_HandleTypeDef hrtc;void RTC_Init(void);

3.3 进行bsp_rtc.c编写 

通过Source工程生成的tim模块进行剪裁修改,c文件如下

#include "RTC/bsp_rtc.h"RTC_HandleTypeDef hrtc;void 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 = 125;hrtc.Init.SynchPrediv = 6000;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();}/** Initialize RTC and set the Time and Date*/sTime.Hours = 0;sTime.Minutes = 0;sTime.Seconds = 0;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_MONDAY;sDate.Month = RTC_MONTH_JANUARY;sDate.Date = 1;sDate.Year = 0;if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}}void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{if(rtcHandle->Instance==RTC){/* RTC clock enable */__HAL_RCC_RTC_ENABLE();}
}void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
{if(rtcHandle->Instance==RTC){/* Peripheral clock disable */__HAL_RCC_RTC_DISABLE();}
}

3.4 main.c编写

3.4.1 头文件引用

#include "main.h"
#include "LCD\bsp_lcd.h"
#include "RTC\bsp_rtc.h"

3.4.2 变量声明 

//变量声明
__IO uint32_t uwTick_Lcd_Set_Point;//LCD减速//*LCD显示专用变量
unsigned char Lcd_Disp_String[22];//RTC相关变量
RTC_TimeTypeDef H_M_S_Time;
RTC_DateTypeDef Y_M_D_Date;

3.4.3 子函数声明

//***子函数声明区
void SystemClock_Config(void);
void Lcd_Proc(void);

3.4.4 函数实现

3.4.4.1 时钟函数定义

void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Configure the main internal regulator output voltage*/HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;RCC_OscInitStruct.PLL.PLLN = 20;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}/** Initializes the peripherals clocks*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC12;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_PLL;PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV32;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}

3.4.4.2 LCD函数实现

void Lcd_Proc(void)
{if((uwTick - uwTick_Lcd_Set_Point)<200)return;uwTick_Lcd_Set_Point = uwTick;//RTC内容显示HAL_RTC_GetTime(&hrtc,&H_M_S_Time,RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc,&Y_M_D_Date,RTC_FORMAT_BIN);sprintf((char*)Lcd_Disp_String,"Time:%02d-%02d-%02d",(unsigned int)H_M_S_Time.Hours,(unsigned int)H_M_S_Time.Minutes,(unsigned int)H_M_S_Time.Seconds);LCD_DisplayStringLine(Line4,Lcd_Disp_String);
}

3.4.5 main函数编写

int main(void)
{HAL_Init();SystemClock_Config();LCD_Init();LCD_Clear(White);LCD_SetBackColor(White);LCD_SetTextColor(Blue);//RTC初始化RTC_Init();while (1){Lcd_Proc();}
}

4. 代码实验

将代码进行编译并下载到开发板上。效果如下图所示。

时钟计时按1s为单位进行增加,RTC基本功能已成功实现!

5. 总结 

本文通过CubeMx进行配置RTC的参数以及时钟资源,并通过CubeMx生成的源工程进行二次编写成功实现了RTC的基本功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/588963.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 Python 本地客户端操作读写云服务器 Redis 缓存数据库详细教程(更新中)

Redis 基本概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的使用 ANSI C 语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value…

Kubernetes(k8s):如何进行 Kubernetes 集群健康检查?

Kubernetes&#xff08;k8s&#xff09;&#xff1a;如何进行 Kubernetes 集群健康检查&#xff1f; 一、节点健康检查1、使用 kubectl 查看节点状态2、查看节点详细信息3、检查节点资源使用情况 2、Pod 健康检查2.1、 使用 kubectl 查看 Pod 状态2.2、 查看特定 Pod 的详细信息…

2012年认证杯SPSSPRO杯数学建模D题(第一阶段)人机游戏中的数学模型全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 减缓热岛效应 D题 人机游戏中的数学模型 原题再现&#xff1a; 计算机游戏在社会和生活中享有特殊地位。游戏设计者主要考虑易学性、趣味性和界面友好性。趣味性是本质吸引力&#xff0c;使玩游戏者百玩不厌。网络游戏一般考虑如何搭建安全可…

zabbix 7.0 新增功能亮点(一)——T参数

概要&#xff1a; T参数是zabbix7.0新增的一项功能&#xff0c;它支持对配置文件进行可用性验证&#xff0c;即zabbix程序(server/proxy/agent等)修改配置文件后&#xff0c;支持-T或–test-config参数验证配置参数可用性。 T参数主要包含以下三个方面的应用场景&#xff1a; …

解决Centos7无法连接网络和访问网页连接不上问题

一、网络无法连接问题 网络无法连接的问题我查到了一个很良心的操作&#xff0c;不用重装&#xff0c;因为可能是你虚拟机设置上的问题。我先写我的解决方案&#xff0c;再附上其他几种解决方案。 问题一&#xff1a; 虚拟机的问题****加粗样式 解决&#xff1a; &#xff08;…

ImportError: cannot import name ‘PILLOW_VERSION‘ from ‘PIL‘

原因&#xff1a;torchvision模块在运行时要调用PIL模块的PILLOW_VERSION函数&#xff0c;但PILLOW_VERSION在Pillow 7.0.0之后的版本被移除了&#xff0c;Pillow 7.0.0之后的版本使用__version__函数代替PILLOW_VERSION函数。 解决方法&#xff1a;降低pillow版本即可。 参考…

人工智能应用工程师怎样报名,费用多少,就业机会怎么样?

人工智能应用工程师是能够利用人工智能相关技术进行应用研发&#xff0c;并开展各类工作的从业人员统称。为贯彻落实《国务院关于印发新一代人工智能发展规划的通知》、工业和信息化部《促进新一代人工智能产业发展三年行动计划&#xff08;2018-2020年&#xff09;》等文件精神…

JUC:原子类型的使用(原子整数、原子引用、原子数组、字段更新器、累加器)

文章目录 原子类型AtomicInteger 原子整数AtomicReferenc 原子引用AtomicStampedReference 带版本号的原子引用AtomicMarkableReference 仅记录是否修改的原子引用AtomicXXXArray 原子数组AtomicXXXFieldUpdater 字段更新器LongAdder累加器 原子类型 AtomicInteger 原子整数 …

部署项目遇到的各种问题总结

文章目录 前言一、后端问题 jar包运行出现错误宝塔面板使用jdk17二、数据库问题 版本问题三、前端问题 连不上后端总结 前言 在做完项目之后&#xff0c;为了让别人访问到自己的网站&#xff0c;就需要部署前端后端以及数据库&#xff0c;但是在部署的过程中出现了各种问题和困…

vue-quill-editor 富文本编辑器(可上传视频图片),组件挂载的方式实现

1.安装 npm install vue-quill-editor --save npm install quill-image-drop-module --save npm install quill-image-resize-module --save2.在组件下面新增组件 QlEditor (1)index.vue <template><div><div idquillEditorQiniu><!-- 基于element…

如何制作不同类型的二维码?快捷在线生码的3个步骤

怎么简单快速的完成二维码制作呢&#xff1f;现在二维码可以做很多的用途使用&#xff0c;比如可以用于内容展示、下载文件、播放音视频、扫码看图等等。那么上面讲述的这些类型二维码该如何制作呢&#xff0c;相信有很多的小伙伴都会二维码制作的技巧非常感兴趣。那么下面就让…

【Redis基础篇】详细讲解Redis

这篇文章让你详细了解Redis的相关知识&#xff0c;有代码讲解以及图片剖析&#xff0c;让你更轻松掌握 制作不易&#xff0c;感觉不错&#xff0c;请点赞收藏哟 &#xff01;&#xff01;&#xff01; 目录 1 redis基础 1.1 定义 1.2 SQL和NOSQL不同点 1.3 特征 1.4 Redis…