初学stm32-通用定时器的使用

发布者:快乐心跳最新更新时间:2022-05-26 来源: eefocus关键字:初学  stm32  通用定时器 手机看文章 扫描二维码
随时随地手机看文章

通用定时器概述

STM32F4 的定时器有14个,其中TIM2-TIM5,TIM9~TIM14属于通用定时器,TIM1 和TIM8 则属于高级控制定时器,TIM6和TIM7是基本定时器。

在这里插入图片描述

TIM2 到 TIM5 主要特性

16 位(TIM3 和 TIM4)或 32 位(TIM2 和 TIM5) 递增、递减和递增/递减自动重载计数器。

16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改) ,分频系数介于 1 到 65536 之间。

多达 4 个独立通道,可用于:

— 输入捕获

— 输出比较

— PWM 生成(边沿和中心对齐模式)

— 单脉冲模式输出

使用外部信号控制定时器且可实现多个定时器互连的同步电路。

发生如下事件时生成中断/DMA 请求(6个独立的IRQ/DMA请求生成器):

— 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)

— 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)

— 输入捕获

— 输出比较

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

外部时钟触发输入或逐周期电流管理


TIM9 到 TIM14 主要特性

16 位自动重载递增计数器(属于中等容量器件)

16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数

介于 1 和 65536 之间

多达 2 个独立通道,可用于:

— 输入捕获

— 输出比较

— PWM 生成(边沿对齐模式)

— 单脉冲模式输出

使用外部信号控制定时器且可实现多个定时器互连的同步电路

发生如下事件时生成中断:

— 更新:计数器上溢、计数器初始化(通过软件或内部触发)

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

— 输入捕获

— 输出比较


定时器的时钟来源有 4 个:

1)内部时钟(CK_INT)

2)外部时钟模式 1:外部输入脚(TIx)

3)外部时钟模式 2:外部触发输入(ETR) ,仅适用于 TIM2、TIM3、TIM4

4)内部触发输入(ITRx) :使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟) 。

 

这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1(一般都不会是 1) ,否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx的时钟就等于 APB1 的时钟。这里还要注意的就是高级定时器以及 TIM9~TIM11 的时钟不是来自 APB1,而是来自 APB2 的。


定时器配置中断的步骤

使能定时器时钟。

RCC_APB1PeriphClockCmd();

初始化定时器,配置ARR,PSC。

TIM_TimeBaseInit();

定时器中断,配置NVIC。

NVIC_Init();

设置 TIM3_DIER 允许更新中断

TIM_ITConfig();

使能定时器。

TIM_Cmd();

编写中断服务函数。

TIMx_IRQHandler();

以TIM3为例,延时1秒点亮led灯

tim.c


#include "tim.h"


/*

定时器说明:

TIM3 -- APB1

定时器TIM3:84MHZ

16位定时器:值范围:0~65535


*/


void Tim3_Init(void)

{

TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;

NVIC_InitTypeDef  NVIC_InitStruct;


//1、使能定时器时钟。

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    

//8400分频 84000 000/8400 = 10000HZ  1S数10000个数

TIM_TimeBaseInitStruct.TIM_Prescaler    = 8400-1;   

TIM_TimeBaseInitStruct.TIM_Period = 10000-1;  //计10000个数 在10000HZ下,用时1s

TIM_TimeBaseInitStruct.TIM_CounterMode  = TIM_CounterMode_Up; //向上计数

TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; //分频因子

//2、初始化定时器,配置ARR,PSC。

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

//NVIC通道,在stm32f4xx.h可查看通道 (可变)

NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;  

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级

NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01; //响应优先级

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能

    //3、启定时器中断,配置NVIC。

NVIC_Init(&NVIC_InitStruct);

//4、设置 TIM3_DIER  允许更新中断

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

//5、使能定时器。

TIM_Cmd(TIM3, ENABLE);

}


//编写中断服务函数。这个函数不需要程序员在主函数调用,满足条件CPU自行调用的函数

void TIM3_IRQHandler(void)

{

if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断

{

/*处理的程序段*/

GPIO_ToggleBits(GPIOE, GPIO_Pin_14);

}

TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位

}

关键字:初学  stm32  通用定时器 引用地址:初学stm32-通用定时器的使用

上一篇:初学stm32-Systick滴答时钟定时
下一篇:初学stm32-PWM的应用-呼吸灯

