目录
一. 定时器概述
1. STM32的定时器
2. STM32定时器特性表
3. 基本、通用、高级定时器的功能区别
4. 定时器定时原理
5. STM32定时器计数模式及溢出条件
6. 定时器溢出事件的计算
二. 定时器认识——基本定时器(TIM6 / TIM7)
1. 介绍
2. 主要特性
3. 结构框图
4. 相关寄存器介绍
三. 定时器中断的配置
1. 配置步骤
2. 代码参考
有软件、硬件两种方式实现定时(延时)功能,纯软件为CPU死等的方式,这种方式延时不精准;另一种则使用精准的时基,通过硬件的方式实现。
STM32F1系列中,除了互联型的产品,共有8个定时器,分为基本定时器、通用定时器和高级定时器。
(1)基本定时器:是16位的只能向上计数的定时器,只能定时,没有外部IO,常用作时基,即定时功能。
(2)通用定时器:可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有4个外部IO,可用于输入捕获/输出比较,也可用作时基。
(3)高级定时器:可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8个外部IO,还具备带死区控制的互补信号输出、刹车输入等功能(可用于电机控制、数字电源设计等)
定时器核心就是计数器
(分频系数 = PSC + 1)
(1)递增计数模式(向上计数模式)
计数器从‘0’计数到自动加载值(TIMx_ARR计数器的内容),然后重新从‘0’开始计数并且产生一个计数器溢出事件。
(2)递减计数模式(向下计数模式)
计数器从自动装入的值(TIMX_ARR计数器的值)开始向下计数到‘0’,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
(3)中心对齐模式(中央对齐模式)
计数器从‘0’开始计数到‘自动加载的值(TIMX_ARR寄存器)-1’,产生一个计数器溢出事件,然后向下计数到‘1’并且产生一个计数器下溢事件;然后再从‘0’开始重新计数。
补:(1)Tout:定时器溢出时间
(2)Ft:定时器的时钟源频率
(3)ARR:自动重装载寄存器的值
(4)PSC:预分频器寄存器的值
基本定时器的核心是时基,不仅基本定时器有,通用定时器和高级定时器也有。每个定时器各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。这2个定时器是互相独立的,不共享任何资源。
①16位递增计数器(计数值:0~65535)
②16位预分频器,用于对输入的时钟按系数为1~65536之间的任意数值
③可用于触发DAC
④在更新事件(计数器溢出)时,会产生中断/DMA请求
①时钟源
定时器时钟 TIMx_CLK,即内部时钟CK_INT,经APB1预分频器分频提供,如果 APB1预分频系数等于1,则频率不变,否则频率乘以2。定时器的时钟来源有四个:1)内部时钟(CK_INT) 2)外部时钟模式1:外部输入脚(TIx) 3)外部时钟模式2:外部触发输入(ETR) 4)内部触发输入(ITRx):使用 A定时器作为B定时器的预分频器(A为B提供时钟)
②计数器时钟
定时器时钟经过PSC预分频器之后,即CK_CNT,用来驱动计数器计数。PSC是一个16位的预分频器,可以对定时器时钟TIMx_CLK的1~65536之间的任何一个数进行分频。具体计算方式为:CK_CNT=TIMx_CLK/(PSC+1)。
③计数器
计数器 CNT 是一个16位的计数器,只能往上计数,最大计数值为65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。
④自动重装载寄存器
自动重装载寄存器TIMx_ ARR是一个16位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能中断的话,定时器就产生溢出中断。
该寄存器在物理上实际对应着2个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的奇存器被叫做影子寄存器。事实上真正起作用的是影子寄存器。具体的,即根据在TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器(APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时2者是连通的;APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器),并当TIMX_CR1寄存器中的UDIS位等于’0’时,产生更新事件。同理,在UDIS位被清‘0’之前,将不产生更新事件。但是在应该产生更新事件时,计数器仍会被清’0‘,同时预分频器的计数也被请’0‘(但预分频系数不变)。更新事件也可以由软件产生。
① 控制寄存器 1(TIMx_CR1)
位7(ARPE):自动重装载预装载使能,配置TIMx_ARR寄存器有缓冲(减少操作ARR寄存器所产生的误差)
位0(CEN):计数器使能(默认关闭)
② DMA/中断使能寄存器(TIMx_DIER)
溢出时
位8(UDE):更新DMA请求使能(默认关闭)
位0(UIE):更新中断使能
③状态寄存器(TIMx_SR)
位0(UIF):更新中断标志,用于判断是否发生了更新中断,由硬件置1,软件清零。
④计数器(TIMx_CNT)
计数器实时数值,可用于设置计时器初始值,范围:0~65535
⑤预分频器(TIMx_PSC)
用于设置预分频系数,即可以将计数器的时钟频率按1到65536之间的任意值分频(实际预分频系数等于PSC + 1),它是基于一个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。这个控制寄存器带有缓冲器,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采用。
⑥自动重装载寄存器(TIMX_ARR)
用于设置自动重装载值,范围:0~65535
(1)配置定时器基础工作参数:HAL_TIM_Base_Init()
(2)定时器基础MSP初始化:HAL_TIM_Base_MspInit() (配置NVIC、CLOCK等)
(3)使能更新中断并启动计数器:HAL_TIM_Base_Start_IT()
(4)设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
(5)编写中断服务函数:TIMx_IRQHandler()等 -> HAL_TIM_IRQHandler()(对相应的中断标志位进行详细判断,判断确定中断来源后,会自动清掉该中断标志位,同时调用不同类型中断的回调函数)
(6)编写定时器更新中断回调函数:HAL_TIM_PeriodElapsedCallback()(在每次中断后,判断 TIM6 的中断类型,如果中断类型正确,则执行代码)