STM32精英版(正点原子STM32F103ZET6开发板)学习篇11——定时器(中断、PWM、输入捕获)

2023-05-16

三种STM32定时器区别

在这里插入图片描述

通用定时器功能特点描述

  1、STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括:
  2、位于低速的APB1总线上(APB1)
  3、16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
  4、16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
   5、4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
    ①输入捕获
     ②输出比较
     ③PWM 生成(边缘或中间对齐模式)
     ④单脉冲模式输出
  6、可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
  7、如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器):
    ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    ③输入捕获
    ④输出比较
    ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路
    ⑥触发输入作为外部时钟或者按周期的电流管理
  8、STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。
  9、使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

计数器模式

  通用定时器可以向上计数、向下计数、向上向下双向计数模式。
  ①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
  ②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
  ③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

向下计数模式(时钟分频因子=1)

在这里插入图片描述

向上计数模式(时钟分频因子=1)

在这里插入图片描述

中央对齐计数模式(时钟分频因子=1 ARR=6)

在这里插入图片描述

通用定时器工作过程:

在这里插入图片描述
分成四个部分:时钟选择、实际电路、输入捕获、输出比较。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

定时器中断实验

时钟选择(默认①,可在寄存器SMCR中配置)

  计数器时钟可以由下列时钟源提供:
    ①内部时钟(CK_INT)
    ②外部时钟模式1:外部输入脚(TIx)
    ③外部时钟模式2:外部触发输入(ETR)
    ④内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

内部时钟选择

在这里插入图片描述
在这里插入图片描述
  默认调用SystemInit函数情况下:
    SYSCLK=72M
    AHB时钟=72M
    APB1时钟=36M
  所以APB1的分频系数=AHB/APB1时钟=2
  所以,通用定时器时钟CK_INT=2*36M=72M

定时器中断实验相关寄存器

计数器当前值寄存器CNT

在这里插入图片描述

预分频寄存器TIMx_PSC

在这里插入图片描述

自动重装载寄存器(TIMx_ARR)

在这里插入图片描述

控制寄存器1(TIMx_CR1)

在这里插入图片描述

DMA中断使能寄存器(TIMx_DIER)

在这里插入图片描述

常用库函数

相关函数是在FWLIB文件夹下的stm32f10x_tim.c中可以找到。

定时器参数初始化:

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

在这里插入图片描述
在这里插入图片描述

定时器使能函数:

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

定时器中断使能函数:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

状态标志位获取和清除

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

定时器中断实验实现步骤

使能定时器时钟
    RCC_APB1PeriphClockCmd();
初始化定时器,配置ARR(自动装载值),PSC(预分频系数)
    TIM_TimeBaseInit();
开启定时器中断,配置NVIC
    void TIM_ITConfig();
    NVIC_Init();(中断优先级设置【之前还要main.c设置中断优先级分组】)
使能定时器
    TIM_Cmd();
编写中断服务函数
    TIMx_IRQHandler();

通用定时器PWM概述

STM32 PWM工作过程


在这里插入图片描述
ARR:决定周期,CRRx:决定占空比
在这里插入图片描述
在这里插入图片描述

PWM模式1 & PWM模式2

寄存器TIMx_CCMR1的OC1M[2:0]位来分析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自动重载的预装载寄存器

在这里插入图片描述
在这里插入图片描述

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

简单的说,ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。

PWM输出库函数

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);


在这里插入图片描述

设置比较值函数:

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);

使能输出比较预装载:

void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

使能自动重装载的预装载寄存器允许位:

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

PWM输出配置步骤:

  ① 使能定时器3和相关IO口时钟
    使能定时器3时钟:RCC_APB1PeriphClockCmd();
    使能GPIOB时钟:RCC_APB2PeriphClockCmd();
  ② 初始化IO口为复用功能输出。函数:GPIO_Init();
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  ③这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  ④ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
  ⑤ 初始化输出比较参数:TIM_OC2Init();
  ⑥ 使能预装载寄存器
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  ⑦ 使能定时器。TIM_Cmd();
  ⑧ 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

STM32 输入捕获工作过程(通道1为例)

在这里插入图片描述
  一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

步骤1:设置输入捕获滤波器(通道1为例)

在这里插入图片描述在这里插入图片描述

步骤2:设置输入捕获极性(通道1为例)

在这里插入图片描述
在这里插入图片描述

步骤3:设置输入捕获映射通道(通道1为例)

在这里插入图片描述
在这里插入图片描述

步骤4:设置输入捕获分频器(通道1为例)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

步骤5:捕获到有效信号可以开启中断

在这里插入图片描述

最后:看看定时器通道对应引脚TIM5为例

在这里插入图片描述

输入捕获关键库函数

输入捕获通道初始化函数:

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

在这里插入图片描述
在这里插入图片描述

通道极性设置独立函数:

void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

获取通道捕获值

uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx)

