优秀文章
https://blog.csdn.net/qq_38351824/article/details/82619734
一、STM32通用定时器(TIM2、TIM3、TIM4和TIM5共四个通用定时器,它们之间完全独立,不共享任何资源)
STM32F1系列的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动重装载计数器(CNT)构成。
STM32的通用计时器可用于:
测量输入信号的脉冲长度(输入捕获)
产生输出波形(输出比较和PWM)
使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。
通用定时器TIMx功能:
1、16位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
2、16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟的分频系数为1~65535之间的任意值(2^16=65535)。
3、每个通用定时器有4个独立通道(TIMx_CH1~4),可以用作
A、输入捕获
B、输出比较
C、PWM生成(边缘或中间对齐模式)
D、单脉冲模式输出
4、可使用外部信号(TIMx_ETR)控制定时器和定时器互连(用一个定时器控制另外一个定时器)的同步电路。
5、产生中断/DMA的触发来源:
A、更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者外部/内部触发)
B、触发事件(计数器启动、停止、初始化或者由内部/外部触发)
C、输入捕获
D、输出比较
E、支持针对定位的增量(正交)编码器和霍尔传感器电路
F、触发输入作为外部时钟或者按周期的电流管理
二、定时器的计数模式
1、向上计数模式:计数器从0计数到自动重装载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
2、向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
3、中央对齐模式(向上/向下计数):计数器从0开始计数到重装载值-1,产生一个计数器溢出事件,然后向下计数到1并产生一个计数器溢出事件,然后再从0开始重新计数。
三、定时器溢出时间
Tout(溢出时间)= (ARR+1)(PSC+1)/Tclk
ARR:自动重装值
PSC:预分频系数
Tclk:APB1倍频得到的(APB1的分频系数为1,Tclk等于APB1,不等于1时,则Tclk等于APB1的两倍)
四、软件设计
使用定时器中断3控制LED1和LED2闪烁
子函数
1 #include "timer.h" 2 #include "led.h" 3 4 void TIM3_Int_Init(u16 arr, u16 psc) //定时器3初始化, 5 { 6 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // 7 NVIC_InitTypeDef NVIC_Init_Structure; // 8 9 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 10 11 TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值 12 TIM_TimeBaseInitStructure.TIM_Prescaler = psc; //预分频系数 13 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 14 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 15 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); // 16 17 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //开启定时器中断,更新中断 18 19 20 //中断优先级 21 NVIC_Init_Structure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 22 NVIC_Init_Structure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 23 NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 24 NVIC_Init_Structure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 25 NVIC_Init(&NVIC_Init_Structure); //初始化NVIC寄存器NVIC 26 27 TIM_Cmd(TIM3, ENABLE); //使能定时器 28 } 29 30 void TIM3_IRQHandler(void) 31 { 32 if(TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET) //状态标志位获取 33 { 34 LED1 = !LED1; 35 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //状态标志位清除 36 } 37 }
主函数
1 #include "stm32f10x.h" 2 #include "led.h" 3 #include "delay.h" 4 #include "wdg.h" 5 #include "key.h" 6 #include "beep.h" 7 #include "timer.h" 8 9 int main(void) 10 { 11 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组,载misc文件中 12 delay_init(); //延时初始化 13 LED_Init(); //LED初始化 14 15 TIM3_Int_Init(4999, 7199); //定时器中断初始化 16 17 while(1) 18 { 19 LED2 = !LED2; 20 delay_ms(200); 21 } 22 23 }