GD32E230 RTC报警中断功能使用

news2024/9/20 5:39:46

GD32E230 RTC报警中断使用


  • GD32E230 RTC时钟源有3个,一个是内部RC振动器产生的40KHz作为时钟源,或者是有外部32768Hz晶振.,或者外部高速时钟晶振分频作为时钟源。

在这里插入图片描述

  • 🔖个人认为最难理解难点的就是有关RTC时钟异步预分频和同步预分频的计算。在对应的用户手册上仅仅潦草一段说明就没有了,这里参考别人有关stm32 相同外设功能的介绍借鉴学习。《STM32如何计算RTC时钟异步预分频和同步预分频》
  • 📑预分频寄存器 (RTC_PSC)
    在这里插入图片描述

  • 🌿EmbeddedBuilder参数配置填写:
    在这里插入图片描述

/* structure for initialization of the RTC */
typedef struct
{
    uint8_t rtc_year;                                                       /*!< RTC year value: 0x0 - 0x99(BCD format) */
    hal_rtc_month_enum rtc_month;                                           /*!< RTC month value */
    uint8_t rtc_date;                                                       /*!< RTC date value: 0x1 - 0x31(BCD format) */
    hal_rtc_day_of_week_enum rtc_day_of_week;                               /*!< RTC weekday value */
    uint8_t rtc_hour;                                                       /*!< RTC hour value */
    uint8_t rtc_minute;                                                     /*!< RTC minute value: 0x0 - 0x59(BCD format) */
    uint8_t rtc_second;                                                     /*!< RTC second value: 0x0 - 0x59(BCD format) */
    uint16_t rtc_subsecond;                                                 /*!< RTC subsecond value: 0x0 - 0xFFFF */    
    uint16_t rtc_factor_asyn;      /*!< RTC asynchronous prescaler value: 0x0 - 0x7F */
    uint16_t rtc_factor_syn;        /*!< RTC synchronous prescaler value: 0x0 - 0x7FFF */
    uint32_t rtc_am_pm;                                                     /*!< RTC AM/PM value */
    uint32_t rtc_display_format;                                            /*!< RTC time notation */
}hal_rtc_init_struct;
  • 🥕参考前面的文章内容,计算方法给出的例程:

若想实现普通计数功能,例如使用频率为 32.768 kHz 的 LSE 获得频率为 1 Hz 的内部时钟 (ck_spre),为了最大程度降低功耗,PREDIV_A=127,则(f ck_spre)
同步预分频=32768Hz/(PREDIV_S+1)x(127+1),
1Hz=32768Hz/(PREDIV_S+1)x(127+1),
计算得,PREDIV_S=255。

  • 🌿如果使用外部32768Hz晶振作为时钟源配置:
.rtc_factor_asyn = 0x7F;// 异步预分频系数
.rtc_factor_syn = 0xff;   //同步预分频系数
  • 🌿如果使用外部40KHz晶振作为时钟源配置:
.rtc_factor_asyn = 0x7f;
 .rtc_factor_syn = 0x137;//40000//(PREDIV_S+1)x(127+1)
  • ✨如果使用EmbeddedBuilder软件自动配置IRC40K时钟源,生成的代码,

📙使用外部32768晶振硬件电路参考

  • 电路
    在这里插入图片描述
  • 🌿负载电容参数选择参考:
    在这里插入图片描述

🎉贴出来,主要是因为在个人设计的板子上,焊接的12pf电容起振困难,不走时,后面换成了6.8pf才正常走时。

  • 🌿硬件布局参考:
    在这里插入图片描述

📗RTC时间参数数据类型说明

  • 🌿有关结构体:
/* structure for initialization of the RTC */
typedef struct
{
    uint8_t rtc_year;                                                       /*!< RTC year value: 0x0 - 0x99(BCD format) */
    hal_rtc_month_enum rtc_month;                                           /*!< RTC month value */
    uint8_t rtc_date;                                                       /*!< RTC date value: 0x1 - 0x31(BCD format) */
    hal_rtc_day_of_week_enum rtc_day_of_week;                               /*!< RTC weekday value */
    uint8_t rtc_hour;                                                       /*!< RTC hour value */
    uint8_t rtc_minute;                                                     /*!< RTC minute value: 0x0 - 0x59(BCD format) */
    uint8_t rtc_second;                                                     /*!< RTC second value: 0x0 - 0x59(BCD format) */
    uint16_t rtc_subsecond;                                                 /*!< RTC subsecond value: 0x0 - 0xFFFF */    
    uint16_t rtc_factor_asyn;                                               /*!< RTC asynchronous prescaler value: 0x0 - 0x7F */
    uint16_t rtc_factor_syn;                                                /*!< RTC synchronous prescaler value: 0x0 - 0x7FFF */
    uint32_t rtc_am_pm;                                                     /*!< RTC AM/PM value */
    uint32_t rtc_display_format;                                            /*!< RTC time notation */
}hal_rtc_init_struct;

