Shenzhen yiroka doorbell manufacturer

 
主页 > 新闻中心 > 行业资讯 >

STM32通用按时器 TIM2的行使要领理会

来源:网络整理 |最近更新: 2021-03-03

STM32中一共有11个按时器,个中2个高级节制按时器,4个平凡按时器和2个根基按时器,以及2个看门狗按时器和1个体系嘀嗒按时器。(TIM1和TIM8是可以或许发生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输生发生;TIM2-TIM5是平凡按时器;TIM6和TIM7是根基按时器,那时钟由APB1输生发生)

本尝试要实现的成果是:用平凡按时器TIM2每一秒产生一次更新变乱,进入间断处事措施翻转LED1的状态。

准备常识:

① STM32通用按时器TIM2是16位自动重装载计数器。

② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次轮回。

必要弄清晰的两个题目:

1. 计数器的计数频率是什么?

这个题目涉及到RCC时钟部门,如下图所示:

STM32通用按时器TIM2的行使要领理会

按时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。

下面以按时器2~7的时钟声名这个倍频器的浸染:当APB1的预分频系数为1时,这个倍频器不起浸染,按时器的时钟频率便是APB1的频率;当APB1的预分频系数为其余数值(即预分频系数为2、4、8或16)时,这个倍频器起浸染,按时器的时钟频率便是APB1的频率两倍。

假定AHB=36MHz,由于APB1应承的最大频率为36MHz,以是APB1的预分频系数可以取恣意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起浸染);当预分频系数=2时,APB1=18MHz,在倍频器的浸染下,TIM2~7的时钟频率=36MHz。

有人会问,既然必要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?谜底是:APB1不单要为TIM2~7提供时钟,并且还要为其余外设提供时钟;配置这个倍频器可以在担保其余外设行使较低时钟频率时,TIM2~7仍能获得较高的时钟频率。

再举个例子:当AHB=72MHz时,APB1的预分频系数必需大于2,由于APB1的最大频率只能为36MHz。假如APB1的预分频系数=2,则由于这个倍频器,TIM2~7如故可以或许获得72MHz的时钟频率。可以或许行使更高的时钟频率,无疑进步了按时器的判别率,这也正是计划这个倍频器的初志。

留意:APB1和APB2上挂的外设如图所示:

STM32通用按时器TIM2的行使要领理会

按时器的计数频率有个公式:

TIMx_CLK = CK_INT / (TIM_Prescaler + 1)

个中:TIMx_CLK 按时器的计数频率

CK_INT 内部时钟源频率(APB1的倍频器送出时钟)

TIM_Prescaler 用户设定的预分频系数,取值范畴0~65535。

譬喻:RCC中AHB=72MHZ、APB1=36MHZ、APB2=72MHZ,则CK_INT=72MKZ。

2. 怎样计较按时时刻?

上述公式中TIM_Prescaler涉及到寄存器TIMx_PSC

假如TIM_Prescaler设为36000,由上面公式可知:

按时器的计数频率 TIMx_CLK = 72MKZ / 36000 = 2000HZ,则按时器的计数周期=1/2000HZ=0.5ms.

假如要按时1秒,则必要计数2000次,这也是自动重装载的值。又涉及到TIMx_ARR

只要上述两个题目搞清晰了,剩下的就是配置响应寄存器的对应位了。

LED硬件毗连如下图所示:高电平点亮LED。

STM32通用按时器TIM2的行使要领理会

第一步:设置体系时钟。见STM32F103x RCC寄存器设置

除此之外,还需将GPIO和TIM2外设时钟打开。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

留意:TIM2是挂在APB1上的,打开时钟时别写错了,挪用RCC_APB1PeriphClockCmd函数,而不是RCC_APB2PeriphClockCmd。

第二步:设置间断向量表。见stm32_exti(含NVIC)设置及库函数讲授

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

该函数完成两个成果

1. 抉择将措施下载到RAM中照旧FLASH中

2. 设置间断分组。(NVIC间断分组只能配置一次)

3. 选择间断通道号,抢占式优先级和相应优先级,使能间断

第三步:设置GPIO的模式。输入模式照旧输出模式。点亮LED已讲过,见STM32_GPIO设置及库函数讲授——LED赛马灯

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOC, &GPIO_InitStructure);

}

第四步:按时器设置,本章重点!

void TIM2_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//从头将Timer配置为缺省值

TIM_DeInit(TIM2);

//回收内部时钟给TIM2提供时钟源

TIM_InternalClockConfig(TIM2);

//预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz

TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;

//配置时钟支解

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

//配置计数器模式为向上计数模式

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

//配置计数溢出巨细,每计2000个数就发生一个更新变乱

TIM_TimeBaseStructure.TIM_Period = 2000;

//将设置应用到TIM2中

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

//破除溢出间断符号

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

//榨取ARR预装载缓冲器

TIM_ARRPreloadConfig(TIM2, DISABLE); //预装载寄存器的内容被当即传送到影子寄存器

//开启TIM2的间断

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

}

该函数完成两个成果

1. 设定预分频系数TIM_Prescaler = 36000 - 1

2. 设定自动重装载值TIM_Period = 2000

留意:上述只是设置好了TIM2,但还没有开启TIM2。

下面给出timer2.c的完备代码

#include “stm32f10x_lib.h”

void RCC_Configuration(void);

void NVIC_Configuration(void);

void GPIO_Configuration(void);

void TIM2_Configuration(void);

void Delay(vu32 nCount);

int main(void)

{

#ifdef DEBUG

debug();

#endif

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

TIM2_Configuration();

TIM_Cmd(TIM2, ENABLE); //开启按时器2

while (1)

{

}

}

void RCC_Configuration(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp()

if (HSEStartUpStatus == SUCCESS)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_2);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource() != 0x08) {}

}

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

}

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOC, &GPIO_InitStructure);

}

void TIM2_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//从头将Timer配置为缺省值

TIM_DeInit(TIM2);

//回收内部时钟给TIM2提供时钟源

TIM_InternalClockConfig(TIM2);

//预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz

TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;

//配置时钟支解

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

//配置计数器模式为向上计数模式

技能专区

STM32通用定时器
TIM2的利用方式分析

下载发热友APP

打造属于您的人脉电子圈

STM32通用定时器
TIM2的利用方式分析

存眷电子发热友微信

风趣有料的资讯及技醒目货

STM32通用定时器
TIM2的利用方式分析

存眷发热友教室

锁定最新课程勾当及技能直播

人保藏

分享:

评述

颁发

相干保举

STM32怎样将措施定位到指定的地点?

Copyright © 2020 乐投体育感应门铃有限公司 All rights reserved

XML地图