立创·天空星开发板-GD32F407VE-Timer

news2024/10/5 14:16:36

本文以 立创·天空星开发板-GD32F407VET6-青春版 作为学习的板子,记录学习笔记。

立创·天空星开发板-GD32F407VE-Timer

    • 定时器
    • 基本定时器示例

定时器

定时器是嵌入式系统中常用的一种外设,它可以产生一定的时间间隔、延时、定时等功能,广泛应用于定时、计数、脉冲宽度调制(PWM)等领域。

具体而言,定时器可以实现以下功能:

  1. 计时:定时器可以用来实现延时操作,例如等待外部设备的稳定、等待数据的接收等,也可以用来定时执行一些任务,例如周期性任务、定时采集数据等。
  2. 计数:定时器可以用来实现计数功能,例如计数外部事件的次数、计算脉冲信号的频率等。
  3. PWM输出:定时器可以用来产生PWM信号,通过调节占空比可以实现各种功能,例如LED调光、舵机控制等。
  4. 中断控制:定时器通常具有中断功能,可以在计数器计数到一定值时触发中断,以实现各种复杂的功能。

根据 GD32F407VE 的用户手册,定时器(TIMERx)分为五种类型,如下表所示:
定时器分类表
可以看出所有的定时器都有预分频器,且都是 16位的,另外,除了定时器 1/4 支持 32位计数器外,其他的都是16位的计数器。

16位能表示的最大值为:2^16 - 1 = 65536 - 1 = 65535.

所以,在定时器配置的过程中,预分频器和计数器的配置都不建议超过 65535

基本定时器示例

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"

#include "ExtendedUSART.h"

#define PRESCALER 16800
#define PERIOD    SystemCoreClock / PRESCALER

static void TIMER5_config() {
	// 定时器 - 时钟配置
    rcu_periph_clock_enable(RCU_TIMER5);
    timer_deinit(TIMER5);
    // 定时器 - 倍频配置
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);
    // 定时器 - 参数配置
    timer_parameter_struct tps;
    timer_struct_para_init(&tps);
    tps.prescaler = PRESCALER - 1;        // 分频系数
    tps.period = PERIOD - 1;              // 周期计数
    timer_init(TIMER5, &tps);
    // 定时器 - 中断配置
    nvic_irq_enable(TIMER5_DAC_IRQn, 2, 2);
    timer_interrupt_enable(TIMER5, TIMER_INT_UP);
    timer_enable(TIMER5);
}

void TIMER5_DAC_IRQHandler(void) {
    if(SET == timer_interrupt_flag_get(TIMER5, TIMER_INT_UP)) {
		//清除中断标志位
		timer_interrupt_flag_clear(TIMER5,TIMER_INT_FLAG_UP);
		printf("timer interrupt triggered!");
    }
}

int main(void) {
    systick_config();
    USART0_config();
	TIMER5_config();
	
	printf("USART0 in GD32 is running!\r\n");
    while(1);
}

该段代码的执行效果是每隔 1s 向串口输出文本 timer interrupt triggered!,可以通过串口助手看到输出,导入的 ExtendedUSART.h 可参考之前写的 立创·天空星开发板-GD32F407VE-USART。

我这里用的是基本定时器5,采用向上的计数模式,也就是自增计数,当计数值达到计数器最大值 65535 时,触发中断,自动自行中断处理函数 TIMER5_DAC_IRQHandler

最为重要的两个参数是 PRESCALERPERIOD。这两个参数的目的是为了降频。因为 GD32F407VE 的主频是 168MHz,从计数的角度来说就是 MCU 能在 1s 内计数到 168M,从某种角度来说,可以理解为 168M ≈ 1s。那分频的意义在于,我希望能让 MCU 慢下来,同样是 1s,分频系数越大,数的数字就越少。

举例来说,如果按如下配置:

tps.prescaler = 16800;        // 分频系数
tps.period = 10000;           // 周期计数

不难发现,将 168MHz 按 16800 分频后,就使得原本能 1s 数数到 168M 现在 1s 只能数到 10000。

那我们就可以将数 10000 个数等价于 1s。数完就触发一次中断。如果希望半秒来一次中断,那就可以将计数周期设置为 5000。因为计数周期缩短一倍,触发时间自然缩短一半。

另外,还有一个比较重要的配置,那就是倍频。我在代码中采用的是四倍频,其函数的简介如下:

/*!
    \brief    configure the TIMER clock prescaler selection
    \param[in]  timer_clock_prescaler: TIMER clock selection
                only one parameter can be selected which is shown as below:
      \arg        RCU_TIMER_PSC_MUL2: if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB)
                                      or 0b100(CK_APBx = CK_AHB/2), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB).
                                      or else, the TIMER clock is twice the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 2 x CK_APB1;
                                      TIMER in APB2 domain: CK_TIMERx = 2 x CK_APB2)
      \arg        RCU_TIMER_PSC_MUL4: if APB1PSC/APB2PSC in RCU_CFG0 register is 0b0xx(CK_APBx = CK_AHB),
                                      0b100(CK_APBx = CK_AHB/2), or 0b101(CK_APBx = CK_AHB/4), the TIMER clock is equal to CK_AHB(CK_TIMERx = CK_AHB).
                                      or else, the TIMER clock is four timers the corresponding APB clock (TIMER in APB1 domain: CK_TIMERx = 4 x CK_APB1;
                                      TIMER in APB2 domain: CK_TIMERx = 4 x CK_APB2)
    \param[out] none
    \retval     none
*/
void rcu_timer_clock_prescaler_config(uint32_t timer_clock_prescaler)

可见,GD32F407VE 提供了两种倍频的配置。置于选择哪种倍频,得取决于数据手册中的功能框图。如下所示:

Timer5所在的框图
由图所示,Timer5 在 APB1 总线上,其最高频率是42MHz,是 AHB 总线的四分之一。这就是需要进行四倍频的原因之一。另外,还可以通过数据手册中的时钟树来判断,如下所示:
Timer5所在的时钟树

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

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

相关文章

深度学习500问——Chapter11:迁移学习(2)

文章目录 11.2 迁移学习的基本思路有哪些 11.2.1 基于样本迁移 11.2.2 基于特征迁移 11.2.3 基于模型迁移 11.2.4 基于关系迁移 11.2 迁移学习的基本思路有哪些 迁移学习的基本方法可以分为四种。这四种基本方法分别是&#xff1a;基于样本的迁移&#xff0c;基于模型的迁移&a…

Three.js动效(第15辑):让前端手撕UI,拳打后端的效果。

three.js的设计效果非常复杂&#xff0c;后端提供的数据接口问题百出&#xff0c;这很容易让前端手撕UI、拳打后端&#xff0c;这种请详细该如何办呢&#xff1f; 前端 VS UI&#xff1a; 1. 沟通协调&#xff1a;UI和前端应该加强沟通&#xff0c;理解对方的工作难点和需求&…

SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则

SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则 Spring Security 中默认所有的 http 请求都需要先认证通过后&#xff0c;才能访问。那么&#xff0c; 如何指定不需要认证就可以直接访问的资源呢&#xff1f;比如 用户的登录页面和注册页面&#xff0c;都是不需要…

用表头设置控制表格内列的排序和显示隐藏