/* structure for RTC alarm configuration */
typedef struct
{
    uint32_t rtc_alarm_mask;                                                /*!< RTC alarm mask */   
    uint32_t rtc_weekday_or_date;                                           /*!< specify RTC alarm is on date or weekday */
    uint8_t rtc_alarm_day;                                                  /*!< RTC alarm date or weekday value*/
    uint8_t rtc_alarm_hour;                                                 /*!< RTC alarm hour value */
    uint8_t rtc_alarm_minute;                                               /*!< RTC alarm minute value: 0x0 - 0x59(BCD format) */
    uint8_t rtc_alarm_second;                                               /*!< RTC alarm second value: 0x0 - 0x59(BCD format) */
    uint32_t rtc_alarm_subsecond;                                           /*!< RTC alarm subsecond value: (0x000 - 0x7FFF) */    
    uint32_t rtc_alarm_subsecond_mask;                                      /*!< RTC alarm subsecond mask */ 
    uint32_t rtc_am_pm;                                                     /*!< RTC alarm AM/PM value */
}hal_rtc_alarm_struct;

/* structure for RTC time-stamp configuration */
typedef struct
{
    uint8_t rtc_timestamp_month;                                            /*!< RTC time-stamp month value */
    uint8_t rtc_timestamp_date;                                             /*!< RTC time-stamp date value: 0x1 - 0x31(BCD format) */
    uint8_t rtc_timestamp_day;                                              /*!< RTC time-stamp weekday value */
    uint8_t rtc_timestamp_hour;                                             /*!< RTC time-stamp hour value */
    uint8_t rtc_timestamp_minute;                                           /*!< RTC time-stamp minute value: 0x0 - 0x59(BCD format) */
    uint8_t rtc_timestamp_second;                                           /*!< RTC time-stamp second value: 0x0 - 0x59(BCD format) */
    uint32_t rtc_timestamp_subsecond;                                       /*!< RTC time-stamp subsecond value: 0x0 - 0xFFFF */    
    uint32_t rtc_am_pm;                                                     /*!< RTC time-stamp AM/PM value */
}hal_rtc_timestamp_struct;
  • 🌟注意相关注释,有些参数是BCD编码。其中为BCD格式,其余为BIN格式。
  • 🌿有关BCD码转BIN码网上随便一搜即可获得:
// 将BCD格式转换为BIN格式
uint8_t bcd_to_bin(uint8_t bcd_value) {
    uint8_t tens = bcd_value >> 4;
    uint8_t ones = bcd_value & 0x0F;
    return (tens * 10) + ones;
}

// 将BIN格式转换为BCD格式
uint8_t bin_to_bcd(uint8_t bin_value) {
    uint8_t tens = bin_value / 10;
    uint8_t ones = bin_value % 10;
    return (tens << 4) | ones;
}
  • 🌿RTC初始化配置代码:
void msd_rtc_init(void)
{
    /* user code [rtc_init local 0] begin */
    /* user code [rtc_init local 0] end */
    hal_rtc_init_struct rtc_init_parameter;
    hal_rtc_alarm_struct rtc_alarm_parameter;
    /* enable the RTC */
   // rcu_periph_clock_enable(RCU_RTC);
    // hal_rcu_periph_clk_enable(RCU_RTC);
    //   rcu_periph_clock_enable(RCU_PMU);  //使能PMU电源管理单元时钟
    //  pmu_backup_write_enable();  //使能电源备份源,RTC需要此备份域
    if (ENABLE_LXTAL)
    {
        rcu_osci_on(RCU_LXTAL);
        rcu_osci_stab_wait(RCU_LXTAL);
        rcu_rtc_clock_config(RCU_RTCSRC_LXTAL); // 配置RTC时钟源
    }
    else
    {
        /* enable the IRC40K oscillator */
        rcu_osci_on(RCU_IRC40K);
        /* wait till IRC40K is ready */
        rcu_osci_stab_wait(RCU_IRC40K);
        /* select the RTC clock source */
        rcu_rtc_clock_config(RCU_RTCSRC_IRC40K); // 配置RTC时钟源
    }
    rcu_periph_clock_enable(RCU_RTC);
    rtc_register_sync_wait();
    hal_rtc_struct_init(HAL_RTC_INIT_STRUCT, &rtc_init_parameter);
    hal_rtc_struct_init(HAL_RTC_ALARM_STRUCT, &rtc_alarm_parameter);

    hal_rtc_deinit();
    if (ENABLE_LXTAL)
    {
    rtc_init_parameter.rtc_factor_asyn = 0x7F;// 高位分频
    rtc_init_parameter.rtc_factor_syn = 0xff;   //低位分频
    }
    else
    {
    rtc_init_parameter.rtc_factor_asyn = 0x7f;
    rtc_init_parameter.rtc_factor_syn = 0x137;
    }
    rtc_init_parameter.rtc_display_format = HAL_RTC_24HOUR;
    rtc_init_parameter.rtc_year = 0x24;//BCD format
    rtc_init_parameter.rtc_month = HAL_RTC_SEP;
    rtc_init_parameter.rtc_date = 0x7; //BCD format
    rtc_init_parameter.rtc_day_of_week = HAL_RTC_SATURDAY;
    rtc_init_parameter.rtc_hour = 10;
    rtc_init_parameter.rtc_minute = 0x30;//BCD format
    rtc_init_parameter.rtc_second = 0x0; //BCD format
    hal_rtc_init(&rtc_init_parameter);

    hal_rtc_daylight_saving_time_adjust(HAL_RTC_DAYLIGHTSAVING_NONE, HAL_RTC_RECORD_DAYLIGHTSAVING_RESET);
    rtc_alarm_parameter.rtc_alarm_mask = HAL_RTC_ALARM_DATE_MASK | HAL_RTC_ALARM_HOUR_MASK | HAL_RTC_ALARM_MINUTE_MASK;
    rtc_alarm_parameter.rtc_weekday_or_date = HAL_RTC_ALARM_DATE_SELECTED;
    rtc_alarm_parameter.rtc_alarm_day = 0x7;
    rtc_alarm_parameter.rtc_alarm_hour = 10;
    rtc_alarm_parameter.rtc_alarm_minute = 0x30;
    rtc_alarm_parameter.rtc_alarm_second = 0x09;
    rtc_alarm_parameter.rtc_alarm_subsecond = 0x0;
    rtc_alarm_parameter.rtc_alarm_subsecond_mask = HAL_RTC_MASK_SUBSECOND;
    hal_rtc_alarm_config(&rtc_alarm_parameter);

    hal_nvic_periph_irq_enable(RTC_IRQn, 1);
    /* user code [rtc_init local 1] begin */
    rtc_interrupt_enable(RTC_INT_ALARM);//使能RTC中断
    rtc_alarm_enable();//使能RTC报警中断
    /* user code [rtc_init local 1] end */
}

  • 🌿RTC初始化之后就是对中断回调函数进行补充:
volatile uint8_t RTC_ALRM_FLAG = 0; //闹钟标志位
hal_rtc_irq_struct rtc_irq;

void RTC_ALRM_Callback(void)//报警中断回调任务,不是RTC中断执行的任务。
{
  printf("RTC alarm Task\n\r");
}
......

	rtc_irq.alarm_handle = RTC_ALRM_Callback;
    hal_rtc_irq_handle_set(&rtc_irq);
  • 🌿RTC中断函数
void RTC_IRQHandler(void)
{
    /* user code [RTC_IRQn local 0] begin */
    /* user code [RTC_IRQn local 0] end */
    hal_rtc_irq();
//   if(RESET != rtc_flag_get(RTC_STAT_ALRM0F)){
//        rtc_flag_clear(RTC_STAT_ALRM0F);
//        exti_flag_clear(EXTI_17);
//         gpio_bit_toggle(GPIOC, GPIO_PIN_13);
//    }
    /* user code [RTC_IRQn local 1] begin */
		RTC_ALRM_FLAG =1;
		gpio_bit_toggle(GPIOC, GPIO_PIN_13);
    /* user code [RTC_IRQn local 1] end */
}
  • 🔖每分钟中断一次打印:
    在这里插入图片描述

在这里插入图片描述

  • 🌟需要注意:在使用RTC报警中断时,也是会触发RTC中断,报警中断需要执行的任务函数可以通过下面来传递执行:(具体书写看上面贴出的完整代码)
    rtc_irq.alarm_handle = RTC_ALRM_Callback;//传递任务句柄
    hal_rtc_irq_handle_set(&rtc_irq);

在这里插入图片描述