输入捕获的一般配置步骤:

  ① 初始化定时器和通道对应IO的时钟
  ② 初始化IO口,模式为输入:GPIO_Init();
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
  ③初始化定时器ARR,PSC
    TIM_TimeBaseInit();
  ④初始化输入捕获通道
    TIM_ICInit();
  ⑤如果要开启捕获中断
    TIM_ITConfig();
    NVIC_Init();
  ⑥使能定时器:TIM_Cmd();
  ⑦编写中断服务函数:TIMx_IRQHandler();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32精英版(正点原子STM32F103ZET6开发板)学习篇11——定时器(中断、PWM、输入捕获) 的相关文章

  • c++数组初始化

    静态数组 span class token keyword int span dp span class token punctuation span span class token number 1 span span class to
  • PID控制器主要针对线性系统还是非线性系统

    PID控制器可以用于线性系统和部分非线性系统 PID控制器最初是为线性系统设计的 xff0c 可以有效控制具有稳定线性动态特性的系统 xff0c 如电机控制 温度控制等 但是 xff0c PID控制器也可以应用于一些非线性系统中 xff0c
  • VNC远程登录服务器(Ubuntu14.04)

    使用服务器多用户登录 xff0c 使用命令行没有图像化界面 xff0c 难免有所不便 xff0c 就来搞下VNC远程登录Ubuntu14 04 1 使用命令行登录进行vnc安装 sudo apt get install vnc4server
  • 树莓派4b使用记录(一):在树莓派4b使用python-opencv打开海康工业相机及遇到的问题与解决方法

    树莓派4b使用记录 一 xff1a 在树莓派4b使用python opencv打开海康工业相机及遇到的问题与解决方法 一 在树莓派上安装海康工业机器人的MVS软件 xff08 Linux版本 xff09 海康工业机器人软件下载地址 xff1
  • react 的性能优化

    一 性能永远是第一需求 xff0c 时刻考虑性能问题 如何避免应用出现性能问题 xff0c 如下所示 xff1a 了解常见的性能问题场景时刻注意代码的潜在性能问题注重可重构的代码了解如何使用工具定位性能问题 二 网络性能优化 xff0c 自
  • STM32应用之485通信

    我们先看看普通的收发电路 普通的485电路 xff0c 除了 用RXD连接485芯片的RO引脚 用TXD连接485芯片的DI引脚 xff0c 还会用一个单片机的普通IO引脚连接到RE DE引脚上 当单片机要发送数据的时候 xff0c 控制P
  • AD铺铜技巧总结

    原文链接 xff1a https blog csdn net snaking616 article details 78643046 目录 1 铜皮操作分类 2 铺铜技巧 2 1 过孔处理 2 1 1 过孔与绿油 2 1 2 过孔的十字连接
  • 十大滤波算法

    一 限幅滤波 1 xff09 方法 根据经验判断两次采样允许的最大偏差值A 每次采新值时判断 xff1a 若本次值与上次值之差 lt 61 A xff0c 则本次有效 xff1b 若本次值与上次值之差 gt A xff0c 本次无效 xff
  • 初识GD32

    什么是GD32 xff1f GD32是由北京兆易创新开发的国产32位MCU xff0c 基于Arm Cortex M3 M23 M4内核的32位通用微控制器 目前已经推出GD32F1xx xff0c GD32F2xx xff0c GD32F
  • GD32 新建工程模板

    本文以GD32F450MCU为核心 xff0c 新建工程模板 准备资料 xff1a GD32F4xx Firmware Library V2 1 0 GD32F4Pack包 http www gd32mcu com cn download
  • VirtualBox安装Win10系统

    VirtualBox是一款免费的开源虚拟机 xff0c 它简单易用 xff0c 支持Windows Linux和Mac系统等 最重要的是安装简单 xff0c 操作方便 装机准备 Windows10镜像文件 VirtualBox软件 Virt
  • SMT32H7系列DMA和DMAMUX的一点理解

    DMA和DMAMUX DMA xff1a 无CPU参与下直接进行数据搬运的控制器 DMAMUX xff1a 建立DMA请求和DMA通道之间的映射关系 xff0c 类似于路由的功能 无DMAMUX的MCU xff0c DMA请求和DMA通道的
  • 基于STM32的UVC设备枚举解析

  • ERP实施顾问与项目经理的区别

    来到青岛出差 xff0c 再次见识了青岛的美丽 xff0c 特别是在这个秋天时节 xff0c 天气宜人 xff0c 看来是一个放假休养的好时节 可惜过来是工作的 xff0c 不然倒是可以在这里呆上一段时间 xff0c 在海边看看书 xff0
  • RTOS随笔之FreeRTOS

    RTOS几点思考 为什么使用RTOS 1 先考虑OS有什么特点 xff1f 2 再考虑什么情况下使用OS FreeRTOS调试技巧任务管理1 任务调度流程2 任务栈大小 xff0c 栈溢出检测3 中断管理4 内存管理 FreeRTOS AP
  • RTOS随笔之FreeRTOS启动与同步方法

    RTOS启动与同步机制 RTOS启动任务切换场景任务同步机制队列信号量事件组任务通知 任务延时 RTOS启动 FreeRTOS在任务创建完成后调用函数vTaskStartScheduler 启动任务调度器 vTaskStartSchedul
  • LTspice仿真命令

    交流扫描 命令 ac lt oct dec lin gt 参数1 xff1a 扫描方式 xff08 oct 八倍频 dec 十倍频 lin 线性扫描 xff09 参数2 xff1a 扫描数 参数3 xff1a 起始频率 参数4 xff1a
  • LTspice创建模型

    由于刚开始接触电路 xff0c 对于电路调试并不是很清楚 xff0c 只是通过查找资料 xff0c 帮助文档学习 xff0c 其中深奥的东西目前并不是很理解 xff0c 只是相互学习 LTspice创建模型的方法 xff1a 通过导入PSP
  • 2020/1/27 在setInterval中使用setTimeout时遇到的问题

    这几天在做一个简单的随机抽取姓名的一个抽人的小页面 顺顺利利的 今天回来再打开看自己作死一样的一直找看看有没有什么bug 没想到真的找到一个 花了一个多小时才解决 其实最后才觉得是个比较细节的问题 是关于setInterval和setTim
  • MYSQL1251报错用cmd也报错,Navicat for Mysql报错1251连接不成功Mysql

    第一步 xff1a 打开Command Line Client 看清楚不是cmd xff0c 是在mysql的目录下 xff0c 你会发现有2个一模一样其实哪个都行 第二步 xff1a 输入mysql密码回车 就是安装mysql时设置的密码

随机推荐