STM32--寄存器与标准库函数--通用定时器--输出比较(PWM生成)

目录

前言

通用定时器类型

        向上计数、向下计数、中心对齐

输入捕获与输出比较概念

输出比较典型例子:驱动舵机旋转

通用定时器的输出比较库函数

代码

通用定时器的输出比较寄存器操作

代码

这里提供数据手册的寄存器

后言


前言

使用平台:STM32F407ZET6

使用数据手册:STM32F407数据手册.pdf

使用参考手册:STM32F4xx参考手册(中文).pdf

使用cortex-M手册:Cortex M3与M4权威指南.pdf

对于STM32F407微处理器而言,内部一共集成了14个定时器,其中有2个基本定时器(TIM6和TIM7)、10个通用定时器(TIM2~TIM5、TIM9~TIM14)、2个高级定时器(TIM1和TIM8)。

通用定时器类型

        通用定时器相对于基本定时器增加了输入捕获与输出比较功能。

可以确定,递增计数是所有定时器通用的,保险起见,整体设置为递增计数可以提高通用性。

        向上计数、向下计数、中心对齐

STM32F407ZET6一共提供10个通用定时器(TIM2~TIM5、TIM9~TIM14),TIM2和TIM5是32bit定时器,其他的定时器都是16bit定时器。TIM2~TIM5的计数方式有三种可以选择,分别为递增计数、递减计数、递增/递减计数。

递增计数:计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事件。

递减计数:计数器从自动重载值(TIMx_ARR 寄存器的内容)开始递减计数到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。

中心对齐:计数器从 0 开始计数到自动重载值(TIMx_ARR 寄存器的内容)- 1,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从 0 开始重新计数。

对于通用定时器TIM2~TIM5,都挂载在APB1外设总线下,定时器的频率为84MHZ,对于TIM12~TIM14都挂载在APB1外设总线下,定时器的频率为84MHZ,TIM9~TIM11是挂载在APB2总线下,所以定时器的频率为168MHZ,如下图

输入捕获与输出比较概念

输入捕获:可以把定时器的某个通道连接到GPIO引脚上,然后从外部输入脉冲信号,经过通道的滤波以及边沿检测之后,可以记录某个电平信号的脉冲宽度以及周期。

输出比较:可以把定时器的某个通道连接到GPIO引脚上,主动从引脚输出一个固定的脉冲,原理很简单,其实就是计数器(TIM_CNT)如果超过比较寄存器(CCR)中的值,就可以输出一个电平信号(高电平或者低电平)。

对于TIM9~TIM14而言,也可以进行定时功能,同样也具有输入捕获以及输出比较功能,但是只能采用向上计数的方式,并且相比于TIM2~TIM5,只有2个独立通道。

输出比较典型例子:驱动舵机旋转

        驱动舵机旋转需要调制PWM,PWM技术的关键参数有两个,一个是频率,一个是占空比。频率指的是利用STM32的定时器通道输出脉冲的次数。占空比是指在一个脉冲周期中通电时间相对于总时间所占的比例,也可以简单理解为一个周期内高电平持续时间相对于总时间所占的比例(%

        舵机(Servo Motor)是一种集成了电机、减速齿轮组、控制电路和位置反馈系统的微型伺服装置,可通过接收外部控制信号实现高精度角度定位。与传统电机不同,舵机无需持续旋转,而是通过内置电位器或编码器实时检测输出轴角度,形成闭环控制,从而精准到达指定位置并保持力矩。

        一般180°控制旋转的舵机,驱动的PWM参数:

通用定时器的输出比较库函数

代码

本质调用了如下函数可以实现输出比较功能

RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) 
RCC_AHBxPeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);GPIO_Init(GPIOx, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_TIMx);TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct);
TIM_OCxInit(TIMx, &TIM_OCInitStruct);TIM_OCxPreloadConfig(TIMx, TIM_OCPreload_ENABLE); 
TIM_ARRPreloadConfig(TIMx, ENABLE);TIM_Cmd(ENABLE)

库函数代码:

PF9的TIM14通用定时器实现的PWM

/*** @brief PF9的TIM14通用定时器实现的PWM**/
void TimerCaptureOutputInit(void)
{/* 开启GPIOF与TIM14的时钟 */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);/* 配置GPIO为AF复用功能 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOF, &GPIO_InitStruct);GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);/* 配置定时器的时基配置 20ms*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 2000 - 1;TIM_TimeBaseInitStruct.TIM_Prescaler = 840 - 1;TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct);/* 配置输出捕获配置 */TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse = 1000;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM14, &TIM_OCInitStruct);TIM_ARRPreloadConfig(TIM14, ENABLE);TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);TIM_Cmd(TIM14, ENABLE);
}

通过操控CRR寄存器或者TIM_SetComparex函数

TIM_SetComparex(TIMx, Compare1)

或者

TIMx->CCRx = 1500;

通用定时器的输出比较寄存器操作

代码