项目背景 : react ant 需求 : 点击表头设置弹窗 , 拖拽可控制外部表格列的排序 , 开关可控制外部表格列的显示和隐藏 实现效果如下 :注意 : 1. 拖拽效果参考了ant-table中的拖拽效果(这块代码放最后) 2. 后台反了json格式(用is_show控制显示和隐藏 , 我给他传…

小企业选PLM系统的注意事项?

在当今竞争激烈的市场中&#xff0c;小企业需要不断提高生产效率和降低成本。为了实现这一目标&#xff0c;许多小企业正在寻找一种有效的解决方案来管理其产品生命周期。这就是为什么PLM系统对于小企业来说非常重要的原因&#xff0c;接下来请华天软件说说这个话题。 一、对于…

超详解——​深入理解Python中的位运算与常用内置函数/模块——基础篇

目录 ​编辑 1.位运算 2.常用内置函数/模块 math模块 random模块 decimal模块 常用内置函数 3.深入理解和应用 位运算的实际应用 1.权限管理 2.位图 3.图像处理 2.math模块的高级应用 统计计算 几何计算 总结 1.位运算 位运算是对整数在内存中的二进制表示进行…

成功者的思维方式——逆向思维

在竞争激烈的现代社会中&#xff0c;成功者往往具备一种与众不同的思维方式——逆向思维。 1、原谅别人的过失 在大多数人的思维中&#xff0c;对于别人的过失往往持有批评和指责的态度。但是&#xff0c;每个人都有犯错的时候&#xff0c;而原谅不仅能化解矛盾&#xff0c;…

气膜馆在夏季如何控制室内温度—轻空间

气膜馆以其快速搭建、灵活使用和高效节能的特点在多种场合中得到广泛应用。然而&#xff0c;夏季的高温环境对气膜馆内的温度控制提出了巨大挑战。本文将探讨气膜馆在夏季如何有效控制室内温度&#xff0c;确保为使用者提供一个舒适的环境。 1. 优质膜材选择 隔热膜材&#xff…

【Three.js】知识梳理十五:相机控制器Controls

在 3D 场景中&#xff0c;摄像机的控制尤为重要&#xff0c;因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器&#xff0c;最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

成都百洲文化传媒有限公司电商服务的领航者

在当今数字化浪潮席卷全球的时代&#xff0c;电商行业以其独特的魅力和无穷的潜力&#xff0c;正成为推动经济发展的重要引擎。在这一领域&#xff0c;成都百洲文化传媒有限公司以其专业的电商服务和创新的营销理念&#xff0c;成为了行业的佼佼者&#xff0c;引领着电商服务的…

简单塔防小游戏

学习目标&#xff1a;熟悉塔防游戏核心战斗 游戏画面 项目结构目录 核心代码&#xff1a; if ( Input.GetMouseButtonDown(0)){if (EventSystem.current.IsPointerOverGameObject()false){//开发炮台的建造Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);Rayca…

Openstack删除虚拟机失败,状态变成ERROR,如何完成正常删除

1、问题描述 在openstack平台批量删除了几台云主机&#xff0c;但删除过程因为消息队列故障导致cinder volume服务异常&#xff0c;有两台主机状态变为ERROR,无法正常删除。 2、问题处理 使用nova reset-state --active xxxx&#xff08;uuid&#xff09;将主机状态重置为activ…

Mac vscode could not import github.com/gin-gonic/gin

问题背景&#xff1a; 第一次导入一个go的项目就报红 问题分析&#xff1a; 其实就是之前没有下载和导入gin这个web框架包 gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确。 问题解决&#xff1a; 依次输入以下命令。通…

2024护眼落地灯十大品牌有哪些?揭晓年度十大护眼灯品牌!

2024护眼落地灯十大品牌有哪些&#xff1f;家里的台灯照明范围有限&#xff0c;阅读面和房间的空间光线亮暗差大&#xff0c;眼睛需要同时适应亮和暗两种光线&#xff0c;频繁收缩&#xff0c;极易眼疲劳。再加上学习时间过长&#xff0c;眼睛得不到休息&#xff0c;从而引起近…

React+TS前台项目实战(八)-- 全局常用组件模态框Modal封装

文章目录 前言Modal模态框组件1. 功能分析2. 代码详细注释说明3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲项目中经常会用到的模态框Modal组件封装。模态框可用在很多地方&#xff0c;比如弹窗Dialog使用、消息提示Message使用等都可以在外层套上Modal组件&#xff0c;下…

6.11运算符重载

友元 友元的设置是因为这样就可以访问类中的private成员 设置某一个类或者是函数为友元的&#xff0c;用friend关键字声明友元 友元的三种形式&#xff1a;普通函数、成员函数、友元类 普通函数&#xff1a;在类内部声明然后再类外部定义。 class Point{ public:friend f…

Linux2(文件类型分类 基本命令2 重定向)

目录 一、文件类型分类 二、基本命令2 1. find 帮助查询 2. stat 查看文件的信息 3. wc 统计文本 4. 查看文本内容 4.1 cat 4.2 more 4.3 less 4.4 head 4.5 tail 5. cal 显示日历 6. date 显示时间 7. du 文件大小 8. ln 链接 软链接 硬链接 区别 9. histo…

6.8日志系统

当做大型项目的时候&#xff0c;出了bug可能需要借助于日志检查&#xff0c;小项目一般是打断点。 服务器是一直在运行的&#xff0c;不能停止&#xff0c;可以借助于日志检查错误。 日志分为两种&#xff1a;业务级别的日志&#xff08;供用户分析业务过程&#xff09;&…

基于springboot实现教学资料管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现教学资料管理系统演示 摘要 使用旧方法对教学资料管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在教学资料管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存…

【ARM Coresight Debug 系列 -- ARMv8/v9 Watchpoint 软件实现地址监控详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 ARMv8/v9 Watchpoint exceptionsWatchpoint 配置信息读取Execution conditionsWatchpoint data address comparisonsSize of the data accessWatchpoint 软件配置流程Watchpoint Type 使用介绍WT, Bit [20]: Watchpoint TypeLBN, B…