【GD32】04 - Timer定时器
GD32中的定时器

GD32E230中有七个定时器,六种类型,其中通用的L4版本有两个,其他类型的各一个。
那我们就以通用L4这个类型来敲代码,其他流程是通用的。
通用L4

虽然每种类型的定时器都有自己的结构框图,但是其实大差不差,定时器来来回回不就那几个寄存器嘛,自动重装载寄存器,预分频器,要输出个PWM就再来个输出比较。
要注意的就是通用L4这边的时钟源只有一个。

因此用GD32的定时器的时候,要去手册翻翻对应的定时器里的介绍,因为GD32里定时器种类还不少,细节上还是有差异的。

那我们来看看给L4提供的时钟源是多少频率的,这关系到我们后面参数的设置。
从左边AHB过来是72MHz,给Timer0,14,15,16提供时钟之前经过一个分频器,这个分频器是如果APB2的分频是1分频,那么它也是1分频,如果不是,那么是2分频,而APB2就是1分频,因此它也是1分频,也就是说没有减少我们的时钟频率,因此给L4的时钟频率就是72MHz。
定时器溢出频率的公式跟STM32是一样的,就是时钟频率/((自动重装载寄存器的值+1)*(预分频器的值+1))
固件库函数
rcu_periph_clock_enable(RCU_TIMER15)
定时器相关函数很多,我们只挑这次用到的讲。
timer_init

初始化定时器,参数一选择是哪一个定时器。
参数二传入一个结构体变量的指针。
我们来看看这个结构体。

通过配置预分频值和周期来控制定时器溢出的频率,就用上面的公式,把这个周期看成是自动重装载计数器就行。
对齐方式一般选择边缘对齐TIMER_COUNTER_EDGE。
计数方式选择向上计数TIMER_COUNTER_UP,L4里也只能向上计数。
时钟分频因子这个是输入捕获的时候才用的到的,我们可以不配。
重复计数器值是只溢出多少次之后再溢出才进一次中断的,不过只有高级定时器才有,我们也不配。
timer_enable

使能定时器,当我们配置完定时器包括中断之后就可以使能了。
timer_disable

失能定时器。
timer_prescaler_config

配置预分频器的模式,我们选择立即加载。
timer_interrupt_enable

使能中断,中断源我们就选第一个,更新中断,这是不管哪一种定时器都能用的,其他参数可以参考上面表格的说法。
timer_interrupt_flag_get

获取中断标志位,一样是在中断处理函数中判断是哪个中断源触发的中断。
timer_interrupt_flag_clear

清除中断标志位,除了在中断处理函数中使用,我们在一开始配置定时器的时候就需要用一下,否则会马上触发一次中断。
上面这些函数就足够我们进行最基础的一个计时了,但是还有个问题,就是中断,中断都需要配置NVIC。
NVIC使能的函数我们在上一篇外部中断里说过了,这边就直接把代码贴出来了。
nvic_irq_enable(TIMER15_IRQn,1);
最后一个就是中断处理函数了,我们一样是从启动文件的汇编文件里去找。

秒表示例代码
#include "gd32e23x.h"
#include "systick.h"
#include "OLED.h"uint16_t Z_Time_s = 0 ,Z_Time_10ms = 0;void TIMER15_IRQHandler(void){ if(timer_interrupt_flag_get(TIMER15,TIMER_INT_FLAG_UP) == SET){ timer_interrupt_flag_clear(TIMER15,TIMER_INT_FLAG_UP); //清除中断标志位 if(++Z_Time_10ms >= 100) {Z_Time_10ms = 0;++Z_Time_s;}}
} int main(void){systick_config();OLED_Init();rcu_periph_clock_enable(RCU_TIMER15); //开启定时器时钟 timer_parameter_struct timer_initpara; timer_initpara.prescaler = 200 -1; //预分频timer_initpara.alignedmode = TIMER_COUNTER_EDGE; //边缘对齐timer_initpara.counterdirection = TIMER_COUNTER_UP; //向上计数timer_initpara.period = 3600 - 1; //周期timer_init(TIMER15,&timer_initpara); //初始化定时器timer_prescaler_config(TIMER15, 1, TIMER_PSC_RELOAD_NOW);//设置预分频器为立即加载模式timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除中断标志位,否则一开始就会进一次中断nvic_irq_enable(TIMER15_IRQn, 1); //设置中断优先级timer_interrupt_enable(TIMER15, TIMER_INT_UP); //使能更新中断 timer_enable(TIMER15); //使能定时器OLED_ShowString(1,5,":");while(1){OLED_ShowNum(1,1,Z_Time_s,4);OLED_ShowNum(1,6,Z_Time_10ms,2);}
}
我这边做个秒表的效果,以精度在10ms,因此我们需要每秒定时器溢出中断100次。
因为时钟源是72MHz,因此需要让72MHz去除以(周期+1)再除以(预分频+1)最终等于100即可。
最后一点要注意的就是这俩寄存器是16位的,因此设置周期和预分频的值的时候要注意不要超过65535了。

