STM32高级定时器使用方法及注意事项文档良心出品_第1页
STM32高级定时器使用方法及注意事项文档良心出品_第2页
STM32高级定时器使用方法及注意事项文档良心出品_第3页
STM32高级定时器使用方法及注意事项文档良心出品_第4页
全文预览已结束

下载本文档

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

文档简介

By深圳市威睿晶科Felix主要特性:高级定时器与通用定时器的主要差别如下红色区域•16位向上、向下、向上/下自动装载计数器•16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为 1〜65535之间的任意数值•多达4个独立通道:—输入捕获—输出比较—PWM生成(边缘或中间对齐模式)—单脉冲模式输出•死区时间可编程的互补输出•使用外部信号控制定时器和定时器互联的同步电路•允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器•刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态•如下事件发生时产生中断/DMA:—更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)—触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)—输入捕获—输出比较—刹车信号输入•支持针对定位的增量(正交)编码器和霍尔传感器电路•触发输入作为外部时钟或者按周期的电流管理如上所示,对于一般地应用是体现不出来它高端的地方了。使用心得:由于V3.5库函数将定时器资源全部融合在一块了,所以显得stm32f10x_tim.c库特别庞大,找功能函数很是麻烦,还容易搞混乱。面对这种情况寄存器操作就显得很方便了, 所以以下程序我是直接参考寄存器说明来逐步配置的,阅读起来不太方便,但写起来方便,而且不会重复混乱,更容易理解到定时器的工作过程。1首先是作为定时器的通用功能:定时定时功能的实现,是通过设置定时时钟为内部时钟源来实现,如手册上介绍:“如果禁止了从模式控制器(SMS=OOO),贝UCEN、DIR(TIMx_CR1寄存器)和UG位(TIMx_EGR寄存器)是事实上的控制位,并且只能被软件修改(UG位仍被自动清除)。只要CEN位被写成'1',预分频器的时钟就由内部时钟CK_INT提供。”配置步骤如下:voidTIM1Timing(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA,ENABLE);//打开TIM1时钟TIM1->CR1=0x380;//456bit=0,向上计数TIM1->SMCR&=0xfff8;//sms=000,禁止从模式控制器TIM1->PSC=7199;//设置预分频,公式fCK_PSC/(PSC[15:0]+1)=0.1Mhz,100us/+1TIM1->ARR=10000;//设置自动重装载值为10000,即溢出一次时间为1STIM1->RCR=0;//重复计数寄存器为0,这个是设置事件(中断)频率的,为0即溢出1次中断标志置位TIM1->EGR|=1;重新初始化计数器,即清空计数器(要是向上计数贝清0,要是向下计数贝填装自动装载值)TIM1->SR&=0x0000;//清中断标志TIM1->DIER|=1;//开启更新中断,即出现一次溢出事件中断一次TIM1->CR1|=0X001;//打开定时器1}这样就实现了最基本的定时功能,可以在中断函数里实现 1S的定时处理2,输入捕获功能:InputCapture这个功能可以很方便的计算出输入信号的频率,兼具外部计数以及内部定时的功能手册上的实现步骤:是以配置TIM1的通道1-TI1为例的•选择有效输入端:TIMx_CCR1必须连接到TI1输入,所以写入TIMx_CCR1寄存器中的CC1S=01,只要CC1S不为'00,'通道被配置为输入,并且TIMx_CCR1寄存器变为只读。•根据输入信号的特点,配置输入滤波器为所需的带宽 (即输入为TIx时,输入滤波器控制位是TIMx_CCMRx寄存器中的ICxF位)。假设输入信号在最多5个内部时钟周期的时间内抖动,我们须配置滤波器的带宽长于5个时钟周期;因此我们可以(以fDTS频率)连续采样8次,以确认在TI1上一次真实的边沿变换,即在TIMx_CCMR1寄存器中写入IC1F=0011。无需滤波的话写入0即可•选择TI1通道的有效转换边沿,在TIMx_CCER寄存器中写入CC1P=0(上升沿)。•配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写TIMx_CCMR1寄存器的IC1PS=00)。•设置TIMx_CCER寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中。•如果需要,通过设置TIMx_DIER寄存器中的CC1IE位允许相关中断请求,通过设置TIMx_DIER寄存器中的CC1DE位允许DMA请求。当发生一个输入捕获时:•产生有效的电平转换时,计数器的值被传送到TIMx_CCR1寄存器。•CC1IF标志被设置(中断标志)。当发生至少2个连续的捕获时,而CC1IF未曾被清除,CC1OF也被置1。•如设置了CC1IE位,则会产生一个中断。•如设置了CC1DE位,则还会产生一个DMA请求。为了处理捕获溢出,建议在读出捕获溢出标志之前读取数据,这是为了避免丢失在读出捕获溢出标志之后和读取数据之前可能产生的捕获溢出信息。以下是配置TIM1的通道4-TI4的程序代码voidInputCapture_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA,ENABLE);//打开TIM1和GPA的时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//配置通道4为浮空输入//TIM1->ARR=30000;//配置自动重装载值,不配置即为默认0xffffTIM1->PSC=14399;/*配置计数器预分频14399->Tcnt=20us。这个不配置的话默认不分频,那么捕获一次计数值变化非常大,如果采集信号宽度不够小的话计数器会产生溢出,给计算频TIM1->CCMR2|=0X0000;//设置滤波器为0,不滤波TIM1->CCMR2&=0Xf3FF;//设置捕获预分频为0,即一次沿捕获一次TIM1->CCMR2|=0X0100;//CC4配置为输入且映射在TI4上TIM1->CCER&=0xdfff;//设置IC4在上升沿捕获TIM1->CCER|=0x1000;//设置捕获使能TIM1->EGR|=0x11;//清空计数器及捕获计数器TIM1->SR&=0x0000;//清更新中断标志、捕获中断标志TIM1->DIER|=0x10//打开捕获中断TIM1->CR1|=0X001;//使能计数器1}中断优先级设置:voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}中断处理函数大致如下:voidTIM1_IRQHandler(void){if(TIM_GetITStatus(TIM1,TIM_IT_CC4)==SET){/*ClearTIM1Capturecompareinterruptpendingbit*/TIM_ClearITPendingBit(TIM1,TIM_IT_CC4);if(CaptureNumber==0){/*GettheInputCapturevalue*/IC3ReadValue1=TIM_GetCapture4(TIM1);CaptureNumber=1;}elseif(CaptureNumber==1){/*GettheInputCapturevalue*/IC3ReadValue2=TIM_GetCapture4(TIM1);/*Capturecomputation*/if(IC3ReadValue2>IC3ReadValue1){Capture=(IC3ReadValue2-IC3ReadValue1);}else{Capture=((0xFFFF-IC3ReadValue1)+IC3ReadValue2);}/*Frequencycomputation*/TIM1Freq=(uint32_t)100000/Capture;CaptureNumber=0;}}}这样就可以通过捕获功能算出TIM1-CH4引脚上输入信号的频率了3实现PWM输出:PWM方波输出可以通过这个功能实现硬件输出一个频率可调且占空比可调的 PWM方波;直接看具体代码:voidPWM_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_OCInitTypeDefTIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA,ENABLE);//打开TIM1和GPA的时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//GPA11设为复用推挽输出TIM_TimeBaseStructure.TIM_Prescaler=0x0;//预分频0频率为72MTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数TIM_TimeBaseStructure.TIM_Period=1439;//自动重装值PWM频率=72000000/(1439+1)=50KTIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_Pulse=0; //默认占空比为0TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;TIM_OCInitStructure.

温馨提示

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

最新文档

评论

0/150

提交评论