1394|2

659

帖子

1

TA的资源

纯净的硅(中级)

楼主
 

【上海航芯 ACM32F070开发板+触控功能评估板】—— RTC例程 [复制链接]

 

 

 

RTC例程1

Keil-Options_SVD

  • 在Keil的Options里面可以选择SVD文件,从而在debug的时候,可以再System Viewer里面查看各个IP模块的寄存器的值。

使用SystemViewer观察RTC寄存器,在Debug状态的Run模式下,可以看到RTC的时间寄存器在更新。

2.1. RTC_TIME_DATE_SET_GET

/* RTC计时功能 */
case RTC_TIME_DATE_SET_GET:
{
        printfS("This is RTC_TIME_DATE_SET_GET Test!\n");
        RTC_Handle.u32_ClockSource       = RTC_CLOCK_XTL;
        RTC_Handle.u32_Compensation      = COMPENSATION_INCREASE;    // 开始时钟补偿,如不需补偿设置补偿值为0
        RTC_Handle.u32_CompensationValue = 0x05;                     // 开始时钟补偿,如不需补偿设置补偿值为0

        HAL_RTC_Config(&RTC_Handle);

        /* Set RTC Time、Date */
        gstr_Time_Set.u8_Hours   = 0x12;
        gstr_Time_Set.u8_Minutes = 0x30;
        gstr_Time_Set.u8_Seconds = 0x00;
        HAL_RTC_SetTime(&gstr_Time_Set);

        gstr_Date_Set.u8_Year    = 0x21;    // 2021
        gstr_Date_Set.u8_Month   = RTC_MONTH_MARCH;
        gstr_Date_Set.u8_Date    = 0x20;
        gstr_Date_Set.u8_WeekDay = RTC_WEEKDAY_FRIDAY;
        HAL_RTC_SetDate(&gstr_Date_Set);

        while (1)
        {
                HAL_RTC_GetTime(&gstr_Time_Get);
                HAL_RTC_GetDate(&gstr_Date_Get);
                HAL_RTC_GetTime(&gstr_Time_Get_Again);
                if (gstr_Time_Get.u8_Seconds != gstr_Time_Get_Again.u8_Seconds)
                {
                        continue;
                }

                if (fu32_Seconds != gstr_Time_Get.u8_Seconds)
                {
                        fu32_Seconds = gstr_Time_Get.u8_Seconds;

                        printfS("Date: 20%x-%x-%x week:%x \n", gstr_Date_Get.u8_Year, gstr_Date_Get.u8_Month, gstr_Date_Get.u8_Date, gstr_Date_Get.u8_WeekDay);
                        printfS("Time: %02x:%02x:%02x \n", gstr_Time_Get.u8_Hours, gstr_Time_Get.u8_Minutes, gstr_Time_Get.u8_Seconds);
                }
        }
}break;
  • 本段代码首先配置RTC,然后设置时间、日期,然后进入while(1)无限循环,

  • 在无限循环中,获取RTC的时间和日期,然后再次获取时间,如果这两次时间的秒数不同,则跳过之后的代码,重新开始新的循环,

  • 只有两次获得的RTC时间都相同才继续往下执行,确保是进入新的一秒才执行之后的代码。

  • 对比上次保存的秒数和这次秒数,如果不同(意味着进入了新的一秒),就打印出获取到的RTC的日期和时间,

执行效果如图:

2.2. RTC_ALARM

