stm32之通用定时器

stm32之通用定时器

一、定时器有哪些

stm32F1xx 一共有八个定时器
两个高级定时器+四个通用定时器+两个基本定时器

定时器种类位数计数器模拟产生DMA请求捕获/比较通道互补输出特殊应用场景
高级定时器(TIM1,TIM8)16向上,向下,向上/向下可以4带死区控制器紧急刹车,可应用与PWM电机控制
通用定时器(TIM2~TIM5)16向上,向下,向上/向下可以4通用,定时计数,PWM输出,输入捕获,输出比较
基本定时器(TIM6,TIM7)16向上,向下,向上/向下可以0主要应用于驱动DAC (数模转换)

二、功能以及特点
1、通用定时器工作图
在这里插入图片描述

2、通用定时器工作过程
2.1、时钟部分
内部时钟APB1倍频器
注:除非APB1的分频系数位1,否则通用定时器的时钟为PAB的两倍
2.2、时基单元
预分频
计数器时钟
自动重装载数据

2.3、输入部分
输入引脚
边沿检测

2.4、输出部分
输出比较寄存器
周期——一个重装载值
占空比——比较值
3、定时器相关寄存器
①计数器寄存器CNT:当前计数值
②预分频寄存器:分频系数(PSC+1)/ N = CNT
③自动重装载寄存器:重装载值
④控住寄存器:控制计数方向

4、定时器库函数结构体

typedef struct
{ //初始化预分频值
  uint16_t TIM_Prescaler; 
 //设定自动重装载值
  uint16_t TIM_Period;
 //设定计数模式
  uint16_t TIM_CounterMode;
  //输入捕获使用
  uint16_t TIM_ClockDivision;
  //高级定时器使用
  uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef; 

主要用到以下几个参数:
①TIM_ClockDivision 输入捕获使用
②TIM_CounterMode 设定计数模式
③TIM_Prescaler 设定预分频值
④TIM_Period 设定自动重装载值
定时器库函数使用说明:

//定时器初始化
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//定时器使能
void TIM_Cmd(TIM_TypeDef* TIMx, 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);

5、定时器总线配置步骤:

①使能时钟(定时器时钟)
②配置定时器结构体(初始化、使能)
③开启定时器中断控制器(配置中断控制器的结构体、中断优先级组)
④中断服务函数

⑤定时器配置公式
Tout = [重装载值(ARR+1)*分频系数(PSC+1)/ Tclk ]
如1秒定时器:分频系数不变,重装载值乘分频系数是Tclk 1倍

Tout = 10000(9999+1)*7200(分频系数7199+1)/ 72M(72000 000)

6、以TIM2定时器为例配置代码:

void Tim2_Init(void)
{
    //定义定时器结构体
	 TIM_TimeBaseInitTypeDef tim_initSruct;
	 //定义中断控制器结构体
	 NVIC_InitTypeDef nvictim_Struct;
	
	//初始化中断控制器组2;  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    //使能定时器时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
    //配置结构体
	tim_initSruct.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
	tim_initSruct.TIM_CounterMode   = TIM_CounterMode_Up;//向上
	tim_initSruct.TIM_Period        = 10000 - 1 ;//计数值
	tim_initSruct.TIM_Prescaler     = 7200 - 1 ;//分频系数
    //开启TIM2中断控制器
    TIM_ITConfig(TIM2, TIM_IT_Update ,ENABLE);
	//初始化TIM2定时器的结构体
	TIM_TimeBaseInit(TIM2, &tim_initSruct);
	//使能定时器
	TIM_Cmd( TIM2, ENABLE);
	 
	nvictim_Struct.NVIC_IRQChannel     = TIM2_IRQn; 
	nvictim_Struct.NVIC_IRQChannelCmd  = ENABLE;
	nvictim_Struct.NVIC_IRQChannelPreemptionPriority = 1;
	nvictim_Struct.NVIC_IRQChannelSubPriority  = 1;
    //初始化中断控制器结构体
	NVIC_Init(&nvictim_Struct);
	
}

7、中断服务函数
以1秒闪烁

void TIM2_IRQHandler(void)
{   
   static uint16_t temp;
   if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
   {
		  if(temp++ %2 == 1)
		  {
			   GPIO_ResetBits(GPIOC, GPIO_Pin_13);	 
		  }else{			 
			   GPIO_SetBits(GPIOC, GPIO_Pin_13);
		  }			
	}
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值