【GD32F427开发板试用】6. 定时器运用之精确定时1s

news2024/12/23 3:31:36

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:hehung

之前发帖

【GD32F427开发板试用】1. 串口实现scanf输入控制LED
【GD32F427开发板试用】2. RT-Thread标准版移植
【GD32F427开发板试用】3. 硬件IIC0驱动OLED显示中文
【GD32F427开发板试用】4. ADC采集摇杆模块移动量
【GD32F427开发板试用】5. SPI驱动TFTLCD屏幕

前言

定时器相对而言较为简单,但是因为没有在官方例程中找到单纯使用定时器功能的用例(官方例程都是使用定时器映射端口输出PWM等等)因为后期实现的项目需要用到定时器,遂实现了定时器功能,介绍定时器的用法。

本文实现了如下功能:

  1. 定时器配置计数count为1000000,向上计数模式;
  2. 使能定时器中断,1s触发一次;
  3. 在定时器中断中反转PC6(LED2)。

定时器介绍

查看用户手册第十八章 18.定时器(TIMERx)有详细的介绍,GD32F4xx的定时器种类很多,分类见下表:

本文中使用的是普通定时器TIMER1。

关于定时器的介绍,本文不再做赘述,参考用户手册即可。
而且用户也不需要关注寄存器设置,只需要对定时器做一个大致的了解,因为官方提供了库文件可以直接调用相关库文件进行操作控制定时器即可。

时钟配置

了解了定时器的基本知识,但是要操作定时器还是少不了时钟的配置,如果时钟设置不对,会导致定时时间不精确,对功能影响较大。
参考用户手册第四章 4.复位和是中单元(RCU)了解时钟树以及定时器分频相关知识。
时钟树:

从时钟树中可以看到,定时器1是连接到了AHB时钟的,AHB时钟最高支持240MHz,但是也只是针对GD32F470而言,GD32F427最多支持200MHz,这个信息在数据手册中有描述。

通过查看代码也可以知道时钟配置为200MHz。

有上述信息以及代码初始化可知,APB1时钟为四分频,所以APB1时钟为50MHz。

通过寄存器对定时器进行倍频控制,设置为4倍频,让定时器的工作频率等同于单片机的时钟频率,这样便于后续在分频控制。

软件编写

知道了时钟分频控制以及定时器知识,现在可以开始进行软件编写了。

定时器初始化

其中,
rcu_timer_clock_prescaler_config设置4倍频,使定时器工作频率为200MHz;
timer_initpara.prescaler = 200-1设置定时器预分频系数为200,则定时器工作频率为200MHz/200 = 1MHz;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE设置上升沿计数模式;
timer_initpara.counterdirection = TIMER_COUNTER_UP设置向上计数模式;
timer_initpara.period = 1000000设置向上计数上限值为100000,即计数周期为1/1MHz*1000000 = 1s;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1设置不再分频;
timer_initpara.repetitioncounter = 0表示重新开始计数值初始值为0.

void Timer_Init(void)
{
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER1);
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);

    timer_struct_para_init(&timer_initpara);
    timer_deinit(TIMER1);

    /* TIMER1 configuration */
    timer_initpara.prescaler         = 200-1;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 1000000;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER1, &timer_initpara);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER1);
    /* Enable the interrupt for overflow */
    timer_interrupt_enable(TIMER1, TIMER_INT_UP);
    /* Configure the interrupt priority */
    nvic_irq_enable(TIMER1_IRQn, 5, 2);
    /* TIMER1 enable */
    timer_enable(TIMER1);
}

定时器1中断实现

表示每次进入中断都会将LED1反转一次,用来查看定时是否准确。

int aa = 1;
void TIMER1_IRQHandler(void)
{
    if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_UP))
    {
        aa ^= 1;
        rt_pin_write(LED2_PIN, aa);
        /* clear TIMER interrupt flag */
        timer_interrupt_flag_clear(TIMER1, TIMER_INT_UP);
    }
}

主函数

主函数中不需要什么操作,定时器计数值满了之后会直接到中断中反转PC6(LED2)

效果验证

下图为定时器工作效果,可以看到,定时1s还是很精确的。

动图封面

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

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

相关文章

MySQL:连explain的type类型都没搞清楚,怎敢说精通SQL优化?

我们在使用SQL语句查询表数据时,提前用explain进行语句分析是一个非常好的习惯。通过explain输出sql的详细执行信息,就可以针对性的进行sql优化。 今天我们来分析一下,在explain中11种不同type代表的含义以及其应用场景。 1,sys…

如何在dom节点上使用fixed定位?实现基于父节点而不是浏览器的滚动定位?一眼看懂,简单明了。

文章目录一、想要实现的功能场景二、父相子绝方式实现dom节点内元素滚动定位2.1、父相子绝代码2.2、实现效果三、iframe中使用fixed方式实现3.1、fixed代码3.2、实现效果四、总结一、想要实现的功能场景 想在一个node节点中实现滚动,但是我的文本要基于这个元素在滚…

云计算关键技术

在云计算数据中心的构建过程中,离不开一些关键的技术,比如,虚拟化技术,分布式数据存储技术,云计算平台管理软件以及其它诸如HBase,Hadoop等相关技术。目录 虚拟化技术 计算虚拟化技术-KVM 分布式数据存储技…

基于 YAML 接口自动化测试框架设计

