05_STM32F4通用定时器详细讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32F4系列共有14个定时器,功能很强大。14个定时器分别为:
2个高级定时器:Timer1和Timer8
10个通用定时器:Timer2~timer5 和 timer9~timer14
2个基本定时器: timer6和timer7
本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。
Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是: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相关的寄存器及重要寄存器的简单介绍。
1 TIM3 控制寄存器 1 (TIM3_CR1)
SYSCLK(最高
AHB_Prescaler APBx_Prescaler
作用:1使能自动重载TIM3_ARR
2定时器的计数器递增或递减计数。
3 事件更新。
4 计数器使能
2 TIM
3 控制寄存器2 (TIM3_CR2)
3 TIM3 从模式控制寄存器(TIM3_SMCR)
4 TIM3 DMA/中断使能寄存器(TIM3_DIER)
作用:1:使能事件更新中断
2:使能捕获/比较中断
5 TIM3 状态寄存器(TIM3_SR)
1:事件更新中断标志
2:捕获/比较中断标志
6 TIM3 事件生成寄存器(TIM3_EGR)
7 TIM3 捕获/比较模式寄存器1 (TIM3_CCMR1)
1:输出比较模式
2:输出比较预装载使能,即使能后可以随时改变TIM3 捕获/比较寄存器1
(TIM3_CCR1)的值
3:捕获/比较选择
8 TIM3 捕获/比较模式寄存器2 (TIM3_CCMR2)
9 TIM3 捕获/比较使能寄存器(TIM3_CCER)
1:上升沿触发or下降沿触发
2:捕获/比较输出使能
10 TIM3 计数器(TIM3_CNT)
11 TIM3 预分频器(TIM3_PSC)
计数器时钟频率CK_CNT 等于f CK_PSC / (PSC[15:0] + 1)。
12 TIM3 自动重载寄存器(TIM3_ARR)
当自动重载值为空时,计数器不工作
难道说每次事件都必须装载重载值?
13 TIM3 捕获/比较寄存器1 (TIM3_CCR1)
输出时:CCR1是捕获/比较寄存器的预装载值,由TIM3_CCMR的OC1PE位使能。
输入时:CCR1为上一个输入捕获事件(IC1)发生时的计数器值。
14 TIM3 捕获/比较寄存器2 (TIM3_CCR2)
15 TIM3 捕获/比较寄存器3 (TIM3_CCR3)
16 TIM3 捕获/比较寄存器4 (TIM3_CCR4)
1 Timer3用来做定时中断
与之相关的时基单元寄存器有
10 TIM3 计数器(TIM3_CNT)
11 TIM3 预分频器(TIM3_PSC)
12 TIM3 自动重载寄存器(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 打开设备。
设备需配置后再打开。如果需要配置中断,那么则需要编写中断服务函数。
完整程序如下