大家可以配合上个文章的外部中断,在这个秒表的基础上加几个按钮,实现暂停继续,清零等功能。就当是课后作业了(bushi)

相关文章:
【GD32】04 - Timer定时器
GD32中的定时器 GD32E230中有七个定时器,六种类型,其中通用的L4版本有两个,其他类型的各一个。 那我们就以通用L4这个类型来敲代码,其他流程是通用的。 通用L4 虽然每种类型的定时器都有自己的结构框图,但是其实大差…...
Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III
题目: 题解: func maxProfit(prices []int) int {buy1, sell1 : -prices[0], 0buy2, sell2 : -prices[0], 0for i : 1; i < len(prices); i {buy1 max(buy1, -prices[i])sell1 max(sell1, buy1prices[i])buy2 max(buy2, sell1-prices[i])sell2 m…...
Leetcode2028. 找出缺失的观测数据
Every day a Leetcode 题目来源:2028. 找出缺失的观测数据 解法1:模拟 统计当前 m 个元素的总和 curSum sum(rolls),总共 mn 个元素和为 total (m n) * mean。 排除 2 种情况: total - curSum > 6 * n:n 个…...
如何在CentOS中合理划分磁盘空间以优化系统性能
目录 前言 理想的分区方案 为什么需要单独分区 安全性 性能 管理和维护 稳定性和可靠性 升级和兼容性 结论 前言 在进行CentOS系统的安装和配置时,合理划分磁盘空间是确保系统性能、安全性和易于管理的关键步骤。本文将探讨如何根据系统的硬件配置和预期用途…...
算法(十一)贪婪算法
文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法(Greedy)是一种在每一步都采取当前状态下最好的或者最优的选择,从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断,…...
Rust之函数式语言特性:迭代器和闭包(一):概述
开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感,其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…...
配置资源管理
一 Secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。 1 有三种类型: kubernetes.io/service…...
unity2020打包webGL时卡进程问题
我使用的2020.3.0f1c1,打包发布WEB版的时候会一直卡到asm2wasm.exe这个进程里,而且CPU占用率90%以上。 即使是打包一个新建项目的空场景也是同样的问题,我尝试过一直卡在这里会如何,结果还真打包成功了。只是打包一个空场景需要20…...
云原生架构相关技术_3.无服务器技术
1.技术特点 1.1面向特定领域的后端云服务(BaaS) 随着以Kubernetes为代表的云原生技术成为云计算的容器界面,Kubernetes成为云计算的新一代操作系统。面向特定领域的后端云服务(BaaS)则是这个操作系统上的服务API&…...
Leetcode:Z 字形变换
题目链接:6. Z 字形变换 - 力扣(LeetCode) 普通版本(二维矩阵的直接读写) 解决办法:直接依据题目要求新建并填写一个二维数组,最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并…...
Python 3 判断文件是否存在
1 使用os.path模块 import osfile_path hello.txtif os.path.exists(file_path):print(f"文件 {file_path} 存在。") else:print(f"文件 {file_path} 不存在。") 2 使用pathlib模块 from pathlib import Pathfile_path Path(word.txt)if file_path.ex…...
(深度学习记录)第TR3周:Transformer 算法详解
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文本的输入处理中,transformer会将输入文本序列的每个词转化为一个词向量,我们通常会选择一个合适的长度作为输入…...
谷神前端组件增强:自定义列
初始化 $gp.customColumn {}initColumnPool /*** initColumnPool* 初始化列池* * param prefix 前缀* param length 长度* * return Array 列ID数组* */ function initColumnPool (prefix, length) {return Array.from({length}, (value, index) > prefix index) } self…...
31-ESP32-S3-WIFI篇-02 Event Group (事件标记组)
ESP32-S3-WIFI 事件标记组 介绍 在ESP32-S3的WiFi驱动程序中,事件标记组(Event Group)是一个非常重要的概念。它是FreeRTOS中的一种同步机制,用于在任务之间传递和同步事件。在WiFi驱动程序中,我们使用事件标记组来通…...
构建企业级AI私有知识库
一、引言 在当今竞争激烈的市场环境中,企业为了保持竞争优势,需要高效地管理和利用内部知识资源。构建一个企业级AI私有知识库,不仅可以集中存储和管理企业知识,还能通过人工智能技术实现知识的智能化处理和利用。本文将详细介绍…...
C语言王国——杨氏矩阵
目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题: 一看这不是杨氏矩阵嘛,接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知: …...
陪玩小程序都需要怎么做?
开发陪玩小程序需要进行全面的需求分析、功能规划、技术选型、界面设计等一系列步骤。陪玩小程序作为一种新兴的网络服务平台,为用户提供了寻找游戏伙伴、预约陪玩服务等功能,满足了用户在游戏领域的社交互动和技能提升需求。具体分析如下: 需…...
postgressql——子事务可见性判断 性能问题(8)
子事务可见性判断 & 性能 测试SQL BEGIN; PREPARE sel(integer) ASSELECT count(*)FROM contendWHERE id BETWEEN $1 AND $1 + 100; PREPARE upd(integer) ASUPDATE contend SET val = val + 1WHERE id IN ($1, $1 + 10, $1 + 20, $1 + 30);SAVEPOINT a; \set rnd random…...
20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头
20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头 2024/5/31 20:04 USB摄像头分辨率:1080p(1920x1080) 默认编译Buildroot的SDK即可点亮USB摄像头。v4l2-ctl --list-devices v4l2-ctl --list-formats-ext -d /dev/video74 …...
从0开始学统计-什么是回归?
1.什么是回归? 回归(Regression)是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量(输入变量)与因变量(输出变量)之间的关系。在回归分析中,我们尝试根…...
Prometheus外置抓取器:扩展监控能力与复杂场景适配方案
1. 项目概述:一个为Prometheus量身定制的“数据抓取器”如果你正在使用Prometheus监控你的微服务、Kubernetes集群或者任何需要被度量的系统,那你一定对scrape_configs这个配置项不陌生。Prometheus的核心工作模式就是“拉取”(Pullÿ…...
LSM6DS3TR-C与磁力计集成:九轴数据融合与姿态解算实践
1. 项目概述:从运动传感器到磁力计的数据融合在之前的系列文章中,我们已经深入探讨了LSM6DS3TR-C这款六轴惯性测量单元(IMU)在加速度计和陀螺仪数据采集、运动检测算法实现等方面的应用。今天,我们将把目光投向一个同样…...
通过curl命令直接测试Taotoken聊天补全接口的简易方法
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令直接测试Taotoken聊天补全接口的简易方法 在开发或调试过程中,有时我们希望在无需引入完整SDK的轻量级环境…...
Obsidian Projects:开源文本项目管理的终极解决方案
Obsidian Projects:开源文本项目管理的终极解决方案 【免费下载链接】obsidian-projects Plain text project planning in Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-projects 在当今信息爆炸的时代,高效的项目管理工具已成…...
K8s安全加固清单:从RBAC到数据加密的实战指南
在云原生时代,Kubernetes 已成为容器编排的事实标准,但默认配置下的 K8s 并不安全。一次错误的 RBAC 权限配置、一个暴露的 etcd 端口、或者一个特权模式的 Pod,都可能成为攻击者的入口。本文从认证授权、Pod 安全、网络隔离、数据加密四个维…...
Claude代码系统提示词:提升AI编程效率的工程化实践
1. 项目概述与核心价值最近在AI编程辅助领域,一个名为“Piebald-AI/claude-code-system-prompts”的项目在开发者社区里引起了不小的讨论。简单来说,这是一个专门为Claude(特别是Claude 3系列模型)设计的、用于提升代码生成与编程…...
NHSE终极指南:5分钟掌握动物森友会存档编辑器的完整教程
NHSE终极指南:5分钟掌握动物森友会存档编辑器的完整教程 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE 还在为《集合啦!动物森友会》中收集稀有物品而烦恼吗?想…...
什么是 TRAE IDE?
TRAE IDE 是一款深度融合 AI 能力的开发工具,提供从代码编写、项目理解、调试运行到变更管理的完整开发体验。你可以像使用传统 IDE 一样掌控每一步,也可以把复杂任务交给 AI 智能体规划和执行。使用场景TRAE IDE 覆盖日常开发与复杂工程任务,…...
FRED应用:导入列表形式的BSDF数据
简介在FRED中,列表形式的BSDF数据可以使用如下两种方式。1. 按照FRED可以识别的数据格式直接导入作为散射模型。2. 使用BSDF数据拟合工具来产生合适的函数模型。数据文件的格式在FRED中能被识别的测试数据必须按照如下的规格形式。数据文件的开头包含两行࿰…...
别再只盯着DICOM了!用Python的nibabel库处理NII格式医学影像,从数据加载到3D可视化全流程
解锁医学影像分析新维度:Pythonnibabel全流程处理NII格式实战指南 在医学影像分析领域,DICOM格式长期占据主导地位,但越来越多的研究者发现,在处理神经影像数据时,NII/NIfTI格式展现出独特的优势。这种专为脑科学研究…...
