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
暂无评论