一、基本内容介绍
8个定时器:有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和 TIME7 等基本定时器。
STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器 (CNT)构成。
计数模式:
向上计数:
向下计数 :
中央对齐模式(向上向下计数):
二、代码段分析
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
定时器初始化结构体:TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
中断向量分组寄存器:NVIC_InitTypeDef NVIC_InitStructure;
时钟使能 :RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
设置在下一个更新事件装入活动的自动重装载寄存器周期的值:
TIM_TimeBaseStructure.TIM_Period = arr;
设置用来作为TIMx时钟频率除数的预分频值:
TIM_TimeBaseStructure.TIM_Prescaler =psc;
设置时钟分割:TDTS = Tck_tim:
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM向上计数模式:
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
根据指定的参数初始化TIMx的时间基数单位
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
说明:时基单元包含计数器寄存器(TIMx_CNT)、预分频寄存器(TIMx_PSC)、自动装载寄存器(TIMx_ARR)
预分频寄存器:
预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。它是基于一个(在TIMx_PSC 寄存器中的)16位寄存器控制的16位计数器。这个控制寄存器带有缓冲器,它能够在工作时被改 变。新的预分频器参数在下一次更新事件到来时被采用。
自动装载寄存器:
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在 TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在 每次的更新事件UEV时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当 TIMx_CR1寄存器中的UDIS位等于’0’时,产生更新事件。更新事件也可以由软件产生。
计数器寄存器:
向上计数模式:在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始 计数并且产生一个计数器溢出事件。每次计数器溢出时可以产生更新事件,在TIMx_EGR寄存器中(通过软件方式或者使用从模式控 制器)设置UG位也同样可以产生一个更新事件。设置TIMx_CR1寄存器中的UDIS位,可以禁止更新事件;这样可以避免在向预装载寄存器中写 入新值时更新影子寄存器。在UDIS位被清’0’之前,将不产生更新事件。但是在应该产生更新事 件时,计数器仍会被清’0’,同时预分频器的计数也被请0(但预分频系数不变)。此外,如果设置 了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV,但硬件 不设置UIF标志(即不产生中断或DMA请求);这是为了避免在捕获模式下清除计数器时,同时产 生更新和捕获中断。 当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位 (TIMx_SR寄存器中的UIF位)。
预分频器的缓冲区被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。
自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)。
向下计数器:在向下模式中,计 装入的值重新开始并且产生一个计数器向下溢出事件。 每次计数器溢出时可以产生更新事件,在TIMx_EGR寄存 制器)设置UG位,也同样可以产生一个更新事件。 设置TIMx_CR1寄存器的UDIS位可以禁止UEV事件 时更新影子寄存器。因此UDIS位被清为’0’之前不会产生更新事件。然而,计数器仍会从当前自 动加载值重新开始计数,同时预分频器的计数器重新从0开始(但预分频系数不变)。 此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求) ,设置UG位将产生 件UEV但不设置UIF标志(因此不产生中断和DMA请求),这是为了避免在发生捕获事件并清除计 数器时,同时产生更新和捕获中断。 当发生更新事件时,所有的寄存器都被 存器中的UIF位)也被设置。
● 预分频器的缓存器被置入
● 当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。 数器重载入之前被更新,因此下一个周期将是预期的值。
中央对齐模式(向上/向下计数):在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器 溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。 在这个模式,不能写入TIMx_CR1中的DIR方向位。它由硬件更新并指示当前的计数方向。 可以在每次计数上溢和每次计数下溢时产生更新事件;也可以通过(软件或者使用从模式控制器) 设置TIMx_EGR寄存器中的UG位产生更新事件。然后,计数器重新从0开始计数,预分频器也 重新从0开始计数。 设置TIMx_CR1寄存器中的UDIS位可以禁止UEV事件。这样可以避免在向预装载寄存器中写入 新值时更新影子寄存器。因此UDIS位被清为’0’之前不会产生更新事件。然而,计数器仍会根据 当前自动重加载的值,继续向上或向下计数。 此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求) ,设置UG位将产生一个更新事 件UEV但不设置UIF标志(因此不产生中断和DMA请求),这是为了避免在发生捕获事件并清除计 数器时,同时产生更新和捕获中断。 当发生更新事件时,所有的寄存器都被更新,并且(根据URS位的设置)更新标志位(TIMx_SR寄 存器中的UIF位)也被设置。
● 预分频器的缓存器被加载为预装载(TIMx_PSC寄存器)的值。
● 当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。注:如果因为计数 器溢出而产生更新,自动重装载将在计数器重载入之前被更新,因此下一个周期将是预期 的值(计数器被装载为新的值)。
时钟选择:
计数器时钟可由下列时钟源提供:
● 内部时钟(CK_INT)
● 外部时钟模式1:外部输入脚(TIx)
● 外部时钟模式2:外部触发输入(ETR)
● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时 器Timer1而作为另一个定时器Timer2的预分频器。