也可以报警中断需要执行的任务放在RTC中断函数中调用或者置标记位。

void RTC_IRQHandler(void)
{
    /* user code [RTC_IRQn local 0] begin */
    /* user code [RTC_IRQn local 0] end */
    hal_rtc_irq();
//   if(RESET != rtc_flag_get(RTC_STAT_ALRM0F)){//判断报警类型
//        rtc_flag_clear(RTC_STAT_ALRM0F);
//        exti_flag_clear(EXTI_17);
//         gpio_bit_toggle(GPIOC, GPIO_PIN_13);
//    }
    /* user code [RTC_IRQn local 1] begin */
		RTC_ALRM_FLAG =1;
		gpio_bit_toggle(GPIOC, GPIO_PIN_13);
    /* user code [RTC_IRQn local 1] end */
}
  • 🌿配置时间打印函数:
/*!
\brief      display the current time
\param[in]  none
\param[out] none
\retval     none
*/
void rtc_show_time(void)
{
    hal_rtc_init_struct rtc_init;
    uint32_t time_subsecond = 0;
    uint8_t subsecond_ss = 0;

    hal_rtc_current_time_get(&rtc_init);

    /* convert the subsecond value into fractional format */
    time_subsecond = rtc_init.rtc_subsecond;
    subsecond_ss = (1000 - (time_subsecond * 1000 + 1000) / 400) / 100;
    // subsecond_ts = (1000 - (time_subsecond * 1000 + 1000) / 400) % 100 / 10;
    // subsecond_hs = (1000 - (time_subsecond * 1000 + 1000) / 400) % 10;
    printf("Current Date: 20%0.2d-%0.2d-%0.2d T:%0.1d \n\r", \
           bcd_to_bin(rtc_init.rtc_year), rtc_init.rtc_month, bcd_to_bin(rtc_init.rtc_date), rtc_init.rtc_day_of_week);
    printf("Current Time: %0.2d:%0.2d:%0.2d.%d \n\r", \
           rtc_init.rtc_hour, bcd_to_bin(rtc_init.rtc_minute), bcd_to_bin(rtc_init.rtc_second), \
           subsecond_ss);
}

-🌿 测试代码在《GD32E230程序烧录和开发环境使用介绍》文中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++第二节入门 - 缺省参数和函数重载

一、缺省参数 1、概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。 在调用该函数的时候&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参&#xff01; #include<iostream> using namespace std;void Func(int a 0) {c…

2024 水博会,国信华源登场,数智创新助力水利高质量发展

9月4日-6日&#xff0c;由中国水利学会和中国水利工程协会共同主办的2024中国水博览会暨第十九届中国&#xff08;国际&#xff09;水务创新技术交流会在重庆国际博览中心召开。 本次水博会以“展水利前沿新技术 览新质生产力场景”为主题&#xff0c;国信华源携最新智能监测预…

【佳学基因检测】如何升级一个不再维护的软件包中的PHP代码?

如何升级一个不再维护的软件包中的PHP代码&#xff1f; 为什么要升级一个不再维护但是仍在使用的软件包中的PHP代码&#xff1f; 升级一个不再维护但仍在使用的软件包中的 PHP 代码是一个复杂但重要的过程。虽然这些软件包可能已经不再活跃地维护或更新&#xff0c;但升级其代…

通信工程学习:什么是ATM异步转移模式

ATM&#xff1a;异步转移模式 ATM&#xff1a;Asynchronous Transfer Mode&#xff08;异步转移模式&#xff09;是一种先进的通信技术&#xff0c;它采用固定长度的信元&#xff08;Cell&#xff09;作为信息传输、复用、交换及处理的基本单位&#xff0c;并通过异步时分复用的…

挖矿木马-Linux

目录 介绍步骤 介绍 1、挖矿木马靶机中切换至root用户执行/root目录下的start.sh和attack.sh 2、题目服务器中包含两个应用场景&#xff0c;redis服务和hpMyAdmin服务&#xff0c;黑客分别通过两场景进行入侵&#xff0c;入侵与后续利用线路路如下&#xff1a; redis服务&…

Tomcat Request Cookie 丢失问题

优质博文&#xff1a;IT-BLOG-CN 一、问题描述 生产环境偶尔(涉及到多线程处理)出现"前端传递Cookie为空"的告警&#xff0c;导致前端请求丢失&#xff0c;出现请求失败问题。告警内容如下 前端传递Cookie为空 告警内容&#xff1a;服务端获取request Cookie为空&…

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席20…

每日一练:螺旋矩阵

