STM32学习笔记——利用通用定时器TIM2进行精确延时
1.1概述
在作者所使用的stm32芯片上,共有TIM11个高级定时器以及TIM2、TIM3、TIM4共3个通用定时器。其中各通用定时器均由一个通过可编程预分频器驱动的16位自动装载计数器构成。适用于多种场合,包括测量输入信号的脉冲长度(输入采集)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。定时器是完全独立的,而且没有互相共享任何资源。它们可以一起同步操作。
1.2性能
通用TIMx定时器特性包括:
- 16位向上,向下,向上/向下自动装载计数器
- 16位可编程预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
- 4个独立通道:
─输入捕获
─输出比较
─PWM生成(边缘或中间对齐模式)
─单脉冲模式输出
- 使用外部信号控制定时器和定时器互连的同步电路
- 如下事件发生时产生中断/DMA:
─更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─触发事件(计数器启动,停止,初始化或者由内部/外部触发计数)
─输入捕获
─输出比较
1.3部分寄存器
由于通用定时器较为复杂,此处仅介绍如何利用TIM2进行精确延时。下面介绍是TIM中与本篇内容有关的寄存器。
1.3.1控制寄存器1(TIMx_CR1)
1.3.2DMA/中断使能寄存器(TIMx_DIER)
本篇中只关心其第6位及第0位
由于需要TIM在更新时产生中断,因此这两位都必须置1。
1.3.3预分频器(TIMx_PSC)
该分频器对时钟进行分频,并作为计数器时钟。
时钟来源有4种:
1)内部时钟(CK_INT)
2)外部时钟模式1:外部输入脚(TIx)
3)外部时钟模式2:外部触发输入(ETR)
4)内部触发输入(ITRx):使用A定时器作为B定时器的预分频器(A为B提供时钟)。
具体选择可以通过TIMx_SMCR寄存器相关位来设置。
1.3.4自动重装载寄存器(TIMx_ARR)
1.3.5状态寄存器(TIMx_SR)
本篇中主要关心该寄存器第0位
当产生溢出时,该标记位被置1,执行更新事件后由软件清0。
其他众多关于TIM寄存器可查阅《STM32F10x参考手册》
1.4基本计数中断过程
按照自己的理解,使能中断及定时器后,根据时钟来源以及预分频器(TIMx_PSC)所设置的分频数开始计数,当计数达到自动重装载寄存器(TIMx_ARR)中所存储的值时,状态寄存器(TIMx_SR)中对应的标志位(第0位)置1,通过软件检查该位则可以更新事件。
例如:系统中APB1(TIM2被挂在APB下)时钟频率为36MHz,设置TIMx_PSC分频为36000,则作为定时器TIM2的时钟频率为36000000/36000=1000Hz,即1秒内内部开关计数1000次,每次1ms,设置TIMx_ARR重装值为1000,则计数达1000次时,TIMx_SR中第0位标志位被置1,此时为延迟1秒。
2TIM固件库函数
2.1函数TIM_DeInit
函数名 | TIM_DeInit |
函数原型 | voidTIM_DeInit(TIM_TypeDef*TIMx) |
功能描述 | 将外设TIMx寄存器重设为缺省值 |
输入参数 | TIMx:x可以是2、3或4,来选择TIM外设 |
被调用函数 | RCC_APB1PeriphClockCmd(). |
例:重设TIM2
[cpp]view plaincopy
- TIM_DeInit(TIM2);
2.2函数TIM_TimeBaseInit
函数名 | TIM_TimeBaseInit |
函数原型 | voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct) |
功能描述 | 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 |
输入参数1 | TIMx:x可以是2、3或4,来选择TIM外设 |
输入参数2 | TIMTimeBase_InitStruct:指向结构TIM_TimeBaseInitTypeDef的指针,包含了TIMx时间基数单位的配置信息 参阅Section:TIM_TimeBaseInitTypeDef查阅更多该参数允许取值范围. |
TIM_TimeBaseInitTypeDefstructure
TIM_TimeBaseInitTypeDef定义于文件“stm32f10x_tim.h”:
[cpp]view plaincopy
- typedefstruct
- {
- u16TIM_Period;
- u16TIM_Prescaler;
- u8TIM_ClockDivision;
- u16TIM_CounterMode;
- }TIM_TimeBaseInitTypeDef;
TIM_Period
TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。
TIM_Prescaler
TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。
TIM_ClockDivision
TIM_ClockDivision设置了时钟分割。该参数取值见下表。
TIM_ClockDivision | 描述 |
TIM_CKD_div1 | TDTS=Tck_tim |
TIM_CKD_div2 | TDTS=2Tck_tim |
TIM_CKD_div4 | TDTS=4Tck_tim |
TIM_CounterMode
TIM_CounterMode选择了计数器模式。该参数取值见下表。
TIM_CounterMode | 描述 |
TIM_CounterMode_Up | TIM向上计数模式 |
TIM_CounterMode_Down | TIM向下计数模式 |
TIM_CounterMode_CenterAligned1 | TIM中央对齐模式1计数模式 |
TIM_CounterMode_Center |
STM32通用定时器TIM2精确延 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)