在设计自动化测试框架的时候,我们会经常将测试数据保存在外部的文件(如Excel、YAML、CSV),或者数据库中,实现脚本与数据解耦,方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测…

Allegro如何设置自动保存和自动保存的时间操作指导

Allegro如何设置自动保存和自动保存的时间操作指导 做PCB设计的时候,自动保存软件是一个必要的功能,Allegro同样支持设置自动保存,而且可以设置自动保存的时间。 如下图 具体操作如下 点击Setup点击User Preferences

都说高速信号过孔尽量少,高速先生却说有时候多点反而好?

作者:一博科技高速先生成员 黄刚过孔在高速领域可谓让硬件工程师,PCB设计工程师甚至仿真工程师都闻风丧胆,首先是因为它的阻抗没法像传输线一样,通过一些阻抗计算软件来得到,一般来说只能通过3D仿真来确定,…

二叉树的性质与推导及常见习题整理

目录 一、性质推导 二、常见的二叉树性质习题 1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为()。 2.在具有 2n 个结点的完全二叉树中,叶子结点个数为(&#xff…

字母板上的路径[提取公共代码,提高复用率]

提取公共代码前言一、字母版上的路径二、贪心1、idea2、go3、代码不断拆分复用的过程总结参考文献前言 写代码,在提高效率的同时,要方便人看,这个人包括自己。大函数要拆分成一些小函数,让每个函数的宏观目的和步骤都显得清晰&am…

分享微信点餐小程序搭建步骤_微信点餐功能怎么做

线下餐饮实体店都开始摸索发展网上订餐服务。最多人选择的是入驻外卖平台,但抽成高,推广还要另买流量等问题,也让不少商家入不敷出。在这种情况下,建立自己的微信订餐小程序,做自己的私域流量是另一种捷径。那么&#…

分类模型评估:混淆矩阵、准确率、召回率、ROC

1. 混淆矩阵 在二分类问题中,混淆矩阵被用来度量模型的准确率。因为在二分类问题中单一样本的预测结果只有Yes or No,即:真或者假两种结果,所以全体样本的经二分类模型处理后,处理结果不外乎四种情况,每种…

反应-扩散方程(Reaction-diffusion system)

文章目录单组分反应-扩散方程双组分反应-扩散方程三组分和更多组分的反应-扩散方程Fishers equationKPP方程Belousov–Zhabotinsky reaction历史化学机理变体Noise-induced order数学背景Briggs–Rauscher reactionZFK equation行波解渐近解外部区域内部区域KPP-ZFK 转变Clavin…

13-PHP使用过的函数 121-130

121、bindColumn 将字段绑定到变量上 // while,foreach,list()进行结果数组的解构,解构到变量中; //!要在预处理对象上调用bindColumn函数 $stmt->bindColumn(id,$id); $stmt->bindColumn(name,$name); $stmt->bindColumn(sex,$sex); $stmt->bindColumn…

flink solt概念详解

ask是flink中的一个逻辑概念,一个任务由一个或者多个算子组合而成(多个算子构成一个任务是需要满足一定的条件才可以,有兴趣的老铁可以来了解一下 Operator Chain),为了提升任务执行的效率,可以对任务配置并行度,使任务在实际运行…

【服务器数据恢复】FreeNAS层UFS2文件系统数据恢复案例

服务器数据恢复环境: Dell存储服务器,采用esxi虚拟化系统,esxi虚拟化系统里有3台虚拟机;上层iSCSI使用FreeNAS构建,通过iSCSI方式实现FCSAN功能;FreeNAS层采用UFS2文件系统。 esxi虚拟化系统里有3台虚拟机中…

python中使用numpy包的向量矩阵相乘

一直对np的线性运算不太清晰,正好上课讲到了,做一个笔记整个理解一下 1.向量和矩阵 在numpy中,一重方括号表示的是向量vector,vector没有行列的概念。二重方括号表示矩阵matrix,有行列。 代码显示如下: …

VMware 复制已有的虚拟机并修改IP地址

第一步:关闭当前机器第二步:在VMware中右键要克隆的机器 选择管理-->克隆第三步:启动新克隆的虚拟机 修改主机名 如 hostname slave2第四步:修改克隆的虚拟机的ip地址和mac地址(注意:由于slave2是克隆出…

直流电机驱动模块开发,为电子设备提供动力之源

直流电机分为有刷直流电机和无刷直流电机两种,有刷直流电机连接上直流电就能转动,但是想要做到精准的转速和方向控制离不开电机驱动模块;无刷直流电机则必须要有驱动才能转动,直流电机驱动模块能够充分利用和有效发挥电源的能量功…

MQTT X 1.9.1 发布:资源消耗降低 80%,稳定性大幅提升

经过两个 Beta 版本迭代,近日,MQTT 5.0 客户端工具 MQTT X 正式发布了 1.9.1 稳定版本。 该版本通过大规模性能优化以及已知问题修复实现了稳定性的飞跃提升。特别是在性能方面,以接收大量消息场景为例,v1.9.1 相比于上一版本&am…

【数据结构与算法】单调队列 | 单调栈

🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…

【Python入门第七天】Python 数字

Python 数字 Python 中有三种数字类型: intfloatcomplex 为变量赋值时,将创建数值类型的变量: 实例 x 10 # int y 6.3 # float z 2j # complex如需验证 Python 中任何对象的类型,请使用 type() 函数: 实…