/* RTC闹钟功能 */
case RTC_ALARM:
{
        /********************************************/
        /**************** RTC Config ****************/
        /********************************************/
        printfS("This is RTC_ALARM Test!\n");
        RTC_Handle.u32_ClockSource       = RTC_CLOCK_XTL;
        RTC_Handle.u32_Compensation      = COMPENSATION_INCREASE;    // 开始时钟补偿,如不需补偿设置补偿值为0
        RTC_Handle.u32_CompensationValue = 0x05;                     // 开始时钟补偿,如不需补偿设置补偿值为0

        HAL_RTC_Config(&RTC_Handle);

        /* Set RTC Time、Date */
        gstr_Time_Set.u8_Hours   = 0x12;
        gstr_Time_Set.u8_Minutes = 0x29;
        gstr_Time_Set.u8_Seconds = 0x50;
        HAL_RTC_SetTime(&gstr_Time_Set);

        gstr_Date_Set.u8_Year    = 0x21;    // 2021
        gstr_Date_Set.u8_Month   = RTC_MONTH_MARCH;
        gstr_Date_Set.u8_Date    = 0x20;
        gstr_Date_Set.u8_WeekDay = RTC_WEEKDAY_FRIDAY;
        HAL_RTC_SetDate(&gstr_Date_Set);

        /********************************************/
        /**************** Alarm Config ****************/
        /********************************************/
        gstr_Alarm.u32_AlarmMode      = RTC_ALARM_WEEK_MODE;            // 使用星期模式
        gstr_Alarm.u32_AlarmInterrupt = RTC_ALARM_INT_ENABLE;           // 开启闹钟中断
        gstr_Alarm.u32_DayMask        = RTC_ALARM_DAY_MASK_DISABLE;     // 天  屏蔽关闭
        gstr_Alarm.u32_HourMask       = RTC_ALARM_HOUR_MASK_DISABLE;    // 小时屏蔽关闭
        gstr_Alarm.u32_MinMask        = RTC_ALARM_MIN_MASK_DISABLE;     // 分钟屏蔽关闭
        gstr_Alarm.u32_AlarmWeek      = RTC_ALARM_WEEK_FRIDAY | RTC_ALARM_WEEK_SATURDAY;    // 周五、周六
        gstr_Alarm.u32_Hours          = 0x12;    // 时间 12:30:00
        gstr_Alarm.u32_Minutes        = 0x30;
        gstr_Alarm.u32_Seconds        = 0x00;
        HAL_RTC_AlarmConfig(&gstr_Alarm);

        NVIC_ClearPendingIRQ(RTC_IRQn);
        NVIC_EnableIRQ(RTC_IRQn);

        HAL_RTC_AlarmEnable();

        while (1)
        {
                HAL_RTC_GetDate(&gstr_Date_Get);
                HAL_RTC_GetTime(&gstr_Time_Get);
                HAL_RTC_GetTime(&gstr_Time_Get_Again);
                if (gstr_Time_Get.u8_Seconds != gstr_Time_Get_Again.u8_Seconds)
                {
                        continue;
                }

                if (fu32_Seconds != gstr_Time_Get.u8_Seconds)
                {
                        fu32_Seconds = gstr_Time_Get.u8_Seconds;

                        printfS("Date: 20%x-%x-%x week:%x \n", gstr_Date_Get.u8_Year, gstr_Date_Get.u8_Month, gstr_Date_Get.u8_Date, gstr_Date_Get.u8_WeekDay);
                        printfS("Time: %02x:%02x:%02x \n", gstr_Time_Get.u8_Hours, gstr_Time_Get.u8_Minutes, gstr_Time_Get.u8_Seconds);
                }

                if (true == gb_AlarmFlag)
                {
                        gb_AlarmFlag = false;
                        printfS("This is RTC Alarm!!! \r\n");
                        HAL_RTC_AlarmDisable();
                        break;
                }
        }
}break;
  • 本段代码整体上与前一段代码 RTC_TIME_DATE_SET_GET 类似,不再赘叙,以下分析新增的功能代码。

  • 在配置RTC时,配置了ALARM模式的中断,闹钟时间设置为每周五/六的12:30:00。(为了快速调试,将RTC当前时间设置为12:29:50,即10秒钟后即触发闹钟)

  • 当RTC计时器达到设定的ALARM时间点,暂停当前执行程序(主函数),进入RTC_IRQHandler。

  • RTC_IRQHandler中设置gb_AlarmFlag=true,然后清除RTC_ALARM中断标志位,从而可以接收下一次中断。

  • 返回主函数后,完成之前的操作,然后识别到gb_AlarmFlag之后,打印相关输出,然后禁用RTC_ALARM中断,并跳出主循环。

2.3. RTC_Tamper

未达到预期运行测试效果,正在排查中。

 

最新回复

我最近在进行N32G430试用时发现设置时间时必须有配置的动作,要不RTC就开始随机变化   详情 回复 发表于 2022-10-24 08:43
点赞 关注
 
 

回复
举报

6807

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

RTC的配置后,再去设置时间、日期,最后再进入while(1)无限循环,这个是有点麻烦

 

点评

我最近在进行N32G430试用时发现设置时间时必须有配置的动作,要不RTC就开始随机变化  详情 回复 发表于 2022-10-24 08:43
 
 
 

回复

6449

帖子

10

TA的资源

版主

板凳
 
Jacktang 发表于 2022-10-24 08:06 RTC的配置后,再去设置时间、日期,最后再进入while(1)无限循环,这个是有点麻烦  

我最近在进行N32G430试用时发现设置时间时必须有配置的动作,要不RTC就开始随机变化

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表