05STM32F4通用定时器详细讲解.docx

上传人:b****6 文档编号:6131507 上传时间:2023-01-04 格式:DOCX 页数:6 大小:45.20KB
下载 相关 举报
05STM32F4通用定时器详细讲解.docx_第1页
第1页 / 共6页
05STM32F4通用定时器详细讲解.docx_第2页
第2页 / 共6页
05STM32F4通用定时器详细讲解.docx_第3页
第3页 / 共6页
05STM32F4通用定时器详细讲解.docx_第4页
第4页 / 共6页
05STM32F4通用定时器详细讲解.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

05STM32F4通用定时器详细讲解.docx

《05STM32F4通用定时器详细讲解.docx》由会员分享,可在线阅读,更多相关《05STM32F4通用定时器详细讲解.docx(6页珍藏版)》请在冰豆网上搜索。

05STM32F4通用定时器详细讲解.docx

05STM32F4通用定时器详细讲解

STM32F4系列共有14个定时器,功能很强大。

14个定时器分别为:

2个高级定时器:

Timer1和Timer8

10个通用定时器:

Timer2~timer5和timer9~timer14

2个基本定时器:

timer6和timer7

本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM功能做彻底的探讨。

Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6PA7PB0PB1

主要功能是:

1输入捕获——测量脉冲长度。

2输出波形——PWM输出和单脉冲输出。

Timer3有4个时钟源:

1:

内部时钟(CK_INT),来自RCC的TIMxCLK

2:

外部时钟模式1:

外部输入TI1FP1与TI2FP2

3:

外部时钟模式2:

外部触发输入TIMx_ETR,仅适用于TIM2、TIM3、TIM4,TIM3,对应着PD2引脚

4:

内部触发输入:

一个定时器触发另一个定时器。

时钟源可以通过TIMx_SMCR相关位进行设置。

这里我们使用内部时钟。

定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK,故当APBx_Prescaler不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK,定时器时钟等于HCLK。

例如:

我们一般配置系统时钟SYSCLK为168MHz,内部高速时钟AHB=168Mhz,APB1欲分频为4,(因为APB1最高时钟为42Mhz),那么挂在APB1总线上的timer3时钟为84Mhz。

《STM32F4xx中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个,

以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。

1TIM3控制寄存器1(TIM3_CR1)

作用:

1使能自动重载TIM3_ARR

2定时器的计数器递增或递减计数。

3事件更新。

4计数器使能

2TIM3控制寄存器2(TIM3_CR2)

3TIM3从模式控制寄存器(TIM3_SMCR)

4TIM3DMA/中断使能寄存器(TIM3_DIER)

作用:

1:

使能事件更新中断

2:

使能捕获/比较中断

5TIM3状态寄存器(TIM3_SR)

1:

事件更新中断标志

2:

捕获/比较中断标志

6TIM3事件生成寄存器(TIM3_EGR)

7TIM3捕获/比较模式寄存器1(TIM3_CCMR1)

1:

输出比较模式

2:

输出比较预装载使能,即使能后可以随时改变TIM3捕获/比较寄存器1(TIM3_CCR1)的值

3:

捕获/比较选择

8TIM3捕获/比较模式寄存器2(TIM3_CCMR2)

9TIM3捕获/比较使能寄存器(TIM3_CCER)

1:

上升沿触发or下降沿触发

2:

捕获/比较输出使能

10TIM3计数器(TIM3_CNT)

11TIM3预分频器(TIM3_PSC)

计数器时钟频率CK_CNT等于fCK_PSC/(PSC[15:

0]+1)。

12TIM3自动重载寄存器(TIM3_ARR)

当自动重载值为空时,计数器不工作

难道说每次事件都必须装载重载值?

13TIM3捕获/比较寄存器1(TIM3_CCR1)

输出时:

CCR1是捕获/比较寄存器的预装载值,由TIM3_CCMR的OC1PE位使能。

输入时:

CCR1为上一个输入捕获事件(IC1)发生时的计数器值。

14TIM3捕获/比较寄存器2(TIM3_CCR2)

15TIM3捕获/比较寄存器3(TIM3_CCR3)

16TIM3捕获/比较寄存器4(TIM3_CCR4)

 

1Timer3用来做定时中断

与之相关的时基单元寄存器有

10TIM3计数器(TIM3_CNT)

11TIM3预分频器(TIM3_PSC)

12TIM3自动重载寄存器(TIM3_ARR)

原理:

这里以向上计数为例,即计数器TIM3_CNT向上计数,当达到TIM3_ARR所设定的值时,归零重新计数,若使能了更新中断,则在TIM3_CNT归零时,进入中断。

进入中断的时间为(TIM3_ARR+1)个计时器周期

而计时器单元时钟是由定时器时钟分频得到,每(CK_PSC+1)个定时器周期计数一次。

定时器时钟上文已经讲了,由于Timer3挂在APB1总线上

故Timer3进入中断的周期为(CK_PSC+1)*(TIM3_ARR+1)/84000000秒

频率为84000000/[(CK_PSC+1)*(TIM3_ARR+1)]Hz

利用官方库函数实现每500ms进入中断,改变LED灯的电平,程序如下

1打开时钟,Timer3挂在APB1上,所以命令开启时钟。

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

2时钟Timer3的配置。

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

3使能中断

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许定时器3更新中断。

4打开Timer3。

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

5配置中断。

6中断服务函数编写。

故可见STM32的初始化函数都离不开以下几步

1打开设备时钟。

2配置参数。

3打开设备。

设备需配置后再打开。

如果需要配置中断,那么则需要编写中断服务函数。

完整程序如下

voidTIM3_Int_Init(u16arr,u16psc)

{

TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;

NVIC_InitTypeDefNVIC_InitStructure;

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

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

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

TIM_TimeBaseInitStructure.TIM_Period=arr;//自动装载值

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);//使能定时器

NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//定时器中断

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

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

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

/Timer3中断服务函数

voidTIM3_IRQHandler(void)

{

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

{

GPIO_ToggleBits(GPIO_LED,DS1_PIN);//LED灯电平翻转

}

TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位

}

然后main()函数中TIM3_Int_Init(5000-1,8400-1);即可

可以计算进入中断的频率为2Hz即LED灯每500ms亮一次,LED周期为1Hz。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1