一、题目要求 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;ma…

Java | Leetcode Java题解之第396题旋转函数

题目&#xff1a; 题解&#xff1a; class Solution {public int maxRotateFunction(int[] nums) {int f 0, n nums.length, numSum Arrays.stream(nums).sum();for (int i 0; i < n; i) {f i * nums[i];}int res f;for (int i n - 1; i > 0; i--) {f numSum - …

NISP 一级 | 3.1 网络基础知识

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;Internet 和 TCP/IP 协议 因特网&#xff08;Internet&#xff09;通过 TCP/IP 协议将遍布在全世界各地的计算机互联&#xff0c;从而形成超级计算机网络。因特网为用户提供了非…

【50 Pandas+Pyecharts | 暑期档电影票房数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 提取电影名称 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 电影总票房排行3.2 各电影票房占比3.3 2023中国各省地区大学数量分布3.4 《抓…

浅谈产线工控安全,产线工控安全的有效方案

随着工业4.0的发展&#xff0c;产线日益智能化&#xff0c;生产网已经发展成一个组网的计算机环境&#xff0c;虽然都进行了隔离&#xff0c;但仍需和外部进行数据交互&#xff0c;导致有病毒入侵可能。 产线工控安全事件不断 深信达MCK主机加固方案&#xff0c;针对产线工控…

工业无人机性能参数特点!!!

一、基本性能参数 动力系统&#xff1a;工业无人机多采用电动或油动动力系统&#xff0c;以提供足够的推力和续航能力。电动无人机通常具有较低的噪音和振动&#xff0c;适合城市或近距离作业&#xff1b;而油动无人机则具有更长的续航时间和更大的载重能力&#xff0c;适合远…

安科瑞Acrel-1000DP分布式光伏监控系统平台的设计与应用-安科瑞 蒋静

针对用户新能源接入后存在安全隐患、缺少有效监控、发电效率无法保证、收益计算困难、运行维护效率低等通点&#xff0c;提出的Acrel-1000DP分布式光伏监控系统平台&#xff0c;对整个用户电站全面监控&#xff0c;为用户实现降低能源使用成本、减轻变压器负载、余电上网&#…

MySQL基础作业三

查询 1.分别查询student表和score表的所有记录 mysql> select *from student; ---------------------------------------------------- | id | name | sex | birth | department | address | ---------------------------------------------------- | 901 | 张三丰…

大模型×认知科学:多维潜空间洞悉复杂认知

最近的一篇来自于Cognitive Sciences的精炼综述带给了我一些对于当下AI的某种反向思考&#x1f914;&#xff0c;分享给大家&#xff1a; 这篇综述讨论了如何通过多种降维技术揭示认知科学中的潜在表征空间&#xff0c;并探讨了选择适合研究目标的嵌入算法时需要考虑的关键因素…

每日一题,力扣leetcode Hot100之206反转链表

原来的链表是1-2-3-4-5-null 反转后是5-4-3-2-1-null 只需要循环遍历&#xff0c;并且借一个temp便可以完成反转 class Solution:def reverseList(self, head: ListNode) -> ListNode:cur, pre head, Nonewhile cur:tmp cur.next # 暂存后继节点 cur.nextcur.next pre…

AndroidStudio清除重置Http Proxy代理的方式

问题背景 在国内做代码开发的都知道&#xff0c;在国际互联网我们存在看不见的墙&#xff0c;导致无法访问一些代码库和资源&#xff0c;所以在使用开发工具拉取第三方库的时候总会遇到无法连接或者连接超时的情况&#xff0c;所以就会使用一些安全的网络代理工具&#xff0c;辅…

[项目][WebServer][项目介绍及知识铺垫][上]详细讲解

目录 1.何为WWW?2.HTTP分层1.整体2.细节3.DNS?4.协议之间是如何协同运作的&#xff1f; 3.Http相关概念1.特点2.URI && URL && URN3.HTTP URL格式 1.何为WWW? WWW是环球信息网的缩写&#xff0c;常简称为Web分为Web客户端和Web服务器程序&#xff0c;WWW可…

基于微信小程序点餐、外卖系统的设计与实现 (源码+lw+参考文档+核心代码讲解等)

基于微信小程序点餐、外卖系统的设计与实现(源码lw部署文档讲解等) 项目概述&#xff1a; 这段时间做了一个关于点餐的小程序&#xff0c;也是学习和总结的一部分&#xff0c;希望对大家有所帮助。本课题的主要目标是设计并能够实现一个基于微信小程序点餐系统。项目采用的是…