第6章STM32通用定时器2_第1页
第6章STM32通用定时器2_第2页
第6章STM32通用定时器2_第3页
第6章STM32通用定时器2_第4页
第6章STM32通用定时器2_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

1ARM嵌入式系统概述2STM32单片机结构和最小系统

3基于标准外设库的C语言程序设计基础

4STM32通用输入输出GPIO5STM32外部中断6STM32通用定时器7STM32通用同步/异步收发器USART8直接存储器存取DMA9STM32的模数转换器ADC10STM32的集成电路总线I2C11STM32的串行外设接口SPI第一页,共69页。第一页,共69页。第6章STM32通用定时器6.1STM32定时器的组成结构6.2通用定时器相关寄存器6.3通用定时器的功能及工作方式6.4通用定时器应用设计退出第二页,共69页。第二页,共69页。STM32定时器类型按功能划分2个高级控制定时器TIM1TIM8可分配6个通道的三相PWM发生器(多用于电机控制)4个通用定时器TIM2TIM3TIM4TIM5每个定时器有4个输入捕获/输出比较/PWM/脉冲计数2个基本定时器TIM6TIM7主要用于产生DAC触发信号6.1STM32定时器的组成结构第三页,共69页。第三页,共69页。●2个看门狗定时器——独立看门狗窗口看门狗●系统时基定时器

