GD32F103x 定时器

news2024/11/25 12:28:43

1.   定时器的基本介绍

STM32的定时器主要分为三种:高级定时器、通用定时器、基本定时器

即:高级定时器具有捕获/比较通道和互补输出,死区时间,通用定时器只有捕获/比较通道,基本定时器没有以上两者。 

1. 基本定时器

1.时钟源


时钟源来自RCC的CK_TIMER,就是内部时钟(CK_INT)直接经过控制器传给时基单元充当

PSC_CLK。

2.控制器


控制定时器的复位、使能、计数、DAC触发

3.基本时基单元


1>预分频器(PSC)perscaler
分频、得到计时器的时钟,即CNT计数1次所需要的时间,预分频器时16位的寄存器、所以可分频为1-65536。
基本定时器只能选择内部时钟,故预分频器直接输入端,即内部时钟CK_INT(一般为72MHz)
预分频器(PSC)写0(1分频或者不分频):则SK_CNT输出72MHz,
写1(2分频):输出36MHz,写2(3分频):输出24MHz。
故实际分频系数=预分配系数+1(分频器是16位,故最大位65525)。

2>计数器(CNT)counter
用来计数,到达设定值后,会产生中断。

3>自动重装寄存器(ARR)Auto Reload Register
CNT加到ARR的值之后,会产生一个事件或中断或DMA请求,中断用得比较多

UI(向上的箭头)中断响应,更新中断后会通向NVIC,再通向CPU
U(向下的箭头)事件响应:触发其他外设工作

4.主模式触发DAC功能


1)能让内部的硬件再不受程序的控制下实现自动运行,若利用好,可以极大地减轻CPU的负担。
2)用途:使我们使用DAC的时候,用DAC输出一段波形,则需要每隔一段事件触发一次DAC,让它输出下一个电压点。
用正常思维实现:先设置一个定时器产生中断,每隔一段时间再中断程序中调用代码手动触发一次DAC转换,然后DAC输出。这样会使主程序处于频繁被中断的状态,会影响主程序的运行和其他中断的响应
故定时器设置了一个主模式,使用主模式可以把定时器的更新事件映射到触发输出TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要用中断来触发DAC(数模转换)转换了
仅仅需要将更新事件通过主模式映射到TRGO,然后TRGO就会直接去触发DAC,整个过程不需要软件的参与,实现了硬件的自动化,这就是主模式的作用。


2. 通用定时器 

框图可以分为四个大部分,分别是:①时钟产生器部分,②时基单元部分,③输入捕获部分、④输出比较部分。 

位于低速的APB1总线上(APB1)
16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: 
        ① 输入捕获 

        ② 输出比较

        ③ PWM 生成(边缘或中间对齐模式) 

        ④ 单脉冲模式输出 

可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): 
        ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 

        ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 

        ③输入捕获 

        ④输出比较 

        ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 

        ⑥触发输入作为外部时钟或者按周期的电流管理

STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。   
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

 

3. 计数器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。

①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

1. 输出PWM波

PWM模式运行产生:
        定时器2、3和4可以产生4独立的信号

        频率和占空比可以进行如下设定:

                一个自动重载寄存器用于设定PWM的周期;

                每个PWM通道有一个捕捉比较寄存器用于设定占空时间。

                例如:产生一个40KHz的PWM信号:在定时器2的时钟为72MHz下,占空比为50% 。预分频寄存器设置为0 (计数器的时钟为TIM1CLK/(O+1)),自动重载寄存器设为                         1799,CCRx寄存器设为899。

  • 两种可设置PWM模式:

        边沿对齐模式(PWM0或者PWM1)

输出 PWM 功能
PWM 输出模式下 ( PWM 模 式 0 是配置 CHxCOMCTL 3’b110 PWM 模式 1 是 配 置
CHxCOMCTL 3’b111 ),通道根据 TIMERx_CAR 寄存器和 TIMERx_CHxCV 寄存器的值,输出
PWM 波形。
根据计数模式,我们可以分为两种 PWM 波: EAPWM( 边沿对齐 PWM) CAPWM( 中央对齐
PWM)
EAPWM 的周期由 TIMERx_CAR 寄存器值决定,占空比由 TIMERx_CHxCV 寄存器值决定。
15-42. EAPWM 时序图(边沿) 显示了 EAPWM 的输出波形和中断。
CAPWM 的周期由(2*TIMERx_CAR 寄存器值)决定,占空比由(2*TIMERx_CHxCV 寄存器
值)决定 15-43. CAPWM 时序图(中心) 显示了 CAPWM 的输出波形和中断。
PWM0 模式下 (CHxCOMCTL==3’b110) , 如 果 TIMERx_CHxCV 寄 存 器 的 值 大 于
TIMERx_CAR 寄存器的值,通道输出一直为有效电平。
PWM0 模式下 (CHxCOMCTL==3’b110) ,如果 TIMERx_CHxCV 寄存器的值等于 0 ,通道输出
一直为无效电平。

    

 

