三、STM32之定时器

       

一、基本内容介绍

         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的预分频器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_42475191

谢谢老板

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值