华大HC32F460RTC时钟实验
1. 实验目标
本实验主要通过对RTC的配置及编程,实现两个功能:
- 每一秒LED1取反一次;
- 每一秒通过串口输出实时日期及时间。
2.实验准备
硬件搭建:ZW-HC32F460-BZ标准版开发板1套
软件搭建:MDK5.22
3. 硬件原理
本案硬件接口用到了LED及串口输出,硬件原理参见对应章节。
4. 驱动代码
驱动文件:Rtc.c,Rtc.h
【Rtc.h定义】
为了使用方便,本案定义了RTC时间结构体。
typedef struct{uint8_t nHour;uint8_t nMinute;uint8_t nSecond;uint8_t nMonth;uint8_t nDay;uint8_t nWeek;uint16_t nYear;} RTC_TIME_DEF;
【实时时间获取】
本案使用了C语言标准库文件time.c文件获取系统(电脑)当下实时时间,用该时间对MCU的RTC时钟进行初始化,这样RTC时间就能与实时时间基本保持一致。
- __DATE__ :获取当前日期,以 “MMM DD YYYY” 格式表示的字符串常量;其中MMM为月份,是月份英文单词的前三个字母;DD为DD日;YYYY为年份。
- __TIME__:获取当前时间,以 “HH:MM:SS” 格式表示的字符串常量;其中HH表示小时,MM是分钟,SS表示秒。
sprintf(arrDate,"%s",__DATE__);//MMM DD YYYYsprintf(arrTime,"%s",__TIME__);//HH:MM:SS
这里定义了两个字符串数组arrDate和arrTime用来存储日期和时间。
【RTC配置】
RTC配置主要进行如下操作
- 使用RTC_Init()函数进行RTC基本参数配置;
- 使用enIrqRegistration()注册RTC中断功能;;
- 使能中断功能
- NVIC_EnableIRQ()使能向量中断;
- RTC_IrqCmd()使能RTC周期中断。
- 使用RTC_Cmd()启动RTC计数。
void Rtc_Config(void){stc_rtc_init_t stcRtcInit;stc_irq_regi_conf_t stcIrqRegiConf;/* configuration structure initialization */MEM_ZERO_STRUCT(stcRtcInit);MEM_ZERO_STRUCT(stcIrqRegiConf);/* Reset rtc counter */if (RTC_DeInit() == ErrorTimeout){DDL_Printf("reset rtc failed!\r\n");}else{/* Configuration rtc structure */stcRtcInit.enClkSource = RtcClkLrc;stcRtcInit.enPeriodInt = RtcPeriodIntOneSec;stcRtcInit.enTimeFormat = RtcTimeFormat24Hour;stcRtcInit.enCompenWay = RtcOutputCompenDistributed;stcRtcInit.enCompenEn = Disable;stcRtcInit.u16CompenVal = 0u;RTC_Init(&stcRtcInit);/* Configure interrupt of rtc period */stcIrqRegiConf.enIntSrc = INT_RTC_PRD;stcIrqRegiConf.enIRQn = Int006_IRQn;stcIrqRegiConf.pfnCallback = &RtcPeriod_IrqCallback;enIrqRegistration(&stcIrqRegiConf);NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); /* Enable period and alarm interrupt */RTC_IrqCmd(RtcIrqPeriod, Enable); /* Startup rtc count */RTC_Cmd(Enable);}}
【RTC时间设置】
RTC时间这里采用了DEC模式进行设置,所以通过DATE和TIME获取时间后,需要将字符串转换为十进制。
void Rtc_CalendarConfig(void){stc_rtc_date_time_t stcRtcDateTimeCfg;char arrDate[20];char arrTime[20];char pDest[20];RTC_TIME_DEF stTime;sprintf(arrDate,"%s",__DATE__);//MMM DD YYYYsprintf(arrTime,"%s",__TIME__);//HH:MM:SSsprintf(pDest, "%s", (char*)memcpy ((char*)pDest, (char*)arrDate, 3)); if (strcmp(pDest, "Jan") == 0) stTime.nMonth = 1;else if (strcmp(pDest, "Feb") == 0) stTime.nMonth = 2;else if (strcmp(pDest, "Mar") == 0) stTime.nMonth = 3;else if (strcmp(pDest, "Apr") == 0) stTime.nMonth = 4;else if (strcmp(pDest, "May") == 0) stTime.nMonth = 5;else if (strcmp(pDest, "Jun") == 0) stTime.nMonth = 6;else if (strcmp(pDest, "Jul") == 0) stTime.nMonth = 7;else if (strcmp(pDest, "Aug") == 0) stTime.nMonth = 8;else if (strcmp(pDest, "Sep") == 0) stTime.nMonth = 9;else if (strcmp(pDest, "Oct") == 0) stTime.nMonth = 10;else if (strcmp(pDest, "Nov") == 0) stTime.nMonth = 11;else if (strcmp(pDest, "Dec") == 0) stTime.nMonth = 12;else stTime.nMonth = 1;stTime.nDay = (arrDate[4]-0x30)*10+(arrDate[5]-0x30); //日stTime.nYear = (arrDate[9]-0x30)*10+(arrDate[10]-0x30); //年 stTime.nHour = (arrTime[0]-0x30)*10+(arrTime[1]-0x30); //时stTime.nMinute = (arrTime[3]-0x30)*10+(arrTime[4]-0x30); //分stTime.nSecond = (arrTime[6]-0x30)*10+(arrTime[7]-0x30); //秒;/* configure structure initialization */MEM_ZERO_STRUCT(stcRtcDateTimeCfg);/* calendar configuration */stcRtcDateTimeCfg.u8Year = stTime.nYear; //年stcRtcDateTimeCfg.u8Month = stTime.nMonth; //月stcRtcDateTimeCfg.u8Day = stTime.nDay; //日stcRtcDateTimeCfg.u8Weekday = RtcWeekdayThursday; //周stcRtcDateTimeCfg.u8Hour = stTime.nHour; //时stcRtcDateTimeCfg.u8Minute = stTime.nMinute; //分stcRtcDateTimeCfg.u8Second = stTime.nSecond; //秒stcRtcDateTimeCfg.enAmPm = RtcHour12Pm;RTC_SetDateTime(RtcDataFormatDec, &stcRtcDateTimeCfg, Enable, Enable);}
注意:年份这里只使用了后两位,前两位默认为“20”。
5.主流程图
6.实验过程
【第一步:新建/配置工程】
参见2.2.3节,将工程模板复制到实验目录下,将工程名改为RTC_CLOCK(名称仅供参考)。
勾选FWLibCfg.h配置中的CLK_EN、EFM_EN、GPIO_EN、PWC_EN、SRAM_EN、 UTILITY_EN、INTERRUPTS_EN、RTC_EN选项
【第二步:添加RTC模块驱动】
将Rtc.c和Rtc.h复制到\实验18 RTC时钟实验\Hardware\OnBoard路径下,同时将Rtc.c添加到工程中Hardware/OnBoard下
【第三步:回调函数功能编写】
一般可以在中断回调函数中编写自己的功能,这里定义了一个周期中断标志位,将该标志置1,在主函数对齐进行判断之后进行置0.
static void RtcPeriod_IrqCallback(void){u8SecIntFlag = 1u;}
【第四步:初始化编程】
1)添加Adc头文件
在main.c和Rtc.c文件中添加 Rtc.h和Led.h头文件。
#include "Adc.h"#include "Led.h"
2)初始化编程
模板主函数中默认已经调用了系统时钟初始化函数HardwareInt();
在主函数中调用LED和RTC初始化函数。
LedInt();/* Configure Rtc */Rtc_Config();/* wait for rtc running */Ddl_Delay1ms(1u);/* Update time after RTC startup */Rtc_CalendarConfig();AdcConfig ();
需要注意:RTC时间配置函数Rtc_CalendarConfig在RTC初始化配置Rtc_Config函数之后,可以适当延时一点时间,让RTC正常启动运行。
【第五步:功能实现】
按照主逻辑编写while(1)功能即可。
while( 1 ){ if (1u == u8SecIntFlag){u8SecIntFlag = 0u;/*Get current time */RTC_GetDateTime(RtcDataFormatDec, &stcCurrDateTime) ;LedToggle(LED1);/* Print current date and time information */DDL_Printf("20%02d/%02d/%02d %02d:%02d:%02d \n",stcCurrDateTime.u8Year,stcCurrDateTime.u8Month,stcCurrDateTime.u8Day, stcCurrDateTime.u8Hour,stcCurrDateTime.u8Minute, stcCurrDateTime.u8Second);} }
【第六步:结果验证】
编译代码并下载至开发板运行程序,LED每隔一秒改变一次状态,同时串口输出实时时间;一般时间会比电脑系统时间稍晚,因为程序获取时间是获取的编译程序时的系统。
7. 实验扩展
1)RTC时间设置函数改为BCD模式进行设置;
2)RTC配置为12小时制,分AM和PM进行时间显示。
华大HC32F460RTC时钟实验相关推荐
- c语言实验报告世界时钟,基于LCD的电子时钟实验报告.doc
PAGE \* MERGEFORMAT 3 河海大学物联网工程学院 课程设计报告 题 目 基于LCD的电子时钟实验 专业.学号 电信 . 授课班号 完成时间 2013.07.05 课程设计(报告)任务 ...
- 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...
- Mixly数码管TM1637时钟实验
Mixly数码管TM1637时钟实验 实验一:实现滚动显示自定义字符串 实验二:实现显示自定义时间 实验三:实现显示秒表 实验一:实现滚动显示自定义字符串 Mixly程序源码截图: 核心代码: #in ...
- 黑金AX301开发板学习(3)——动态数码管的时钟实验
开发板的使用是AX301,学习资料可以在我的另一篇文章中找到.链接在如下:https://blog.csdn.net/qq_24213087/article/details/108238682 一.动 ...
- 基于VHDL的数字时钟实验报告
数字时钟实验报告 [实验目的]: 设计一个24小时制数字钟,要求能显示时,分,秒,并且可以手动调整时和分 [试验中所用器材]: 开发环境MAX-PLUSII,ZY11EDA13BE 试验系统, VHD ...
- 【正点原子STM32连载】 第二十七章 RTC实时时钟实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- (实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】
文章目录 其它文章链接,独家吐血整理 实验现象 主程序 RTC初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...
- STM32学习笔记(十九)RTC实时时钟实验
STM32F103ZET6之RTC实时时钟实验 文章目录 STM32F103ZET6之RTC实时时钟实验 前言 一.简介 二.相关寄存器及配置过程 三.程序源码 1.rtc.h 2.rtc.c 3.m ...
- 8086实时时钟实验(一)——《x86汇编语言:从实模式到保护模式》05
1.代码清单 ;代码清单9-1;文件名:c09_1.asm;文件说明:用户程序 ;创建日期:2011-4-16 22:03;====================================== ...
最新文章
- 分享Web应用运行的细节问题:预编译提高网站性能、跟踪用户习惯和解决线程同步...
- matlab把符号数,Matlab 符号与数值之间的转换
- linux 14.04安装方法,Ubuntu 14.04 安装配置GNOME经典界面
- python科学编程入门书_Python数据科学零基础一本通
- 联发科有没有高端处理器_2021年华为将成为联发科最大客户?麒麟或将“灭亡?”...
- java 基本类型共享_Java基础数据类型
- WebDriverAgent安装
- 0832科技_iDS-MCB601-A/0832 海康威视深度学习布控枪摄像机 8-32mm 移动便携监控
- AI插件开发入门教程001 - AI脚本简介
- 蓝桥杯:填字母游戏(第八届决赛javaB第五题)——博弈+递归+回溯
- 微信Android热补丁方案Tinker
- hardfault常见原因_应对STM32 Cortex-M3 Hard Fault异常
- 用二代测序数据的reads组装一个基因序列
- 中国拳手徐灿将战世界拳王:有信心把金腰带带回祖国
- 音频信号转为开关控制信号_盘点模拟量信号和开关量信号区别与应用
- 蓝牙广播数据格式和动态改变
- 淘宝运营 钻展、智钻的定义 优势所在
- 毕业论文的页眉页脚?奇偶页不同?前言作为第一页?……?这样弄!
- nvd、nvm索引文件的生成
- elementui icon图标大全