SysTick 24位递减计数器 自动重加载 常用于产生延时us级ms级6.1STM32定时器的组成结构第四页,共69页。第四页,共69页。6.1STM32定时器的组成结构STM32系列芯片最多包含8个定时/计数器。其中:TIM6和TIM7为基本定时器;TIM2~TIM5为通用定时器TIM1和TIM8为高级控制定时器,功能最强。主要功能高级定时器通用定时器基本定时器内部时钟源(8MHz)●●●带16位分频的计数单元●●●更新中断和DMA●●●计数方向向上、向下、双向向上、向下、双向向上外部事件计数●●○其它定时器触发或级联●●○4个独立输入捕获输出比较通道●●○单脉冲输出方式●●○正交编码器输入●●○霍尔传感器输入●●○输出比较信号死区产生●○○刹车信号输入●○○第五页,共69页。第五页,共69页。基本概念高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。这段延迟时间就是死区。刹车信号:控制电机用,需要紧急停止时类似能耗制动的方式让电机刹车第六页,共69页。第六页,共69页。6.1STM32定时器的组成结构基本定时器(TIM6,TIM7):基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,可以为数模转换器(DAC)提供时钟。第七页,共69页。第七页,共69页。通用定时器(TIM2-TIM5),通用定时器要比基本定时器复杂,它除了基本的定时器的功能外,还具有测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。6.1STM32定时器的组成结构时钟源时钟单元捕获比较通道第八页,共69页。第八页,共69页。6.1STM32定时器的组成结构高级定时器(TIM1,TIM8):高级定时器不但具有基本,通用定时器的所有功能,还具有控制交直流电动机的功能,比如它可以输出6路互补带死区的信号,刹车功能等等第九页,共69页。第九页,共69页。6.2通用定时器相关寄存器定时器的功能是通过操作相应寄存器实现的,寄存器包括:1.计数寄存器(16位):计数器(TIMx_CNT)预分频器(TIMx_PSC)自动重载寄存器(TIMx_ARR)计数器可以向上计数、向下计数或者向上向下双向计数。2.控制寄存器(16位):4个捕捉/比较寄存器(TIMx_CCR1、TIMx_CCR2、TIMx_CCR3和TIMx_CCR4)第十页,共69页。第十页,共69页。计数器寄存器:TIMx_CNT16位的计数器,设定值从1~655356.2通用定时器相关寄存器第十一页,共69页。第十一页,共69页。计数器模式向上计数模式:计数器从0计数到设定的数值,然后重新从0开始计数并且产生一个计数器溢出事件。向下计数模式:计数器从设定的数值开始向下计数到0,然后自动从设定的数值重新向下计数,并产生一个向下溢出事件。中央对齐模式(向上/向下计数):计数器从0开始计数到设定的数值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;再从0开始重新计数。第十二页,共69页。第十二页,共69页。预分频器寄存器:TIMx_PSC预分频器可以将计数器的时钟频率(CK_PSC)按1到65536之间的任意值分频,它是一个16位寄存器。这个寄存器带有缓冲区,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采用。6.2通用定时器相关寄存器第十三页,共69页。第十三页,共69页。什么是“更新事件(UEV)”?“更新事件(UEV)”:当计数器溢出的时候产生一次UEV事件,另外还可以在事件寄存器TMx_EGR中的UG位软件写入产生一次事件更新;当UEV事件来临时,所有影子寄存器载入寄存器中的值,从而实现所有带影子寄存器的同步更新;而不启用影子寄存器的情况下,只能实现写那个寄存器更新那个寄存器,这可能造成相关联的寄存器产生冲突矛盾。第十四页,共69页。第十四页,共69页。什么是“影子寄存器”?在图中,可以看到PSC、ARR、CCRx,这三类寄存器框框下都有个黑影有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preloadregister(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadowregister(影子寄存器);当程序在运行中改写PSC时,写入的值可能会大于或小于目前正在运行的寄存器中的数值,真实运行的正是这个影子寄存器中的值,而程序写入的是可访问的预装载寄存器,只有当产生一个更新事件时影子寄存器才会读入访问寄存器中的值,这样就可以防止突然修改而产生的非正常中断或不会中断等异常问题。第十五页,共69页。第十五页,共69页。自动装载寄存器:TIMx_ARR自动装载寄存器是预先装载的(要在使能定时器之前设定好),根据在TIMx_CR1寄存器中自动装载使能位(ARPE)的设置,立即或者在每次更新事件时传送到计数器。第十六页,共69页。第十六页,共69页。STM32定时器的工作频率CK_CNT表示定时器工作频率TIMx_PSC表示分频系数则定时器的工作频率计算公式为:CK_CNT=定时器时钟频率/(TIMx_PSC+1)由此我们可得到STM32单片机1个时钟周期为:T=1/CK_CNT第十七页,共69页。第十七页,共69页。例如普通定时器模块的时钟为72MHz,分频比(PSC)为7199,那么我们想要得到一个1秒钟的定时,定时计数器(ARR)的值需要设定为:TIMx_ARR=10000因为72000000/(7199+1)=10KHz时钟周期T=1/10KHz=100us100us×10000=1S结论:分频比7199定时计数器的值10000第十八页,共69页。第十八页,共69页。该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。具体每位的含义,请参考中文参考手册。

状态寄存器(TIMx_SR)第十九页,共69页。第十九页,共69页。控制寄存器:TIMx_CR1第二十页,共69页。第二十页,共69页。控制寄存器:TIMx_CR1第二十一页,共69页。第二十一页,共69页。控制寄存器:TIMx_CR1第二十二页,共69页。第二十二页,共69页。6.3通用定时器的功能及工作方式第二十三页,共69页。第二十三页,共69页。6.3通用定时器的功能及工作方式

6.3.1时钟的选择内部时钟(CK_INT);外部时钟模式1(外部输入脚TIx);外部时钟模式2(外部触发输入ETR);内部触发输入(ITR,使用一个定时器作为另一个定时器的预分频器,如配置定时器Timer1作为定时器Timer2的预分频器)。通用定时器的基本功能是定时和计数。当可编程定时/计数器的时钟源来自内部系统时钟时可以完成精密定时;当时钟源来自外部信号时可完成外部信号计数。第二十四页,共69页。第二十四页,共69页。6.3通用定时器的功能及工作方式通用定时器的计数器时钟:内部时钟(CK_INT)第二十五页,共69页。第二十五页,共69页。6.3通用定时器的功能及工作方式通用定时器(TIM2-5)的时钟不是直接来自APB1,而是通过APB1的预分频器和倍频器以后才到达定时器模块。当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。

第二十六页,共69页。第二十六页,共69页。6.3通用定时器的功能及工作方式有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,正是因为有了这个定时器的倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也是设计这个倍频器的初衷。第二十七页,共69页。第二十七页,共69页。6.3通用定时器的功能及工作方式1、内部时钟第二十八页,共69页。第二十八页,共69页。6.3通用定时器的功能及工作方式2、外部时钟源模式1第二十九页,共69页。第二十九页,共69页。6.3通用定时器的功能及工作方式2、外部时钟源模式2第三十页,共69页。第三十页,共69页。第三十一页,共69页。第三十一页,共69页。6.3.2时基单元时基单元是设置定时器/计数器计数时钟的基本单元:计数器寄存器(TIMx_CNT);预分频器寄存器(TIMx_PSC);自动装载寄存器(TIMx_ARR)。根据实际需要,由软件设置预分频器寄存器,可以得到定时器/计数器的计数时钟。第三十二页,共69页。第三十二页,共69页。第三十三页,共69页。第三十三页,共69页。6.3.3计数模式1.向上计数模式:当控制寄存器TIMx_CR1中CMS=00,DIR=0时选择为向上计数模式。2.向下计数模式:当控制寄存器TIMx_CR1中CMS=00,DIR=1时选择为向下计数模式。3.中央对齐计数模式:当控制寄存器TIMx_CR1中CMS=01、10、11时选择为中央对齐模式。第三十四页,共69页。第三十四页,共69页。第三十五页,共69页。第三十五页,共69页。第三十六页,共69页。第三十六页,共69页。第三十七页,共69页。第三十七页,共69页。第三十八页,共69页。第三十八页,共69页。第三十九页,共69页。第三十九页,共69页。第四十页,共69页。第四十页,共69页。第四十一页,共69页。第四十一页,共69页。第四十二页,共69页。第四十二页,共69页。定时器时序1第四十三页,共69页。第四十三页,共69页。定时器时序2第四十四页,共69页。第四十四页,共69页。6.4通用定时器应用设计6.4.1通用定时器常用库函数STM32标准库中提供了几乎覆盖所有TIM操作的函数,所有TIM相关函数均在stm32f10x_tim.c和stm32f10x_tim.h中定义和声明。教程表6-16TIM库函数第四十五页,共69页。第四十五页,共69页。6.4.2通用定时器使用流程1.NVIC设置:NVIC用来完成中断分组、中断通道选择、中断优先级设置及使能中断的功能第四十六页,共69页。第四十六页,共69页。2.定时器中断配置:用来配置定时器时基及开启中断Prescaler第四十七页,共69页。第四十七页,共69页。3.中断服务程序:用来配置定时器时基及开启中断第四十八页,共69页。第四十八页,共69页。6.4.3通用定时器设计实例对第4章的GPIO控制LED实例,采用定时器3定时功能,使LED每1秒亮灭1次。PA8驱动LED。为了使LED亮一秒灭一秒,只要设置定时器1s产生一次中断,在中断函数中对延时时间进行计数即可实现任意秒延时。第四十九页,共69页。第四十九页,共69页。第五十页,共69页。第五十页,共69页。6.4.3通用定时器设计实例intmain(void){

LED_Config();//GPIO-LED配置

TIM3_NVIC_Config();//TIM3_NVIC配置

TIM3_Config();//TIM3配置

GPIO_ResetBits(GPIOA,GPIO_Pin_8);//低电平,点亮LED

while(1)

{

}}第五十一页,共69页。第五十一页,共69页。6.4.3通用定时器设计实例voidLED_Config(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);}第五十二页,共69页。第五十二页,共69页。6.4.3通用定时器设计实例voidTIM3_NVIC_Config(void){NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority

=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}第五十三页,共69页。第五十三页,共69页。6.4.3通用定时器设计实例voidTIM3_Config(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseStructure.TIM_Prescaler=(7200-1);TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period=10000;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);TIM_Cmd(TIM3,ENABLE);}第五十四页,共69页。第五十四页,共69页。6.4.3通用定时器设计实例这个结构体一共定义了5个成员变量,如果使用通用定时器,只有前面四个参数有用,最后一个参数“TIM_RepetitionCounter”在高级定时器编程的时候才能用上。第五十五页,共69页。第五十五页,共69页。6.4.3通用定时器设计实例TIM_Period该参数是用来设置自动重装载寄存器的值,它的取值必须在0x0000和0xFFFF之间。

