三种 STM32 定时器
-
高级定时器
TIM1 TIM8
用于 PWM 电机控制 -
通用定时器
TIM2 ~ TIM5
用于定时计数,PWM输出,输入捕获,输出比较 -
基本定时器
TIM6 TIM7
用于驱动 DAC
通用定时器的功能特点
- 位于低速的 APB1 总线上
- 支持向上,向下,中心对齐 三种计数模式,和自动重装载
- 每个定时器都有四个通道
1】输入捕获
2】输出比较
3】PWM 生成
4】单脉冲模式输出 - 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路
- 如下事件发生时产生中断/DMA:
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路
F.触发输入作为外部时钟或者按周期的电流管理
通用定时器工作过程
四个部分
- 选择时钟
- 时基电路
- 输入捕获
- 输出比较
定时器中断
定时器的时钟来源
- 内部时钟(CK_INT)——由APB1分频得来
- 外部时钟模式 1:外部输入脚(TIx)
- 外部时钟模式 2:外部触发输入(ETR)
- 内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)
定时器中断实现的步骤
- 使能定时器时钟
该定时器的时钟挂载在 APB1 总线下,所以通过总线下的时钟使能函数来使能
RCC_APB1PeriphClockCmd(); - 初始化定时器
TIM_TimeBaseInit(); - 开启定时器,并设置中断
TIM_ITConfig();
NVIC_Init((); - 使能定时器
TIM_Cmd(); - 编写中断服务函数
void TIM3_IRQHandler(void)
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
----------
TIM_ClearITPendingBit();//清除标志位
}
目的
使用定时器中断配置,每 500ms 中断一次,然后中断服务函数控制 LED 实现 LED 灯状态的取反——闪烁
Tout=(ARR+1)(PSC+1)/Tcllk
溢出时间=(要设置的参数)(预分频系数+1)/APB时钟经过倍频后的参数
ARR与PSC可以随便设置,但要满足上式
代码
timer.c
#include "timer.h"
#include "led.h"
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//在这里使用TIM3、
/*使能定时器时钟*/
TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStrue.TIM_Period=arr;
TIM_TimeBaseInitStrue.TIM_Prescaler=psc;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
/*初始化定时器*/
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
/*开启定时器中断*/
NVIC_InitStrue.NVIC_IRQChannel=TIM3_IRQn;//在这里使用TIM3的中断
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStrue.NVIC_IRQChannelSubPriority=3;
NVIC_Init(&NVIC_InitStrue);
/*设置了中断*/
TIM_Cmd(TIM3,ENABLE);
/*使能定时器*/
}
void TIM3_IRQHandler(void)//编写中断服务函数,中断服务函数与配置函数写在一起,不参与main中
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
LED1=!LED1;/**/
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM3_Int_Init(u16 arr,u16 psc);
#endif
main.c
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
TIM3_Int_Init(49999,7199);//500ms
while(1){
LED0=!LED0;
delay_ms(200);
}
}