当前位置: 首页 > news >正文

【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

题目&#xff1a; 题解&#xff1a; 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 题目来源&#xff1a;2028. 找出缺失的观测数据 解法1&#xff1a;模拟 统计当前 m 个元素的总和 curSum sum(rolls)&#xff0c;总共 mn 个元素和为 total (m n) * mean。 排除 2 种情况&#xff1a; total - curSum > 6 * n&#xff1a;n 个…...

如何在CentOS中合理划分磁盘空间以优化系统性能

目录 前言 理想的分区方案 为什么需要单独分区 安全性 性能 管理和维护 稳定性和可靠性 升级和兼容性 结论 前言 在进行CentOS系统的安装和配置时&#xff0c;合理划分磁盘空间是确保系统性能、安全性和易于管理的关键步骤。本文将探讨如何根据系统的硬件配置和预期用途…...

算法(十一)贪婪算法

文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法&#xff08;Greedy&#xff09;是一种在每一步都采取当前状态下最好的或者最优的选择&#xff0c;从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断&#xff0c…...

Rust之函数式语言特性:迭代器和闭包(一):概述

开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感&#xff0c;其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…...

配置资源管理

一 Secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;这类数据虽然也可以存放在 Pod 或者镜像中&#xff0c;但是放在 Secret 中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 1 有三种类型&#xff1a; kubernetes.io/service…...

unity2020打包webGL时卡进程问题

我使用的2020.3.0f1c1&#xff0c;打包发布WEB版的时候会一直卡到asm2wasm.exe这个进程里&#xff0c;而且CPU占用率90%以上。 即使是打包一个新建项目的空场景也是同样的问题&#xff0c;我尝试过一直卡在这里会如何&#xff0c;结果还真打包成功了。只是打包一个空场景需要20…...

云原生架构相关技术_3.无服务器技术

1.技术特点 1.1面向特定领域的后端云服务&#xff08;BaaS&#xff09; 随着以Kubernetes为代表的云原生技术成为云计算的容器界面&#xff0c;Kubernetes成为云计算的新一代操作系统。面向特定领域的后端云服务&#xff08;BaaS&#xff09;则是这个操作系统上的服务API&…...

Leetcode:Z 字形变换

题目链接&#xff1a;6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;二维矩阵的直接读写&#xff09; 解决办法&#xff1a;直接依据题目要求新建并填写一个二维数组&#xff0c;最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并…...

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 算法详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文本的输入处理中&#xff0c;transformer会将输入文本序列的每个词转化为一个词向量&#xff0c;我们通常会选择一个合适的长度作为输入…...

谷神前端组件增强:自定义列

初始化 $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驱动程序中&#xff0c;事件标记组&#xff08;Event Group&#xff09;是一个非常重要的概念。它是FreeRTOS中的一种同步机制&#xff0c;用于在任务之间传递和同步事件。在WiFi驱动程序中&#xff0c;我们使用事件标记组来通…...

构建企业级AI私有知识库

一、引言 在当今竞争激烈的市场环境中&#xff0c;企业为了保持竞争优势&#xff0c;需要高效地管理和利用内部知识资源。构建一个企业级AI私有知识库&#xff0c;不仅可以集中存储和管理企业知识&#xff0c;还能通过人工智能技术实现知识的智能化处理和利用。本文将详细介绍…...

C语言王国——杨氏矩阵

目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题&#xff1a; 一看这不是杨氏矩阵嘛&#xff0c;接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知&#xff1a; …...

陪玩小程序都需要怎么做?

开发陪玩小程序需要进行全面的需求分析、功能规划、技术选型、界面设计等一系列步骤。陪玩小程序作为一种新兴的网络服务平台&#xff0c;为用户提供了寻找游戏伙伴、预约陪玩服务等功能&#xff0c;满足了用户在游戏领域的社交互动和技能提升需求。具体分析如下&#xff1a; 需…...

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摄像头分辨率&#xff1a;1080p&#xff08;1920x1080&#xff09; 默认编译Buildroot的SDK即可点亮USB摄像头。v4l2-ctl --list-devices v4l2-ctl --list-formats-ext -d /dev/video74 …...

从0开始学统计-什么是回归?

1.什么是回归&#xff1f; 回归&#xff08;Regression&#xff09;是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量&#xff08;输入变量&#xff09;与因变量&#xff08;输出变量&#xff09;之间的关系。在回归分析中&#xff0c;我们尝试根…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...