STM32定时器解析_第1页
STM32定时器解析_第2页
STM32定时器解析_第3页
STM32定时器解析_第4页
STM32定时器解析_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6讲 STM32定时器,实验六 定时器实验,实验目的:掌握定时器的工作原理与编程实现定时的方法。 实验内容: 1)利用TIM2定时500ms,LED1、LED3同时亮灭一次;TIM3定时2 s,LED2、LED4亮灭一次。 2)利用SysTick实现定时1秒钟,LED切换一次亮灭状态。,主要内容,6.1 STM32定时器概述 6.2 通用定时器TIMx相关寄存器 6.3 库函数 6.4 程序设计方法 6.5 系统时钟SysTick简介 6.6 SysTick应用实例,6.1 STM32定时器概述,名为TIMx的定时器有8个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在

2、APB1总线上。 APB2可以工作在72MHz下,而APB1最大是36MHz。 定时器都是16位的。 通用定时器4个:TIM2、TIM3、TIM4和TIM5。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。 高级定时器2个:TIM1和TIM8。比通用定时器功能更强大,适用于更多场合。 基本定时器2个:TIM6和TIM7。主要用于产生DAC触发信号,也可当做通用的16位时基计数器。,通用TIMX 定时器主要功能,(1)16位向上、向下、向上/向下自动装载计数器 (2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为165536之间的任

3、意数值 (3) 4个独立通道: 输入捕获;输出比较;PWM生成(边缘或中间对齐模式);单脉冲模式输出 (4)使用外部信号控制定时器和定时器互连的同步电路。 (5)如下事件发生时产生中断/DMA: 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ; 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ; 输入捕获; 输出比较 ; 支持针对定位的增量(正交)编码器和霍尔传感器电路; 触发输入作为外部时钟或者按周期的电流管理。,6.2 通用定时器TIMX相关寄存器,CR1: 控制寄存器1 CR2: 控制寄存器2 SMCR:从模式控制寄存器 DIER: DMA/中

4、断使能寄存器 SR: 状态寄存器 EGR: 事件产生寄存器 CCMR1:捕获/比较模式寄存器1 CCMR2:捕获/比较模式寄存器2 CCER: 捕获/比较使能寄存器,CNT : 计数器寄存器 PSC : 预分频寄存器 APR : 自动重装载寄存器 CCR1 :捕获/比较寄存器1 CCR2 :捕获/比较寄存器2 CCR3 :捕获/比较寄存器3 CCR4 :捕获/比较寄存器4 DCR : DMA控制寄存器 DMAR :连续模式的DMA地址寄存器,控制寄存器1(TIMX_CR1),CEN:使能计数器。 0:禁止计数器; 1:使能计数器。 DIR:方向 (Direction) 。0:计数器向上计数;

5、1:计数器向下计数。 CMS1:0:选择中央对齐模式 (Center-aligned mode selection) 参见“ STM32中文参考手册_V10.pdf ”,从模式控制寄存器(TIMX_SMCR),SMS2:0:从模式选择 (Slave mode selection) 000:关闭从模式 ,如果CEN=1,则预分频器直接由内部时钟驱动。,DMA/中断使能寄存器(TIMX_DIER),位0 (UIE):允许更新中断 (Update interrupt enable) 。0:禁止更新中断; 1:允许更新中断。,状态寄存器(TIMX_SR),位0 (UIF):更新中断标记 (Update

6、 interrupt flag) 当产生更新事件时该位由硬件置1。它由软件清0。 0:无更新事件产生; 1:更新中断等待响应。 当寄存器被更新时该位由硬件置1: 若TIMx_CR1寄存器的UDIS=0、URS=0,当TIMx_EGR寄存器的UG=1时产生更新事件(软件对计数器CNT重新初始化); 若TIMx_CR1寄存器的UDIS=0、URS=0,当计数器CNT被触发事件重初始化时产生更新事件。(参考同步控制寄存器的说明),6.3 库函数,TIM_DeInit :将外设TIMx寄存器重设为缺省值。 TIM_TimeBaseInit :根据TIM_TimeBaseInitStruct 中指定的参

7、数初始化TIMx的时间基数单位。 TIM_TimeBaseStructInit :把TIM_TimeBaseInitStruct 中的每一个参数按缺省值填入。 TIM_Cmd :使能或者失能TIMx外设。 TIM _ITConfig :使能或者失能指定的TIM中断。 TIM_PrescalerConfig :设置TIMx预分频 TIM_GetFlagStatus :检查指定的TIM标志位设置与否 TIM_ClearFlag :清除TIMx的待处理标志位 TIM_ClearITPendingBit :清除TIMx的中断待处理位,函数TIM_TIMEBASEINIT,功能:根据TIM_TimeBa

8、seInitStruct中指定的参数初始化TIMx的时间基数单位。 函数原形: void TIM_TimeBaseInit ( TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) 其中,TIMx:x可以是2,3或者4,来选择TIM外设。 TIMTimeBase_InitStruct:指向结构TIM_TimeBaseInitTypeDef的指针,包含了TIMx时间基数单位的配置信息。,TIM_TIMEBASEINITTYPEDEF STRUCTURE,typedef struct u16 TIM_Period;

9、/*TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值,0 x0000和0 xFFFF之间*/ u16 TIM_Prescaler; /* TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值*/ u8 TIM_ClockDivision; /* TIM_ClockDivision设置了时钟分割*/ u16 TIM_CounterMode; /* TIM_CounterMode选择了计数器模式*/ TIM_TimeBaseInitTypeDef ;,TIM_ClockDivision 描述 TIM_CKD_DIV1 TDTS = Tck_tim TI

10、M_CKD_DIV2 TDTS = 2Tck_tim TIM_CKD_DIV4 TDTS = 4Tck_tim TDTS: 数字滤波器使用的采样频率 Tck_tim:定时器时钟频率 暂时不涉及数字滤波器,这项先不考虑,TIM_CounterMode 描述 TIM_CounterMode_Up TIM向上计数模式 TIM_CounterMode_Down TIM 向下计数模式 TIM_CounterMode_CenterAligned1 TIM 中央对齐模式1计数模式 TIM_CounterMode_CenterAligned2 TIM 中央对齐模式2计数模式 TIM_CounterMode_C

11、enterAligned3 TIM 中央对齐模式3计数模式,例: TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0 xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0 xF; TIM_TimeBaseStructure.TIM_ClockDivision = 0 x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, ,

12、定时时间的计算,定时时间 =(Period+1)*(Prescaler+1)/TIMxCLK 当Prescaler1时,TIMxCLK=72MHz 当Prescaler=1时,TIMxCLK=36MHz,函数TIM_CMD,功能描述:使能或者失能TIMx外设 函数原形:void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) TIMx:x可以是2,3或者4,来选择TIM外设 NewState: 外设TIMx的新状态,ENABLE或者DISABLE 例: /* Enables the TIM2 counter */ TIM_Cmd(TIM

13、2, ENABLE);,函数TIM _ITCONFIG,功能描述:使能或者失能指定的TIM中断 函数原形:void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState NewState) TIMx:x可以是2,3或者4,来选择TIM外设 TIM_IT:待使能或者失能的TIM中断源 NewState:TIMx中断的新状态。ENABLE或者DISABLE,TIM_IT值:,例: /* Enables the TIM2 Capture Compare channel 1 Interrupt source */ TIM_ITConfi

