GD32E230 RTC报警中断功能使用

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 formatrtc_init_parameter.rtc_month = HAL_RTC_SEP;rtc_init_parameter.rtc_date = 0x7; //BCD formatrtc_init_parameter.rtc_day_of_week = HAL_RTC_SATURDAY;rtc_init_parameter.rtc_hour = 10;rtc_init_parameter.rtc_minute = 0x30;//BCD formatrtc_init_parameter.rtc_second = 0x0; //BCD formathal_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.rhkb.cn/news/421727.html

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

相关文章

图神经网络介绍3

1. 图同构网络&#xff1a;Weisfeiler-Lehman 测试与图神经网络的表达力 本节介绍一个关于图神经网络表达力的经典工作&#xff0c;以及随之产生的另一个重要的模型——图同构网络。图同构问题指的是验证两个图在拓扑结构上是否相同。Weisfeiler-Lehman 测试是一种有效的检验两…

python-数字反转

题目描述 给定一个整数 N&#xff0c;请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式&#xff0c;即除非给定的原数为零&#xff0c;否则反转后得到的新数的最高位数字不应为零&#xff08;参见样例 2&#xff09;。 输入格式 一个整数 N。 输出格式 …

FAT32文件系统详细分析 (格式化SD nandSD卡)

FAT32 文件系统详细分析 (格式化 SD nand/SD 卡) 目录 FAT32 文件系统详细分析 (格式化 SD nand/SD 卡)1. 前言2.格式化 SD nand/SD 卡3.FAT32 文件系统分析3.1 保留区分析3.1.1 BPB(BIOS Parameter Block) 及 BS 区分析3.1.2 FSInfo 结构扇区分析3.1.3 引导扇区剩余扇区3.1.4 …

【Go】Go语言中的基本数据类型与类型转换

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

IDEA创建MAVEN项目

这里介绍如何使用IDEA创建MEAN工程&#xff0c;这里以创建模块举例&#xff0c;创建项目步骤相当&#xff1b; 创建项目 File-项目-new-module 这里选择普通java项目&#xff0c;Archetype选quickstart 项目介绍 create后可以看到创建的demo1 及其目录结构 里面默认的App里…

C++设计模式——Mediator中介者模式

一&#xff0c;中介者模式的定义 中介者模式是一种行为型设计模式。它通过一个中介者对象将多个对象之间的交互关系进行封装&#xff0c;使得对象之间的交互需要通过中介者对象来完成。该设计模式的结构很容易理解&#xff0c;以中介者为中心。 中介者模式的设计思想侧重于在…

【爬虫软件】小红书按关键词批量采集笔记,含笔记正文、转评赞藏等!

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴都了解&#xff0c;我之前开发过2款软件&#xff1a; 【GUI软件】小红书搜索结果批量采集&#xff0c;支持多个关键词同时抓取&#xff01; 【GUI软件】小红书详情数据批量采集&#xff0c;含笔记内容、转评赞藏等&#xff01; 现在…

【Linux】进程调度与切换

【Linux】进程调度与切换 1. 基本概念2. 进程切换3. 进程调度3.1运行队列实现优先级设计3.2 处理效率问题3.3 活动队列与过期队列3.4 如何解决饥饿问题3.5 active指针和expired指针 1. 基本概念 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&am…

Linux——高流量 高并发(访问场景) 高可用(架构要求)

高并发通用设计逻辑&#xff1a; 定位单点&#xff0c;拆分问题 架构调整的顺序&#xff1a; 动静分离 // 没有实现动静分离 // 静态请求 交给 nginx或者 httpd 这种对于静态资源处理效率更高的服务&#xff0c;动态请求 交给php-fpm 服务来处理 使用云服务提供商 &#xff…

数据库(DB、DBMS、SQL)

今天我来讲解一下数据库和可视化数据库管理系统的使用 数据库概述 数据库 存储数据的仓库&#xff0c;数据是有组织的存储 DataBase (DB) 数据库管理系统 操纵和管理数据库的大型软件 DataBaseMangement System (DBMS) SQL 操作关系型数据库的编程语言&#xff0c;定义…

探索最佳 Shell 工具:全面测评 Bash、Zsh、Fish、Tcsh 和 Ksh

感谢浪浪云支持发布 浪浪云活动链接 &#xff1a;https://langlangy.cn/?i8afa52 文章目录 1. 简介2. 测评工具3. 测评标准4. Bash 测评4.1 易用性4.2 功能特性4.3 性能4.4 可定制性4.5 社区和支持 5. Zsh 测评5.1 易用性5.2 功能特性5.3 性能5.4 可定制性5.5 社区和支持 6. F…

Java、python、php三个版本 抗震救灾物资管理系统 抗洪救灾物资分配系统 救援物资申请平台(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

解锁SAP数据的潜力:SNP Glue与SAP Datasphere的协同作用

在各种文章中&#xff0c;我们研究了客户如何利用SNP Glue与基于云的数据仓库和数据湖相结合&#xff0c;以充分利用其SAP数据。SNP Glue 通过高性能集成解决方案帮助客户解锁 SAP 数据孤岛。例如&#xff0c;可以使用SNP Glue先进的增量捕获&#xff08;CDC&#xff09;近乎实…

DIC技术助力新能源汽车主机厂力学测试研发与整车性能提升

在新能源汽车研发过程中&#xff0c;非接触式全视场应变DIC测量方案&#xff0c;越来越受到汽车主机厂的信赖与认可。传统接触式传感器&#xff0c;在精度、灵活性和数据处理能力上存在局限。DIC技术可提供精确、高效、全视场、便捷的非接触式测量解决方案。 在汽车研发阶段&a…

算法41:位1的个数

一、需求 编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中 设置位的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1: 输入&#xff1a;n 11 输出&#xff1a;3 解释&#xff1a;输入的二进制串 1011 中&#xff0c;共有 3 个设置位。示…

生命周期函数

所有继承MonoBehavior的脚本 最终都会挂载到Gameobiject游戏对象上 1.生命周期西数 就是该脚本对象依附的Gameobject对象从出生到消亡整个生命周期中 会通过反射自动调用的一些特殊函数 2.Unity帮助我们记录了一个Gameobject对象依附了哪些脚本 会自动的得到这些对象&#x…

医院管理|基于java的医院管理系统小程序(源码+数据库+文档)

医院管理系统小程序 目录 基于java的医院管理系统小程序 一、前言 二、系统设计 三、系统功能设计 医生信息管理 排班信息管理 科室信息管理 科室预约 病历信息 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a;…

中信银行信用卡中心社招:TAS人才测评系统题库及通关攻略更新了!

中信银行信用卡中心&#xff08;以下简称“卡中心”&#xff09;是中信银行在深圳设立的对信用卡业务进行统一管理、集中操作、独立核算的专营机构。2002年底&#xff0c;由中信银行总行与中信嘉华银行在深圳合作筹建成立&#xff1b;卡中心自成立伊始&#xff0c;始终坚持“以…

k8s的环境配置

一、前期系统环境准备 准备3台主机&#xff1a;硬盘50G cpu2个 内存2G 1、3台主机同时配置 1&#xff09;关闭防火墙与selinux、NetworkManager [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/…

git下载安装windows

https://git-scm.com/download/win 接下来傻瓜式安装就可以了