1. 实验目标

本实验主要通过对RTC的配置及编程,实现两个功能:

  1. 每一秒LED1取反一次;
  2. 每一秒通过串口输出实时日期及时间。

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时间就能与实时时间基本保持一致。

  1. __DATE__ :获取当前日期,以 “MMM DD YYYY” 格式表示的字符串常量;其中MMM为月份,是月份英文单词的前三个字母;DD为DD日;YYYY为年份。
  2. __TIME__:获取当前时间,以 “HH:MM:SS” 格式表示的字符串常量;其中HH表示小时,MM是分钟,SS表示秒。
sprintf(arrDate,"%s",__DATE__);//MMM DD YYYYsprintf(arrTime,"%s",__TIME__);//HH:MM:SS

这里定义了两个字符串数组arrDate和arrTime用来存储日期和时间。

【RTC配置】

RTC配置主要进行如下操作

  1. 使用RTC_Init()函数进行RTC基本参数配置;
  2. 使用enIrqRegistration()注册RTC中断功能;;
  3. 使能中断功能
    1. NVIC_EnableIRQ()使能向量中断;
    2. RTC_IrqCmd()使能RTC周期中断。
  4. 使用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时钟实验相关推荐

  1. c语言实验报告世界时钟,基于LCD的电子时钟实验报告.doc

    PAGE \* MERGEFORMAT 3 河海大学物联网工程学院 课程设计报告 题 目 基于LCD的电子时钟实验 专业.学号 电信 . 授课班号 完成时间 2013.07.05 课程设计(报告)任务 ...

  2. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...

  3. Mixly数码管TM1637时钟实验

    Mixly数码管TM1637时钟实验 实验一:实现滚动显示自定义字符串 实验二:实现显示自定义时间 实验三:实现显示秒表 实验一:实现滚动显示自定义字符串 Mixly程序源码截图: 核心代码: #in ...

  4. 黑金AX301开发板学习(3)——动态数码管的时钟实验

    开发板的使用是AX301,学习资料可以在我的另一篇文章中找到.链接在如下:https://blog.csdn.net/qq_24213087/article/details/108238682 一.动 ...

  5. 基于VHDL的数字时钟实验报告

    数字时钟实验报告 [实验目的]: 设计一个24小时制数字钟,要求能显示时,分,秒,并且可以手动调整时和分 [试验中所用器材]: 开发环境MAX-PLUSII,ZY11EDA13BE 试验系统, VHD ...

  6. 【正点原子STM32连载】 第二十七章 RTC实时时钟实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  7. (实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 RTC初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  8. STM32学习笔记(十九)RTC实时时钟实验

    STM32F103ZET6之RTC实时时钟实验 文章目录 STM32F103ZET6之RTC实时时钟实验 前言 一.简介 二.相关寄存器及配置过程 三.程序源码 1.rtc.h 2.rtc.c 3.m ...

  9. 8086实时时钟实验(一)——《x86汇编语言:从实模式到保护模式》05

    1.代码清单 ;代码清单9-1;文件名:c09_1.asm;文件说明:用户程序 ;创建日期:2011-4-16 22:03;====================================== ...

最新文章

  1. 分享Web应用运行的细节问题:预编译提高网站性能、跟踪用户习惯和解决线程同步...
  2. matlab把符号数,Matlab 符号与数值之间的转换
  3. linux 14.04安装方法,Ubuntu 14.04 安装配置GNOME经典界面
  4. python科学编程入门书_Python数据科学零基础一本通
  5. 联发科有没有高端处理器_2021年华为将成为联发科最大客户?麒麟或将“灭亡?”...
  6. java 基本类型共享_Java基础数据类型
  7. WebDriverAgent安装
  8. 0832科技_iDS-MCB601-A/0832 海康威视深度学习布控枪摄像机 8-32mm 移动便携监控
  9. AI插件开发入门教程001 - AI脚本简介
  10. 蓝桥杯:填字母游戏(第八届决赛javaB第五题)——博弈+递归+回溯
  11. 微信Android热补丁方案Tinker
  12. hardfault常见原因_应对STM32 Cortex-M3 Hard Fault异常
  13. 用二代测序数据的reads组装一个基因序列
  14. 中国拳手徐灿将战世界拳王:有信心把金腰带带回祖国
  15. 音频信号转为开关控制信号_盘点模拟量信号和开关量信号区别与应用
  16. 蓝牙广播数据格式和动态改变
  17. 淘宝运营 钻展、智钻的定义 优势所在
  18. 毕业论文的页眉页脚?奇偶页不同?前言作为第一页?……?这样弄!
  19. nvd、nvm索引文件的生成
  20. elementui icon图标大全

热门文章

  1. (免费使用)爱招飞IsoFace物联网开发工具 Smart 配合工厂自动化自定开发设计各种组态环境
  2. lua-文件操作代码大全
  3. OCR识别-实际应用案例
  4. [Pandas] 查看DataFrame的常用属性
  5. 内分泌失调对身体有什么影响?
  6. 【生信】R语言在RNA-seq中的应用
  7. 两万多字长文:人工智能新趋势(CB Insights)
  8. 视频变漫画软件叫什么?这篇文章来告诉你
  9. c语言用for循环守形数,c语言循环语句训练题
  10. 树莓派串口编程c语言