/*** @brief 基本定时器TIM4 CH4 PB9*        PWM波生成*/
void TimerNormalTIM4_4RegisterInit(void)
{// 初始化时钟RCC->AHB1ENR |= (1 << 1); // GPIOBRCC->APB1ENR |= (1 << 2); // TIM4// 对GPIOB的模式配置GPIOB->MODER &= ~(3 << (2 * 9));GPIOB->MODER |= (2 << (2 * 9)); //复用功能GPIOB->OSPEEDR |= (3 << (2 * 9));GPIOB->OTYPER &= ~(1 << 9); //推挽GPIOB->PUPDR &= ~(3 << 18); // 先清零GPIOB->PUPDR |= (1 << 18);  // 上拉(或 0 浮空,2 下拉)// 配置GPIOB与复用功能(TIM4_CH4)联合GPIOB->AFR[1] &= ~(0xf << 4);GPIOB->AFR[1] |= (2 << 4); //绑定具体的复用功能 TIM4 CH4// 配置定时器参数TIM4->CR1 &= ~(1 << 0); // 关闭定时器/* 配置分频系数等参数 */TIM4->ARR = 20000 - 1;TIM4->CNT = 0;TIM4->PSC = 84 - 1;TIM4->CCR4 = 1500 - 1;TIM4->CR1 |= (1 << 7);  // 自动重载预装载值TIM4->CR1 &= ~(1 << 4); // 计数器向上计数TIM4->CCMR2 &= ~(7 << 12);TIM4->CCMR2 |= (6 << 12); // PWM模式1TIM4->CCMR2 |= (1 << 11); // 输出比较4预装载使能TIM4->CCER |= (1 << 12);  //使能通道CH4TIM4->DIER &= ~(1 << 0);  //未使用中断,所以禁止中断TIM4->EGR |= (1 << 0);  //TIM4->CR1 |= (1 << 0); // 开启定时器
}

这里提供数据手册的寄存器

GPIO的模式寄存器设置为复用功能模式

复用功能寄存器

此寄存器需要对照数据手册

TIM的部分寄存器

控制寄存器

TIM捕获/比较模式寄存器

TIM捕获/比较使能寄存器

TIM事件生成寄存器

后言

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

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

相关文章

91、23种设计模式

设计模式是软件设计中反复出现的解决方案的模板&#xff0c;用于解决特定问题并提高代码的可维护性、可扩展性和可复用性。23种经典设计模式可分为创建型、结构型和行为型三大类&#xff0c;以下是具体分类及模式概述&#xff1a; 一、创建型模式&#xff08;5种&#xff09; 关…

力扣(串联所有单词的子串)

串联所有单词的子串问题&#xff1a;多滑动窗口与哈希表的实战应用。 一、题目分析&#xff08;一&#xff09;问题定义 给定字符串 s 和字符串数组 words&#xff08;words 中所有单词长度相同 &#xff09;&#xff0c;找出 s 中所有“串联子串”的起始索引。串联子串指包含 …

RH134 管理基本存储知识点

1. 对 Linux 磁盘进行分区时有哪两种方案&#xff1f;分别加以详细说明。答&#xff1a;MBR分区&#xff1a;主引导记录(MBR)分区方案是运行BIOS固件的系统上的标准方案。此方案支持最 多四个主分区。在Linux系统上&#xff0c;您可以使用扩展分区和逻辑分区来创建最多…

【JS 异步】告别回调地狱:Async/Await 和 Promise 的优雅实践与错误处理

【JS 异步】告别回调地狱&#xff1a;Async/Await 和 Promise 的优雅实践与错误处理 所属专栏&#xff1a; 《前端小技巧集合&#xff1a;让你的代码更优雅高效 上一篇&#xff1a; 【JS 数组】数组操作的“瑞士军刀”&#xff1a;精通 Array.reduce() 的骚操作 作者&#xff…

23.Linux : ftp服务及配置详解

Linux &#xff1a; ftp服务及配置详解 FTP 基本概念 定义&#xff1a;文件传输协议&#xff08;File Transfer Protocol&#xff09;&#xff0c;采用 C/S 模式工作。端口&#xff1a; 控制端口&#xff1a;21数据端口&#xff1a;20FTP 工作原理模式工作流程连接发起方主动模…

悲观锁乐观锁与事务注解在项目实战中的应用场景及详细解析

在今天做的项目练习部分中真的学到了很多东西&#xff0c;也补充了许多之前遗漏或是忘记的知识点&#xff0c;但时间精力有限&#xff0c;我就先记录一下今天用到的一个新东西&#xff0c;悲观锁和乐观锁。首先给出实际应用背景&#xff1a;在加入锁和事务注解之前&#xff0c;…

Java构造器与工厂模式(静态工程方法)详解

1. 构造器1.1 构造器的核心意义1.1.1 对象初始化构造器在创建对象 (new) 时自动调用, 用于初始化对象的状态 (如设置字段初始值, 分配资源等)无构造器时: 字段为默认值&#xff08;0/null/false&#xff09;有构造器&#xff1a;确保对象创建后即处于有效状态1.1.2 强制初始化…

解决jdk初始化运行,防火墙通信选错专业网络问题