3. 高级定时器  

 

2.定时器应用

总结:定时器功能是很强大的。大多内容都是手册上 看的。我们需要定时器什么功能根据手册一步一步来配置。也这一看官方的dome快速上手。

 3. 输出PWM不断修改占空比来实现呼吸灯。(通用定时器2)

PWM_pulse.h

#ifndef PWM_PULSE_H
#define PWM_PULSE_H

#include "gd32f10x.h"

void timer2_pwm_init(uint16_t psr, uint16_t arr);   //初始化timer2的pwm输出参数
void timer2_pwm_duty_set(uint16_t duty);   // 调整pwm的占空比

#endif

PWM_pulse.c

#include "pwm_pulse.h"

//功能:初始化timer2的pwm输出参数
//psr: 预分频
//arr: 自动重装载

void timer2_pwm_init(uint16_t psr, uint16_t arr){
	timer_parameter_struct timer_init_struct;
	timer_oc_parameter_struct timer_oc_init_struct;
	
	// 时钟源和io口pb0的初始化
	rcu_periph_clock_enable(RCU_TIMER2); /* 开启定时器的时钟 */
	rcu_periph_clock_enable(RCU_GPIOB);  /* 开启GPIOB的时钟 */
	rcu_periph_clock_enable(RCU_AF);     /* 开启复用的时钟 */
	
	gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); /* GPIO初始化 */
	
	// 初始化timer2
	timer_deinit(TIMER2);
	timer_init_struct.prescaler = psr;
	timer_init_struct.period = arr;  //自动装载值
	timer_init_struct.alignedmode = TIMER_COUNTER_EDGE;  //边沿对齐
	timer_init_struct.counterdirection = TIMER_COUNTER_UP; //计数方向
	timer_init(TIMER2, &timer_init_struct);
	
	// PWM的初始化
	timer_oc_init_struct.outputstate = TIMER_CCX_ENABLE;  //使能通道
	timer_channel_output_config(TIMER2, TIMER_CH_2, &timer_oc_init_struct);
	
	timer_channel_output_mode_config(TIMER2,TIMER_CH_2, TIMER_OC_MODE_PWM0); /* PWM0模式 */
	
	// 使能timer2
	timer_enable(TIMER2);
}

// 功能:调整pwm的占空比
// duty: 捕获/比较
void timer2_pwm_duty_set(uint16_t duty){
	timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, duty); //设置 捕获/比较值
}

 main.c

对PB0上的LED现在呼吸灯。

 硬件电路:

把PB0配置成定时器2复用功能。

在代码中ARR:100  捕获寄存器:从1~ 100。(它决定占空比大小)

简单画了一个图:在代码里选择的是PWM0模式。如果有示波器就会看到占空比不停变大,然后又不停的变小。不停循环。LED从暗到亮。然后又从亮到暗。不停循环。如果改成PWM1模式刚好反过来。具体可以自己试。

 

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

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

相关文章

【图像处理】【应用程序设计】加载,编辑和保存图像数据、图像分割、色度键控研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案_已设置图床

minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案 minikube dashboard报错 considerconsider-Dell-G15-5511:~$ minikube dashboard 🤔 正在验证 dashboard 运行情况 ... 🚀 正在启动代理... 🤔 正在验证 proxy 运行…

LabVIEW工业虚拟仪器的标准化实施

LabVIEW工业虚拟仪器的标准化实施 创建计算机化的测试和测量系统,从计算机桌面控制外部测量硬件设备,以及在计算机屏幕上显示的类似仪器的面板上查看来自外部设备的测试或测量数据,所有这些都需要虚拟仪器系统软件。该软件允许用户执行所有这…

链表经典面试题(四)