推荐阅读最新更新时间:2024-11-13 10:33

意法半导体发布工业智能传感器评估套件
加快基于IO-Link 收发器和 STM32 MCU的应用设计 中国,2021年12月15日——以45.8mm x 8.3mm 的纤薄主板为亮点,意法半导体STEVAL-IOD04KT1工业传感器套件可简化开发者为独立于现场总线的点对点双向通信应用开发紧凑的IO-Link (IEC 61131-9) 传感器。 该主板集成了意法半导体的STM32G0微控制器和L6364W IO-Link收发器、IIS2MDC高精度3轴数字输出磁力计,以及内嵌机器学习核心的ISM330DHCX iNEMO惯性测量模块。得益于L6364W的2.5mm x 2.5mm 的CSP19微型芯片级封装和 STM32G0的2.3mm x 2.5mm
[传感器]
意法半导体发布工业智能传感器评估套件
你ADC采集的数据都准确吗?
1写在前面 ADC:Analog Digital Converter,指模数转换,也就是(电压)模拟量转换成数字量。 大多数MCU中都集成了ADC模块,同时ADC也是在产品开发中使用率较高的一个模块,相信大部分人都使用过ADC这个功能。 在STM32中内置最多四个高级12位ADC控制器(ADC1、2、3、4)。当然,ADC控制器数量多少取决于STM32型号,还有部分STM32具有16位采样的ADC(如STM32F373)。他们提供自校准功能,用于提高环境条件变化时的ADC精度。 我们平时在使用ADC中要求不是很高,可能就没有在于ADC转换的值是否精确。但是,有些特定场合就需要更精确的转换值,那么我们就需要对ADC做更
[单片机]
你ADC采集的数据都准确吗?
STM32单片机对正交编码器的驱动
STM32正交编码器驱动,引入(突变)带进位的位置环和速度环 #include “stm32f10x.h” #include “stm32f10x_encoder.h” #include “sys.h” #include “usart.h” #include “led.h” #define COUNTER_RESET(u16)0 #define ICx_FILTER(u8) 0 // 6《-》 670nsec #define TIMx_PRE_EMPTION_PRIORITY 1 #define TIMx_SUB_PRIORITY 0 //#define MAX_COUNT ENCODER_TIM_PERIOD/2 volat
[单片机]
STM32 使用Cube的心得(一)
最近做了一个项目使用Cube自动生成代码,然后利用HAL库进行编程。芯片为STM32F103C8T6进行编程。 I2C读写 1. 地址需要自己左移1位(stm32中需要,但是NXP中不需要),LPC系列的以前用过一款,函数内部自动左移了。 2. SCL,SDA通信时需要接上拉电阻,然后接到高电平,否则通信不同,显示I2C处于busy状态。 FLASH读写 1. 注意Flash保存数据的起始地址,还要注意内存大小,是1KB,还是2KB,还是128KB 2. Flash擦除时有方法,不要统一擦除,比如:128KB,可以分为128个1KB的区域,每次写1KB,写满后再统一擦除。而且写入Flash时第一个地址要写入
[单片机]
<font color='red'>STM32</font> 使用Cube的心得(一)
stm32异步串口通讯配置过程
| 串口是一种全双工通讯方式 单工 数据传输只支持数据在一个方向上传输 半双工 允许数据在两个方向上传输,在同一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信 全双工 允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力 异步串口常见连接方式 相同端口数据传输 不同端口数据传输 这里必须保证通讯两端数据共地,此外还需注意不同端口间的电平转换,如TTL、232. | 异步通讯时序图 这里以8位字长为例,进行数据传输时,接收方首先捕捉数据起始位- -由高电平到低电平的数据跳变,低电平会保持一个数据周期(空闲时,数据线保持高电平)
[单片机]
STM32USART串口调节与printf重定义
首先,printf重定义后可以直接使用printf函数从串口发送数据 在usart.c中添加代码: #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, F
[单片机]
基于STM32的智能笔筒设计
简介:本文基于STM32F103VET6单片机设计了智能笔筒。该设计充分利用此单片机的FSMC,SDIO和SPI等片上资源,结合MP3解码技术、图像解码技术和蓝牙通信技术等多种技术实现笔筒的智能化。此笔筒不仅满足常用的功能,且还可在液晶屏上查看电子相册、听MP3歌曲、玩小游戏。此外还可显示周围环境的温湿度和光线强度,具有节假日和预设提醒等功能。 1 智能笔筒硬件设计 1.1 硬件总体结构 系统硬件以STM32F103VET6为核心,硬件框图如图1所示。 传感器感知模块包括温湿度传感器、光敏传感器和人体感应传感器,用于获取当前环境的参数;声光模块包括7色LED灯和蜂鸣器,使笔筒更加绚丽并具有提示功能;以触摸屏为
[单片机]
基于<font color='red'>STM32</font>的智能笔筒设计
STM32定时器的输入滤波机制
STM32的定时器输入通道都有一个滤波单元,分别位于每个输入通路上(下图中的黄色框)和外部触发输入通路上(下图中的兰色框),它们的作用是滤除输入信号上的高频干扰。 具体操作原理如下: 在TIMx_CR1中的CKD 可以由用户设置对输入信号的采样频率基准,有三种选择: 1)采样频率基准fDTS=定时器输入频率fCK_INT 2)采样频率基准fDTS=定时器输入频率fCK_INT/2 3)采样频率基准fDTS=定时器输入频率fCK_INT/4 然后使用上述频率作为基准对输入信号进行采样,当连续采样到N次个有效电平时,认为一次有效的输入电平。 实际的采样频率和采样次数可以由用户程序根据需要选择;外部触发输入通道的滤波参数
[模拟电子]
<font color='red'>STM32</font><font color='red'>定时器</font>的输入滤波机制