问题描述新项目添加不同版本的jdk&#xff0c;运行时提示防火墙通信策略&#xff0c;选成专用网络。其他人访问后端接口时&#xff0c;提示连接失败。 解决方案&#xff1a;1、在搜索栏中输入 防火墙关键字&#xff0c;选择到防火墙和网络保护2、选择允许应用通过防火墙3、先点…

【Linux】常用命令(三)

【Linux】常用命令&#xff08;三&#xff09;1. export1.1 原理1.2 常用语法1.3 示例1.4 书中对命令的解释1.5 生效范围2. 测试服务地址与其端口能否访问2.1 nc(Netcat)命令2.2 telnet2.3 nmap2.4 curl命令 (适用于HTTP/HTTPS 服务)1. export export 是 Linux Shell&#xff…

Pytest项目_day15(yaml)

YAMLYAML是一个对所有编程语言都很友好的数据序列化标准&#xff0c;它是一种直观的能够被电脑识别的数据序列化格式&#xff0c;是一种可读性高且容易被人类阅读的脚本语言YAML语言的本质是一种通用的数据串行化格式适用场景 可以直接序列化为数组、字典解析成本低专门写配置文…

审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案

审批流程系统设计与实现&#xff1a;状态驱动、灵活扩展的企业级解决方案 本文基于实际企业级审批系统源码&#xff0c;深入解析如何设计高扩展性、强一致性的审批流程引擎&#xff0c;涵盖状态机设计、多租户隔离、文件服务集成等核心实现。 1. 系统设计概览 审批系统的核心架…

汽车免拆诊断案例 | 2010款奥迪A4L车行驶中发动机偶尔自动熄火

故障现象 一辆2010款奥迪A4L车&#xff0c;搭载CDZ发动机 &#xff0c;累计行驶里程约为18.2万km。该车行驶中发动机偶尔自动熄火&#xff0c;有时熄火后能够立即重新起动着机&#xff0c;有时需要等待一会儿才能重新起动着机&#xff0c;故障频率较低。因该故障在其他维修厂陆…

Liam ERD:自动生成美观的交互式实体关系图

Liam ERD 是一个可以快速生成美观且具有交互性的数据库实体关系图&#xff08;ERD&#xff09;的工具&#xff0c;可以帮助用户实现复杂数据库结构的可视化。 Liam ERD 是一个免费开源的项目&#xff0c;代码托管在 GitHub&#xff1a; https://github.com/liam-hq/liam 功能…

网络协议序列化工具Protobuf

目录前言一、下载注意二、解压安装三、Protobuf的使用1、创建.proto文件2、利用protoc编译.proto文件前言 Protocol Buffers是Google的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法&#xff0c;它可⽤于&#xff08;数据&#xff09;通信协议、数据存储等。 Protoco…

从表单校验到API网关:全链路输入安全防护指南

从表单校验到 API 网关:全链路输入安全防护指南 在软件系统的安全防御体系中,输入安全是第一道防线,而这道防线的坚固程度直接决定了系统抵御外部攻击的能力。从用户在浏览器中填写表单的那一刻起,到数据经过 API 网关流转至后端服务,每一个环节都可能成为输入攻击的突破…

Flask vs Django:微框架与一站式对决

Flask 简介 1、简介 Flask诞生于2010年&#xff0c;是Armin ronacher用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架&#xff0c;又称之为微框架。 "微"的含义&#xff1a;Flask旨在保持核心简洁&#xff0c;本身相当于内核&#xff0c;其他功能需通过扩展…

真实业务场景:mysql慢查询优化(从17秒的查询优化到700毫秒)

慢查询业务场景:原先在我们系统中要统计一些人员的单位 部门信息的数据情况&#xff0c;比如总的男女人数&#xff0c;每个单位下的男女人数等等&#xff0c;然后原来的sql是这样写的 根据一个单位的id 然后对一张表做出多个子查询进行查询&#xff0c;这时候统计记录 由于加载…

远程影音访问:通过 cpolar 内网穿透服务使用 LibreTV

文章目录前言【视频教程】1.关于LibreTV2.docker部署LibreTV3.简单使用LibreTV4.安装cpolar内网穿透5.配置ward公网地址6.配置固定公网地址总结LibreTV 与 cpolar 的协同应用&#xff0c;为用户打造了一条通往高清观影自由的便捷之路。通过这一方案&#xff0c;用户不仅摆脱了商…

Apache ECharts 6 核心技术解密 – Vue3企业级可视化实战指南

简介 ECharts 是百度开源的一个使用 JavaScript 实现的开源可视化库&#xff0c;它能够生动、可交互地展示数据。在 Vue3 项目中集成 ECharts 可以让你的项目更加直观和动态地呈现数据信息。 核心优势 特性SVG渲染器Canvas渲染器缩放保真度★★★★★★★☆☆☆动态交互性能…

考公VS考研,拼哪个性价比高?

即将到来下半年&#xff0c;将迎来考公和考研是两个非常重要的考试&#xff0c;也是许多年轻人为之奋斗的目标。无论是获得一份稳定的“铁饭碗”&#xff0c;还是提升学历学位获得更高的竞争力&#xff0c;都是值得努力的方向。那么&#xff0c;考公vs考研&#xff0c;到底哪个…