分割链表 1.题目2.详细的图文分析3.详细的注释和代码 1.题目 2.详细的图文分析 我们会定义4个指向分割链表的指向指针,分别来表示两个链表的头和尾 并且将数据一一的放到两个链表中,最后再将它们串起来,代码中有详细注释. 3.详细的注释和代码 public class Partition {public…

【C语言】模拟实现strcat

strcat在小白看来是一个比较陌生的库函数,但也要牢牢掌握 目录 介绍:模拟实现: 介绍: str代表字符串,那么cat代表什么? 他代表Catenate,连接的缩写,也就是追加字符串的意思 代码示例…

海信电视U8KL使用体验:参数卷,画质技术也独有!

每个家庭成员对电视都有不同需求,如何能做到兼顾?看似需求众口难调,其实一台海信电视就能满足所有啦。 海信电视的参数不仅是最卷的,同时画质技术还是国内独有的,能把这样一台优秀的电视搬回家,无论电影、…

拒绝水文!八大排序(三)【适合初学者】快速排序

文章目录 快速排序递归实现霍尔法优化 挖坑法前后指针法 快速排序非递归 大家好,我是纪宁,这篇文章将向大家介绍非常有名气的一款排序:快速排序 回忆到我们刚开始学习C语言的时候。经常会使用到一个库函数: qsort函数 &#xff0…

【JVM】垃圾回收(GC)详解

垃圾回收(GC)详解 一. 死亡对象的判断算法1. 引用计数算法2. 可达性分析算法 二. 垃圾回收算法1. 标记-清除算法2. 复制算法3. 标记-整理算法4. 分代算法 三. STW1. 为什么要 STW2. 什么情况下 STW 四. 垃圾收集器1. CMS收集器(老年代收集器&…

kubernetes教程-基本学习环境配置

kubernetes教程-基本学习环境配置 安装必要工具 kubectl Kubernetes的命令行工具, kubectl, 允许你在Kubernetes集群中运行命令. 你可以用kubectl来部署应用, 检查和管理集群资源, 并查看日志。有关更多信息,包括 kubectl的全部命令完整列表, 查看 ku…

string类的使用方式的介绍

目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类? 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象…

【iptables 实战】06 iptables网络防火墙实验

一、现状说明 在上一节中,我们将两个网段的机器,通过中间机器的网络转发,能达到互通。再来回顾一下这个网络连接的图 这一节,我们将通过设置机器B的iptables规则,来做一些防火墙实验 机器A模拟公网的一台服务器&#…

【C++进阶之路】C++11(上)

文章目录 一、列表初始化1.{}2.initializer_list 二、声明1.auto2.deltype 三、右值与左值1.基本概念2.应用场景1.左值引用2.右值引用3.完美转发4.万能引用 四、新增默认成员函数五、lambda表达式1.基本语法1.1捕捉列表1.2参数列表1.3返回类型1.4函数体 2.底层原理 总结 一、列…

GPT系列模型解读:GPT-1

GPT系列 GPT(Generative Pre-trained Transformer)是一系列基于Transformer架构的预训练语言模型,由OpenAI开发。以下是GPT系列的主要模型: GPT:GPT-1是于2018年发布的第一个版本,它使用了12个Transformer…

2021-06-20 51单片机基于STC89C52RC的简易秒表的设计与实现(外部中断1和2)

缘由基于STC89C52RC的简易秒表的设计与实现_编程语言-CSDN问答 1.功能要求: K1键做启动停止秒表(外部中断0),K2键做秒表归零(外部中断1),4位数码管动态扫描显示,定时范围改成0到00…

房产政策松绑,VR看房助力市场回春

近日房贷利率、房产限购开始松绑,房地产市场逐渐被激活,房产行业的线上服务能力,也愈发的受到了重视。随着房贷利率、首付比例变化的消息逐渐推出,部分用户开始入手房产市场,因此房产行业的线上服务也需要不断升级&…

【计算机组成原理】读书笔记第五期:通过汇编语言了解程序的实际构成

目录 写在开头 汇编语言和本地代码的关系 汇编语言的源代码 伪指令 汇编的基本语法 常见的汇编指令 mov push和pop 函数的使用机制 函数的调用 函数参数的传递与返回值 全局变量 局部变量 程序的流程控制 循环语句 条件分支 通过汇编语言了解程序运行方式的必…

RTP/RTCP 协议讲解

文章目录 前言一、RTP 协议1、RTP 协议概述2、RTP 工作机制3、RTP 协议的报文结构4、wireshark 抓取 RTP 报文 二、RTCP 协议1、RTCP 协议概述2、RTCP 工作机制3、RTCP 数据报4、wireshark 抓取 RTCP 报文 三、RTSP 和 RTP 的关系四、易混淆概念1、RTP over UDP 和 RTP over RT…

typescript 泛型详解

typescript 泛型 泛型是可以在保证类型安全前提下,让函数等与多种类型一起工作,从而实现复用,常用于: 函数、接口、class中。 需求:创建一个id 函数,传入什么数据就返回该数据本身(也就是说,参数和返回值类型相同)。 …

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建项目 / 创建核心类

文章目录 一、创建SpringBoot项目二、创建核心类创建 Exchange类创建 MSGQueue类创建 Binding类创建Message类 一、创建SpringBoot项目 在项目中添加这四个依赖! 二、创建核心类 交换机 :Exchange 队列 :Queue 绑定关系: Binding 消息 :Message 这些核心类都存在于 BrokerSe…

常见加密和解密方法介绍。

介绍常见的加密和解密方法。 加密是利用数学方法将明文转化为密文,从而达到保护数据的目的。 通过加密可保证数据的机密性、完整性、鉴别性。 机密性:通过数据加密实现。只允许特定用户访问和阅读信息。 完整性:通过数字加密、散列、数字签名…