您的位置 首页 电路

STM32定时器原理与运用

STM32定时器原理与使用-定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 CK_CNT 的驱动下,计一个数的时间则是 CK_CLK 的倒数,等于:1/(TIMxCLK/(PSC+1)),产生一次中断的时间则等于:1/(CK_CLK * ARR)。如果在中断服务程序里面设置一个变量 time,用来记录中断的次数,那么就可以计算出我们需要的定时时间等于: 1/CK_CLK *(ARR+1)*time。

一、守时器分类

STM32F1 系列中,除了互联型的产品,共有 8 个守时器,分为根本守时器,通用守时器和高档守时器。根本守时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的守时器,只能守时,没有外部 IO。通用守时器 TIM2/3/4/5 是一个 16 位的能够向上/下计数的守时器,能够守时,能够输出比较,能够输入捕捉,每个守时器有四个外部 IO。高档守时器 TIM1/8是一个 16 位的能够向上/下计数的守时器,能够守时,能够输出比较,能够输入捕捉,还能够有三相电机互补输出信号,每个守时器有 8 个外部 IO。

根本守时器的中心是时基,通用计时器和高档守时器也有。

1、时钟

守时器时钟TIMxCLK,即内部时钟CK_INT,经APB1预分频器后分频供给,假如APB1 预分频系数等于 1,则频率不变,不然频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以守时器时钟 TIMxCLK=36*2=72M 。

2、计数器时钟

守时器时钟通过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,能够对守时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。

详细核算方法为:CK_CNT=TIMxCLK/(PSC+1)。

3.计数器

计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数抵达主动重装载寄存器的时分发生更新事情,并清零从头开端计数。

4、主动重装载寄存器

主动重装载寄存器 ARR 是一个 16 位的寄存器,这儿边装着计数器能计数的最大数值。当计数到这个值的时分,假如使能了中止的话,守时器就发生溢出中止。

5. 守时时刻的核算

守时器的守时时刻等于计数器的中止周期乘以中止的次数。计数器在 CK_CNT 的驱动下,计一个数的时刻则是 CK_CLK 的倒数,等于:1/(TIMxCLK/(PSC+1)),发生一次中止的时刻则等于:1/(CK_CLK * ARR)。假如在中止服务程序里边设置一个变量 time,用来记载中止的次数,那么就能够核算出咱们需求的守时时刻等于: 1/CK_CLK *(ARR+1)*time。

1.界说

设置等待时刻,抵达等待时刻之后履行指定的硬件操作。

守时器最根本的功用便是守时,比如说守时发送串口数据,守时收集AD数据,也能够发生PWM方波等,守时器发生PWM操控电机状况是工业操控的一般。

2、STM32F4xx系列的芯片:2个高档操控守时器(TIM1和TIM8)、10个通用守时器(10TIM2-TIM5,TIM9-TIM14)、2个根本守时器(TIM6和TIM7)、2个看门狗守时器

详细可参阅中文参阅手册了解其特性及原理

STM32守时器原理与运用

3、守时器计数形式:

通用守时器能够向上计数、向下计数、向上向下双向计数形式。

①向上计数形式:计数器从0计数到主动加载值(TIMx_ARR),然后从头从0开端计数而且发生一个计数器溢出事情。

②向下计数形式:计数器从主动装入的值(TIMx_ARR)开端向下计数到0,然后从主动装入的值从头开端,并发生一个计数器向下溢出事情。

③中心对齐形式(向上/向下计数):计数器从0开端计数到主动装入的值-1,发生一个计数器溢出事情,然后向下计数到1而且发生一个计数器溢出事情;然后再从0开端从头计数。

如图:

STM32守时器原理与运用

4、通用守时器作业原理:

● 计数器寄存器 (TIMx_CNT)

● 预分频器寄存器 (TIMx_PSC)

● 主动重载寄存器 (TIMx_ARR)

假如是向上增加形式,计数器(CNT)从0加到主动重载值(ARR),预分频器(PSC)减一次。