14、g(TIM2, TIM_IT_CC1, ENABLE );,函数TIM_PRESCALERCONFIG,功能描述:设置TIMx预分频 函数原形:void TIM_PrescalerConfig (TIM_TypeDef* TIMx, u16 Prescaler,u16 TIM_PSCReloadMode) TIM_PSCReloadMode:预分频重载模式 例:/* Configures the TIM2 new Prescaler value */ u16 TIMPrescaler = 0 xFF00; TIM_PrescalerConfig(TIM2, TIMPrescaler, TIM_

15、PSCReloadMode_Immediate);,函数TIM_GETFLAGSTATUS,功能描述:检查指定的TIM标志位设置与否 函数原形: FlagStatus TIM_GetFlagStatus (TIM_TypeDef* TIMx, u16 TIM_FLAG) TIMx:x可以是2,3或者4,来选择TIM外设 TIM_FLAG:待检查的TIM标志位 返回值:TIM_FLAG的新状态(SET或者RESET) 例:/* Check if the TIM2 Capture Compare 1 flag is set or reset */ if(TIM_GetFlagStatus(TIM2

16、, TIM_FLAG_CC1) = SET) ,TIM_FLAG值:,函数TIM_CLEARFLAG,功能描述:清除TIMx的待处理标志位 函数原形: void TIM_ClearFlag(TIM_TypeDef* TIMx, u32 TIM_FLAG) TIMx:x可以是2,3或者4,来选择TIM外设 TIM_FLAG:待清除的TIM标志位 例: /* Clear the TIM2 Capture Compare 1 flag */ TIM_ClearFlag(TIM2, TIM_FLAG_CC1);,函数TIM_CLEARITPENDINGBIT,功能描述:清除TIMx的中断待处理位 函数

17、原形:void TIM_ClearITPendingBit (TIM_TypeDef* TIMx, u16 TIM_IT) TIMx:x可以是2,3或者4,来选择TIM外设。 TIM_IT:待检查的TIM中断待处理位。 例: /* Clear the TIM2 Capture Compare 1 interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);,6.4 程序设计方法,包含头文件 声明函数 声明变量 主函数 函数调用 主循环程序段 配置系统时钟、使能外设时钟子函数 配置GPIO子函数 配置NVIC子函数 配置定时器

18、子函数 延时子函数 中断服务子函数,声明函数:,#include stm32f10 x.h void Delay(vu32 nCount); void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void); void TIM2_Configuration(void);,主函数:,int main() RCC_Configuration(); /* 配置系统时钟 */ NVIC_Configuration(); /* 配置NVIC */ GPIO_Configuration();

