stm32定时器ppt

简介 相关

截图

stm32定时器ppt

简介

这是stm32定时器ppt,包括了STM32定时器概述,通用定时器TIMx相关寄存器,库函数,程序设计方法,系统时钟SysTick简介,SysTick应用实例等内容,欢迎点击下载。

stm32定时器ppt是由红软PPT免费下载网推荐的一款课件PPT类型的PowerPoint.

第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则挂在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位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值 (3) 4个独立通道: ①输入捕获;②输出比较;③PWM生成(边缘或中间对齐模式);④单脉冲模式输出 (4)使用外部信号控制定时器和定时器互连的同步电路。 (5)如下事件发生时产生中断/DMA: 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ; 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ; 输入捕获; 输出比较 ; 支持针对定位的增量(正交)编码器和霍尔传感器电路; 触发输入作为外部时钟或者按周期的电流管理。 6.2 通用定时器TIMx相关寄存器 CR1: 控制寄存器1 CR2: 控制寄存器2 SMCR:从模式控制寄存器 DIER: DMA/中断使能寄存器 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:计数器向上计数; 1:计数器向下计数。 CMS[1:0]:选择中央对齐模式 (Center-aligned mode selection) 参见“ STM32中文参考手册_V10.pdf ” 从模式控制寄存器(TIMx_SMCR) SMS[2:0]:从模式选择 (Slave mode selection) 000:关闭从模式 ,如果CEN=1,则预分频器直接由内部时钟驱动。 DMA/中断使能寄存器(TIMx_DIER) 位0 (UIE):允许更新中断 (Update interrupt enable) 。0:禁止更新中断; 1:允许更新中断。 状态寄存器(TIMx_SR) 位0 (UIF):更新中断标记 (Update 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 中指定的参数初始化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_TimeBaseInitStruct中指定的参数初始化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; /*TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值,0x0000和0xFFFF之间*/ 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 TIM_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_CenterAligned3 TIM 中央对齐模式3计数模式 例: TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0xF; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure); 定时时间的计算 定时时间 =(Period+1)*(Prescaler+1)/TIMxCLK 当Prescaler≠1时,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(TIM2, 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_ITConfig(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 = 0xFF00; TIM_PrescalerConfig(TIM2, TIMPrescaler, TIM_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, 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的中断待处理位 函数原形: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子函数 配置定时器子函数 延时子函数 中断服务子函数 声明函数: #include " stm32f10x.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(); /* 配置GPIO IO口初始化 */ TIM2_Configuration(); /* 配置TIM2 定时器 */ GPIOC->ODR = 0xffffffff; /* 全灭 */ while(1); } 使能外设时钟: void RCC_Configuration() {      { // 初始化系统时钟(略)    } //使能TIM2时钟和GPIOC时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); } //延时子函数: void Delay(vu32 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 = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } 配置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 = ENABLE; NVIC_Init(&NVIC_InitStructure); } 配置TIM2子函数: void TIM2_Configuration() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 35999; TIM_TimeBaseStructure.TIM_Prescaler = 1999; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); } 中断服务子函数: //中断服务程序一般写在stm32f10x_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位递减计数器。系统时基定时器设置初值并使能后,每经过一个系统时钟周期,计数器就减一,当计数器递减到0时,系统时基定时器自动重装载初值,并继续向下计数,同时内部的COUNTFLAG标志会置位,触发中断。 系统时基定时器功能简单,只能提供一个时基定时器,作为滴答时钟。在外部晶振8MHZ,通过PLL9倍频,系统时钟为72MHz,系统时钟定时器的递减频率可以设为9MHz(HCLK/8),在这个条件下,把系统定时器的初值设置为90000,就能够产生10ms的时间基值。如果开启中断,则产生10ms的中断。 时基定时器的中断并不需要清除中断位,系统会自动清除。 SysTick寄存器结构 typedef 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 :获取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_HCLK); 函数SysTick_SetReload 功能描述:设置SysTick重装载值 函数原形:void SysTick_SetReload(u32 Reload) Reload:重装载值,该参数取值必须在1和0x00FFFFFF之间 例: /* Set SysTick reload value to 0xFFFF */ SysTick_SetReload(0xFFFF); 函数SysTick_CounterCmd 功能描述:使能或者失能SysTick计数器 函数原形: void SysTick_CounterCmd(u32 SysTick_Counter) SysTick_Counter: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(ENABLE); 函数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 flag is set or not */ FlagStatus Status; Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT); if(Status == RESET) { ... … } else { ... … } 下面的程序段,让LED灯1s跳变一次。 void  SysTick_Configuration(void)   {      SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); SysTick->LOAD=900000;//100ms SysTick->CTRL=0x03; //开中断、启动计数   }     void SysTick_Handler(void)   {   num++;       if(num == 100)       {  num = 0; //计数器清0        LED (); //LED跳变函数,略。 }   }   练习题六 1.名为TIMx的定时器有()个, 2.定时器都是()位的。 3.通用定时器有()个:()、()、()和()。 4.TIM2-TIM7则挂在()总线上。最高工作频率是()MHz。 5.高级定时器有()个:()和()。挂在()总线上, 工作频率在()MHz下。 6.基本定时器有()个: ()和()。主要用于产生DAC触发信号,也可当做通用的16位时基计数器。 7.当预分频系数≠1时,TIMxCLK=()MHz;当预分频系数=1时,TIMxCLK=()MHz。 8. 定时时间等于()。 9. 系统嘀嗒时钟是()位的定时器。 10.系统嘀嗒时钟的时钟源有两个: ()和()。 想要定时1s,填写下面的程序段。 void TIM2_Configuration() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = (); TIM_TimeBaseStructure.TIM_Prescaler = 3600-1; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode(); TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, ()); //清除更新标志 TIM_ITConfig(TIM2, (), ()); //开中断 TIM_Cmd(TIM2, ()); //使能定时器2 } 谢谢!lXO红软基地

展开

同类推荐

热门PPT

相关PPT