时刻核算方法:

假定频率为:42M*2 == 84M == 84000000 == 1s //42依据守时器时钟数可知 而且一般都是*2

守时器守时1s发生中止:

ARR = 84000; // 1ms

PSC = 1000; // 1000*1ms == 1s

STM32守时器原理与运用

如图:可知根本守时器的时钟是42M,那么对应*2便是84M=84000000=1S(ARR*PSC)

高档的既是84*2=96M=96000000=1S

———————————————————————————————————————————————————–

5、守时器中止完成过程

//5.1、能守时器时钟。

RCC_APB1PeriphClockCmd();

//5.2、初始化守时器,装备ARR,PSC。(声明结构体)

TIM_TimeBaseInit();

typedef struct

{

uint16_t TIM_Prescaler;

uint16_t TIM_CounterMode;

uint16_t TIM_Period;

uint16_t TIM_ClockDivision;

uint8_t TIM_RepetitionCounter;

} TIM_TimeBaseInitTypeDef;

//5.3、启守时器中止,装备NVIC(声明结构体)

NVIC_Init();

进行NVIC中止装备

NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //守时器 3 中止

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级 1

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //呼应优先级 3

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);// ④初始化 NVIC

TIM_Cmd(TIM3,ENABLE); //⑤使能守时器 3

//5.4、设置 TIM3_DIER 答应更新中止

TIM_ITConfig();

//5.5、使能守时器。

TIM_Cmd();

//5.6、编写中止服务函数。

TIMx_IRQHandler();

//守时器 3 中止服务函数

void TIM3_IRQHandler(void)

{

if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中止

{

/*处理的程序段*/

}

TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //铲除中止标志位

}

TIM3_Int_Init(5000-1,8400-1); //守时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数5000次为500ms

void TIM3_Int_Init(u16 arr,u16 psc)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟

TIM_TimeBaseInitStructure.TIM_Period = arr; //主动重装载值

TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //守时器分频

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数形式

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //答应守时器3更新中止

TIM_Cmd(TIM3,ENABLE); //使能守时器3

NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //守时器3中止

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

//守时器3中止服务函数

void TIM3_IRQHandler(void)

{

if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中止

{

LED1=!LED1;//DS1翻转

}

TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //铲除中止标志位

}

守时器初始化结构体详解

在规范库函数头文件stm32f10x_tim.h中对守时器外设建立了四个初始化结构体,根本守时器只用到其间一个即TIM_TimeBaseInitTypeDef,其他三个在高档守时器章节解说。

typedef struct {

uint16_t TIM_Prescaler; // 预分频器

uint16_t TIM_CounterMode; // 计数形式

uint32_t TIM_Period; // 守时器周期

uint16_t TIM_ClockDivision; // 时钟分频

uint8_t TIM_RepetitionCounter; // 重复核算器

} TIM_TimeBaseInitTypeDef;1234567

(1) TIM_Prescaler:守时器预分频器设置,时钟源经该预分频器才是守时器时钟,它设定TIMx_PSC 寄存器的值。可设置规模为 0 至 65535,完成 1至 65536 分频。

(2) TIM_CounterMode:守时器计数方法,但是在为向上计数、向下计数以及三种中心对齐形式。根本守时器只能是向上计数,即 TIMx_CNT只能从 0开端递加,而且无需初始化。

(3) TIM_Period:守时器周期,实践便是设定主动重载寄存器的值,在事情生成时更新到影子寄存器。可设置规模为 0至 65535。

(4) TIM_ClockDivision:时钟分频,设置守时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比,根本守时器没有此功用,不必设置。

(5) TIM_RepetitionCounter:重复计数器,归于高档操控寄存器专用寄存器位,使用它能够十分简单操控输出 PWM 的个数。这儿不必设置。

尽管守时器根本初始化结构体有 5 个成员,但关于根本守时器只需设置其间两个就能够。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/345049.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部