最新第6章-STM32通用定时器2PPT课件.pptx
《最新第6章-STM32通用定时器2PPT课件.pptx》由会员分享,可在线阅读,更多相关《最新第6章-STM32通用定时器2PPT课件.pptx(70页珍藏版)》请在冰豆网上搜索。
1ARM嵌入式系统概述2STM32单片机结构和最小系统3基于标准外设库的C语言程序设计基础4STM32通用输入输出GPIO5STM32外部中断6STM32通用定时器7STM32通用同步/异步收发器USART8直接存储器存取DMA9STM32的模数转换器ADC10STM32的集成电路总线I2C11STM32的串行外设接口SPI,第6章STM32通用定时器,6.1STM32定时器的组成结构6.2通用定时器相关寄存器6.3通用定时器的功能及工作方式6.4通用定时器应用设计,退出,STM32定时器类型按功能划分2个高级控制定时器TIM1TIM8可分配6个通道的三相PWM发生器(多用于电机控制)4个通用定时器TIM2TIM3TIM4TIM5每个定时器有4个输入捕获/输出比较/PWM/脉冲计数2个基本定时器TIM6TIM7主要用于产生DAC触发信号,6.1STM32定时器的组成结构,2个看门狗定时器独立看门狗窗口看门狗系统时基定时器SysTick24位递减计数器自动重加载常用于产生延时us级ms级,6.1STM32定时器的组成结构,6.1STM32定时器的组成结构,STM32系列芯片最多包含8个定时/计数器。
其中:
TIM6和TIM7为基本定时器;TIM2TIM5为通用定时器TIM1和TIM8为高级控制定时器,功能最强。
基本概念,高速的PWM驱动信号在达到功率元件的控制极,时,往往会由于各种原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。
死区就是在上半桥关断后,延迟一段时间再打开,下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。
这段延迟时间就是死区。
刹车信号:
控制电机用,需要紧急停止时类似能,耗制动的方式让电机刹车,6.1STM32定时器的组成结构,基本定时器(TIM6,TIM7):
基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
它们可以作为通用定时器提供时间基准,可以为数模转换器(DAC)提供时钟。
6.1STM32定时器的组成结构,通用定时器(TIM2-TIM5),通用定时器要比基本定时器复时杂钟,源它除了基本的定时器的功能外,还具有测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。
时钟单元,捕获比较通道,6.1STM32定时器的组成结构,高级定时器(TIM1,TIM8):
高级定时器不但具有基本,通用定时器的所有功能,还具有控制交直流电动机的功能,比如它可以输出6路互补带死区的信号,刹车功能等等,6.2通用定时器相关寄存器,定时器的功能是通过操作相应寄存器实现的,寄存器包括:
1.计数寄存器(16位):
计数器(TIMx_CNT)预分频器(TIMx_PSC)自动重载寄存器(TIMx_ARR)计数器可以向上计数、向下计数或者向上向下双向计数。
2.控制寄存器(16位):
4个捕捉/比较寄存器(TIMx_CCR1、TIMx_CCR2、TIMx_CCR3和TIMx_CCR4),计数器寄存器:
TIMx_CNT,16位的计数器,设定值从165535,6.2通用定时器相关寄存器,计数器模式,向上计数模式:
计数器从0计数到设定的数值,然后重新从0开始计数并且产生一个计数器溢出事件。
向下计数模式:
计数器从设定的数值开始向下计数到0,然后自动从设定的数值重新向下计数,并产生一个向下溢出事件。
中央对齐模式(向上/向下计数):
计数器从0开始计数到设定的数值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;再从0开始重新计数。
预分频器寄存器:
TIMx_PSC预分频器可以将计数器的时钟频率(CK_PSC)按1到65536之间的任意值分频,它是一个16位寄存器。
这个寄存器带有缓冲区,它能够在工作时被改变。
新的预分频器参数在下一次更新事件到来时被采用。
6.2通用定时器相关寄存器,什么是“更新事件(UEV)”?
“更新事件(UEV)”:
当计数器溢出的时候产生一次UEV事件,另外还可以在事件寄存器TMx_EGR中的UG位软件写入产生一次事件更新;当UEV事件来临时,所有影子寄存器载入寄存器中的值,从而实现所有带影子寄存器的同步更新;而不启用影子寄存器的情况下,只能实现写那个寄存器更新那个寄存器,这可能造成相关联的寄存器产生冲突矛盾。
什么是“影子寄存器”?
在图中,可以看到PSC、ARR、CCRx,这三类寄存器框框下都有个黑影有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preloadregister(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadowregister(影子寄存器);当程序在运行中改写PSC时,写入的值可能会大于或小于目前正在运行的寄存器中的数值,真实运行的正是这个影子寄存器中的值,而程序写入的是可访问的预装载寄存器,只有当产生一个更新事件时影子寄存器才会读入访问寄存器中的值,这样就可以防止突然修改而产生的非正常中断或不会中断等异常问题。
自动装载寄存器:
TIMx_ARR,自动装载寄存器是预先装载的(要在使能定时器之前设定好),根据在TIMx_CR1寄存器中自动装载使能位(ARPE)的设置,立即或者在每次更新事件时传送到计数器。
STM32定时器的工作频率,CK_CNT表示定时器工作频率TIMx_PSC表示分频系数则定时器的工作频率计算公式为:
CK_CNT=定时器时钟频率/(TIMx_PSC+1)由此我们可得到STM32单片机1个时钟周期为:
T=1/CK_CNT,例如普通定时器模块的时钟为72MHz,分频比(PSC)为7199,那么我们想要得到一个1秒钟的定时,定时计数器(ARR)的值需要设定为:
TIMx_ARR=10000因为72000000/(7199+1)=10KHz时钟周期T=1/10KHz=100us100us10000=1S结论:
分频比7199定时计数器的值10000,该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。
具体每位的含义,请参考中文参考手册。
状态寄存器(TIMx_SR),控制寄存器:
TIMx_CR1,控制寄存器:
TIMx_CR1,控制寄存器:
TIMx_CR1,6.3通用定时器的功能及工作方式,6.3通用定时器的功能及工作方式,通用定时器的基本功能是定时和计数。
当可编程定时/计数器的时钟源来自内部系统时钟时可以完成精密定时;当时钟源来自外部信号时可完成外部信号计数。
6.3.1时钟的选择内部时钟(CK_INT);外部时钟模式1(外部输入脚TIx);外部时钟模式2(外部触发输入ETR);内部触发输入(ITR,使用一个定时器作为另一个定时器的预分频器,如配置定时器Timer1作为定时器Timer2的预分频器)。
6.3通用定时器的功能及工作方式,通用定时器的计数器时钟:
内部时钟(CK_INT),6.3通用定时器的功能及工作方式,通用定时器(TIM2-5)的时钟不是直接来自APB1,而是通过APB1的预分频器和倍频器以后才到达定时器模块。
当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。
假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM27的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM27的时钟频率=36MHz。
6.3通用定时器的功能及工作方式,有人会问,既然需要TIM27的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?
答案是:
APB1不但要为TIM27提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM27仍能得到较高的时钟频率。
再举个例子:
当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。
如果APB1的预分频系数=2,正是因为有了这个定时器的倍频器,TIM27仍然能够得到72MHz的时钟频率。
能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也是设计这个倍频器的初衷。
6.3通用定时器的功能及工作方式,1、内部时钟,6.3通用定时器的功能及工作方式,2、外部时钟源模式1,6.3通用定时器的功能及工作方式,2、外部时钟源模式2,6.3.2时基单元,时基单元是设置定时器/计数器计数时钟的基本单元:
计数器寄存器(TIMx_CNT);预分频器寄存器(TIMx_PSC);自动装载寄存器(TIMx_ARR)。
根据实际需要,由软件设置预分频器寄存器,可以得到定时器/计数器的计数时钟。
6.3.3计数模式,1.向上计数模式:
当控制寄存器TIMx_CR1中CMS=00,DIR=0时选择为向上计数模式。
2.向下计数模式:
当控制寄存器TIMx_CR1中CMS=00,DIR=1时选择为向下计数模式。
3.中央对齐计数模式:
当控制寄存器TIMx_CR1中CMS=01、10、11时选择为中央对齐模式。
定时器时序1,定时器时序2,6.4通用定时器应用设计,6.4.1通用定时器常用库函数,STM32标准库中提供了几乎覆盖所有TIM操作的函数,所有TIM相关函数均在stm32f10x_tim.c和stm32f10x_tim.h中定义和声明。
教程表6-16TIM库函数,6.4.2通用定时器使用流程,1.NVIC设置:
NVIC用来完成中断分组、中断通道选择、中断优先级设置及使能中断的功能,2.定时器中断配置:
用来配置定时器时基及开启中断,Prescaler,3.中断服务程序:
用来配置定时器时基及开启中断,6.4.3通用定时器设计实例,对第4章的GPIO控制LED实例,采用定时器3定时功能,使LED每1秒亮灭1次。
PA8驱动LED。
为了使LED亮一秒灭一秒,只要设置定时器1s产生一次中断,在中断函数中对延时时间进行计数即可实现任意秒延时。
6.4.3通用定时器设计实例,intmain(void)LED_Config();/GPIO-LED配置TIM3_NVIC_Config();/TIM3_NVIC配置TIM3_Config();/TIM3配置GPIO_ResetBits(GPIOA,GPIO_Pin_8);/低电平,点亮LEDwhile
(1),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,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(,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,6.4.3通用定时器设计实例,这个结构体一共定义了5个成员变量,如果使用通用定时器,只有前面四个参数有用,最后一个参数“TIM_RepetitionCounter”在高级定时器编程的时候才能用上。
6.4.3通用定时器设计实例,TIM_Period该参数是用来设置自动重装载寄存器的值,它的取值必须在0x0000和0xFFFF之间。
TIM_Prescaler该参数是用来设置PSC预分频器的分频系数,它的取值必须在0x0000和0xFFFF之间。
TIM_ClockDivisionTIM_ClockDivision设置了时钟分割。
该数取值见下表,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,6.4.3通用定时器设计实例,voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct),6.4.3通用定时器设计实例,TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);,6.4.3通用定时器设计实例,TIM_Cmd(TIM3,ENABLE);,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);,6.4.3通用定时器设计实例,TIM_GetITStatus(TIM3,TIM_IT_Update)!
=RESET,6.4.3通用定时器设计实例,TIM_ClearITPendingBit(TIM3,TIM_IT_Update);,将程序下载到开发板上,可以看到LED1每1秒亮灭一次。
此外可以通过软件仿真观察PA8的输出情况,PA8的输出仿真图看出PA8每1秒输出高低电平转换一次。
PWM波形,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,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,捕获例程,RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;/TIM5_CH0GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(,