19、 /* 配置GPIO IO口初始化 */ TIM2_Configuration(); /* 配置TIM2 定时器 */ GPIOC-ODR = 0 xffffffff; /* 全灭 */ while(1); ,使能外设时钟:,void RCC_Configuration() / 初始化系统时钟(略) /使能TIM2时钟和GPIOC时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /延时子函数: void Delay(vu32

20、nCount) for (; nCount != 0; nCount-); ,配置GPIO的子函数:,void GPIO_Configuration() /*GPIO初始化,PC输出 ,PA输入*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = G

21、PIO_Mode_Out_PP; GPIO_Init(GPIOC, ,配置NVIC:,void NVIC_Configuration() NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd

22、 = ENABLE; NVIC_Init( ,配置TIM2子函数:,void TIM2_Configuration() TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 35999; TIM_TimeBaseStructure.TIM_Prescaler = 1999; TIM_TimeBaseStructure.TIM_ClockDivision = 0 x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

23、 TIM_TimeBaseInit(TIM2, ,中断服务子函数:,/中断服务程序一般写在stm32f10 x_it.c文件中。 void TIM2_IRQHandler(void) if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)=0) GPIO_SetBits(GPIOC,GPIO_Pin_3); else GPIO_ResetBits(GPIOC,GPIO_Pin_3); TIM_ClearFlag(TIM2, TIM_FLAG_Update); ,6.5 系统时基定时器SYSTICK简介,stm32-M3有一个系统时基定时器(又叫嘀嗒时钟),其为一个

24、24位递减计数器。系统时基定时器设置初值并使能后,每经过一个系统时钟周期,计数器就减一,当计数器递减到0时,系统时基定时器自动重装载初值,并继续向下计数,同时内部的COUNTFLAG标志会置位,触发中断。 系统时基定时器功能简单,只能提供一个时基定时器,作为滴答时钟。在外部晶振8MHZ,通过PLL9倍频,系统时钟为72MHz,系统时钟定时器的递减频率可以设为9MHz(HCLK/8),在这个条件下,把系统定时器的初值设置为90000,就能够产生10ms的时间基值。如果开启中断,则产生10ms的中断。 时基定时器的中断并不需要清除中断位,系统会自动清除。,SYSTICK寄存器结构,typedef

25、struct vu32 CTRL; /SysTick控制和状态寄存器 vu32 LOAD; /SysTick重装载值寄存器 vu32 VAL; /SysTick当前值寄存器 vuc32 CALIB; /SysTick校准值寄存器 SysTick_TypeDef;,SYSTICK库函数,SysTick_CLKSourceConfig:设置SysTick时钟源 SysTick_SetReload:设置SysTick重装载值 SysTick_CounterCmd:使能或者失能SysTick计数器 SysTick_ITConfig:使能或者失能SysTick中断 SysTick_GetCounter

26、:获取SysTick计数器的值 SysTick_GetFlagStatus:检查指定的SysTick标志位设置与否,函数SYSTICK_CLKSOURCECONFIG,功能描述:设置SysTick时钟源 函数原形:void SysTick_CLKSourceConfig(u32 SysTick_CLKSource) SysTick_CLKSource:SysTick时钟源 SysTick_CLKSource值: 例:/* AHB clock selected as SysTick clock source */ SysTick_CLKSourceConfig(SysTick_CLKSource

27、_HCLK);,函数SYSTICK_SETRELOAD,功能描述:设置SysTick重装载值 函数原形:void SysTick_SetReload(u32 Reload) Reload:重装载值,该参数取值必须在1和0 x00FFFFFF之间 例: /* Set SysTick reload value to 0 xFFFF */ SysTick_SetReload(0 xFFFF);,函数SYSTICK_COUNTERCMD,功能描述:使能或者失能SysTick计数器 函数原形: void SysTick_CounterCmd(u32 SysTick_Counter) SysTick_Co

28、unter:SysTick计数器新状态 SysTick_Counter值: 例:/* Enable SysTick counter */ SysTick_CounterCmd(SysTick_Counter_Enable);,函数SYSTICK_ITCONFIG,功能描述:使能或者失能SysTick中断 函数原形:void SysTick_ITConfig(FunctionalState NewState) NewState:SysTick中断的新状态,取ENABLE或者DISABLE 例: /* Enable SysTick interrupt */ SysTick_ITConfig(ENA

29、BLE);,函数SYSTICK_GETCOUNTER,功能描述:获取SysTick计数器的值 函数原形:u32 SysTick_GetCounter(void) 返回值:SysTick计数器的值 例:/* Get SysTick current counter value */ u32 SysTickCurrentCounterValue; SysTickCurrentCounterValue = SysTick_GetCounter();,函数SYSTICK_GETFLAGSTATUS,功能描述:检查指定的SysTick标志位设置与否 函数原形: FlagStatus SysTick_GetFlagStatus(u8 SysTick_FLAG) SysTick_FLAG:待检查的SysTic标志位 SysTick_FLAG值:,例:/* Test if the Count fla

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论