推荐帖子

TI AM5728 开发板 USB接口测试
AM5728开发板JN-mini5728的USB为叠层接口,上边为USB2.0接口,下边为USB3.0接口。下面我们开始进行USB接口测试:1USB热插拔测试将2.0U盘连接到USB2.0接口,热插拔信息如下图1所示:图1将3.0U盘连接到USB3.0接口,热插拔信息如下图2所示:图2从图1可知USB3-1成功挂载了一个3.91GB的2.0U盘,挂载名是sda,该U盘只有一个分区sda4
匠牛社区 工控电子
MSP430G2553的程序怎么改到F149上使用
求助:MSP430G2553的程序怎么改到F149上使用,我有G2553的MLX90614测温程序,现在想移植到F149上实验,可以怎么修改?MSP430G2553的程序怎么改到F149上使用2553的程序应该不是你写的,否则应该很清楚该怎么改吧。 对啊。。那您知道这些寄存器怎么转换吗或者在网上怎么搜这种?
zzyy0929 微控制器 MCU
去上海华为搞手机终端驱动开发怎么样?
本人工作四年,前面三年多时间一直从事家电领域变频空调的产品开发,但受困于行业发展实在内耗太大,利润太薄,且开发周期过长,成就感不足.于是开始找工作,得到华为口头offer.但一等就是2月,才发正式offer.但这时已经在另外一家比较大的公司从事消费电子产品开发,因刚成立,产品方案基本都由方案公司做,核心算法一类基本接触不到.但主管从国外过来,能带来一些比较新的开发理念.公司有一些ARM9开发板,也可以自己研究捣鼓一些linux,图形界面,驱动之类.但个人搞感觉进展较慢.如果去华为,可能会在驱
popcoffee 嵌入式系统
谁有E金币 25个 可以通过支付宝转账
想买个U盘,差25枚金币,谁有可以通过支付宝转账25元谁有E金币25个可以通过支付宝转账我有,请管理帮忙处理下哥们,留个QQ吧,我的121732421,联系我,然后我请管理帮忙转E金币给你已经帮忙处理!maylove发表于2015-9-2514:49已经帮忙处理! 谢了
908508455a 淘e淘
自制小台钻
又是废物利用自制小台钻原帖由ZYXWVU于2010-2-2111:09发表又是废物利用37313 想知道钻头和电机轴之间用什么固定的?...................................
ZYXWVU 创意市集
低功耗控制
各位兄弟们,我有个问题想问一下,我用的是STM32F103芯片,用了一个系统中断函数SysTick_ITConfig(ENABLE);在中断函数中voidSysTick_Handler(void){__WFI();}用了__WFI();这句话,编译后下到板子里面,但是当我第二次烧录的时候,提示JTAG不能使用了,好像JTAG不能下程序了,连续两块板子都是这样,请问__WFI();这个函数跟JTAG有什么关系,为什么我在系统中断里面加了这句话后,重新烧录程序时不
pl89721 stm32/stm8
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved