定时器的相关配置

STM32F1的通用定时器TIMx(TIM2-TIM5)具有如下功能:

(1)16位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

(2)16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的

分频系数为1~65535之间的任意数值。

(3)4个独立通道(TIMx_CH1-4),这些通道可以用来作为:

A.输入捕获

B.输出比较

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

D.单脉冲模式输出

(4)可使用外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。

(5)发生如下事件时产生中断/DMA请求:

A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

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

C.输入捕获

D.输出比较

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

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

通用定时器配置步骤

(1)使能定时器时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟

(2)初始化定时器参数,包括自动重装值,分频系数,计数方式等

VoidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*

TIM_TimeBaseInitStruct);//第一个参数选择那个定时器,第二个参数结构体地址

typedefstruct

{

uint16_tTIM_Prescaler;//定时器预分频器,设置值范围为1-65536

uint16_tTIM_CounterMode;//计数模式,向上UP,向下Down

uint32_tTIM_Period;//定时器周期,设置范围为0-65535

uint16_tTIM_ClockDivision;//时钟分频,设置定时器CK_INT频率与数字滤波采用时钟频率分频比

uint8_tTIM_RepetitionCounter;//重复计数器,用来控制PWM输出个数

}TIM_TimeBaseInitTypeDef;

TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;//定义结构体名

TIM_TimeBaseInitStructure.TIM_Period=1000;//自动装载值

TIM_TimeBaseInitStructure.TIM_Prescaler=35999;//分频系数

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//初始化完成

(3)设置定时器中断类型,并使能

VoidTIM_ITConfig(TIM_TypeDef*TIMx,uint16_tTIM_IT,FunctionalStateNewState);//第一个参数是选择那个定时器,第二个是设置中断类型(更新,捕获,触发),第三个是开启或关闭定时器中断

TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//开启定时器中断

(4)设置定时器中断优先级,使能定时器中断通道

在上一步我们已经使能了定时器的更新中断,只要使用到中断,就必需对

NVIC初始化,NVIC初始化库函数是NVIC_Init()

(5)开启定时器

前面只是对定时器进行参数的配置,只有开启定时器才能正常工作

voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState);//选择定时器,开启或关闭定时器功能。

(6)编写定时器中断服务

定时器中断服务函数名在STM32F1启动文件内就有

ITStatusTIM_GetITStatus(TIM_TypeDef*TIMx,uint16_tTIM_IT);//读取中断状态标志位

voidTIM_ClearITPendingBit(TIM_TypeDef*TIMx,uint16_tTIM_IT);//清除中断标志位函数。

TIM_GetFlagStatus(TIM_TypeDef*TIMx,uint16_tTIM_FLAG);和TIM_GetITStatus(TIM_TypeDef*TIMx,uint16_tTIM_IT);都是获取中断标志位的,区别在于第一个是直接获取,第二个是先判断是否开始定时器中断,然后在获取中断标志位。

定时器定时间计算公式如下:

T=((pre)*(psc+1)/Tclk)

Tclk是定时器的时钟频率值,72M。定时器产生中断的时间,单位是us。

通道函数

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

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

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

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

版权声明:本文为CSDN博主「Tryhardering」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Tryhardering/article/details/121866786

生成海报
点赞 0

Tryhardering

我还没有学会写个人说明!

暂无评论

相关推荐

X-bot

X-bot 前言 这个项目是我在稚辉君的视频里面看见的,是一个完全开源的项目,而且对他来说是一个比较简单的项目,但对于我这种没有什么DIY经验的同学来说,还是有点难的,不过

STM32基于HAL库的DS18B20实现

开发板:野火挑战者_V2 GPIO:PE2 创建工程 使能USART1 用来通过串口打印温度值 配置GPIO 代码编写 我们先打开 DS18B20 的手册 1、DS18B20 复位与存在脉冲 复位 /*