TIM_Prescaler该参数是用来设置PSC预分频器的分频系数,它的取值必须在0x0000和0xFFFF之间。TIM_ClockDivisionTIM_ClockDivision设置了时钟分割。该参数取值见下表第五十六页,共69页。第五十六页,共69页。6.4.3通用定时器设计实例voidTIM3_Config(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseStructure.TIM_Prescaler=(7199-1);TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period=10000;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);TIM_Cmd(TIM3,ENABLE);}第五十七页,共69页。第五十七页,共69页。6.4.3通用定时器设计实例voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)第五十八页,共69页。第五十八页,共69页。6.4.3通用定时器设计实例TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);第五十九页,共69页。第五十九页,共69页。6.4.3通用定时器设计实例TIM_Cmd(TIM3,ENABLE);第六十页,共69页。第六十页,共69页。6.4.3通用定时器设计实例voidTIM3_IRQHandler(void){if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){TIM_ClearITPendingBit(TIM3,TIM_IT_Update);GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)((1-

GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))));}}第六十一页,共69页。第六十一页,共69页。6.4.3通用定时器设计实例TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET第六十二页,共69页。第六十二页,共69页。6.4.3通用定时器设计实例TIM_ClearITPendingBit(TIM3,TIM_IT_Update);第六十三页,共69页。第六十三页,共69页。将程序下载到开发板上,可以看到LED1每1秒亮灭一次。此外可以通过软件仿真观察PA8的输出情况,PA8的输出仿真图看出PA8每1秒输出高低电平转换一次。第六十四页,共69页。第六十四页,共69页。PWM波形第六十五页,共69页。第六十五页,共69页。PWM例程RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//TIM_CH5GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);TIM_TimeBaseStructure.TIM_Period=arr;TIM_TimeBaseStructure.TIM_Prescaler=psc;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);第六十六页,共69页。第六十六页,共69页。PWM例程TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OC2Init(TIM3,&TIM_OCInitStructure);TIM_SetCompare2(xxx);///////////比较点TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_Cmd(TIM3,ENABLE);第六十七页,共69页。第六十七页,共69页。捕获例程RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin

温馨提示

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

评论

0/150

提交评论