您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 11--STM32定时器
STM32的定时器使用STM32定时器的工作原理STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振)T=1/FF为频率例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为12MHz/12=1MHzT=1/1MHz=1usSTM32定时器的工作原理最小定时时间T=1/1MHz=1us51单片机定时器:方式013位最大定时时间间隔2^13=8.192ms方式116位最大定时时间间隔2^16=65.536ms方式28位最大定时时间间隔2^8=256usSTM32定时器的工作原理由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容1.分频器(分频比)2.定时计数器的值STM32定时器STM32系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。倍频器定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。下面以通用定时器2的时钟说明这个倍频器的作用:当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。有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时。高速外设低速外设STM32定时器类型按功能划分●2个高级控制定时器TIM1TIM8可分配6个通道的三相PWM发生器(多用于电机控制)●4个普通定时器TIM2TIM3TIM4TIM5每个定时器有4个输入捕获/输出比较/PWM/脉冲计数STM32定时器类型●2个基本定时器TIM6TIM7主要用于产生DAC触发信号●2个看门狗定时器——独立看门狗窗口看门狗●系统时基定时器SysTick24位递减计数器自动重加载常用于产生延时us级ms级STM32定时器的时钟定时器的工作频率计算公式为定时器技术频率CK_CNT=定时器时钟CK_INT/(TIMx_PSC+1)其中:TIMx_CLK定时器的计数频率CK_INT内部时钟源频率(APB1的倍频器送出时钟)TIM_PSC用户设定的预分频系数,取值范围0~65535。例如:RCC中AHB=72MHz、APB1=36MHz、APB2=72MHz,则CK_INT=72MHz。由此可得到STM32单片机1个时钟周期为:T=1/CK_CNT例如普通定时器模块的时钟为72MHz,分频比位7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为TIMx_ARR=10000因为72000000/7200=10KHz时钟周期T=1/10KHz=100us100us×10000=1S结论:分频比7199定时计数器的值10000第一步:打开(使能)相应定时器的时钟信号由于普通定时器使用的是低速外部时钟信号APB1,所以我们使能时钟信号时要采用函数:voidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState)第二步:配置四个寄存器的内容计数器寄存器:TIMx_CNT预分频器寄存器:TIMx_PSC自动装载寄存器:TIMx_ARR(以上3个寄存器合起来成为时基单元)控制寄存器:TIMx_CR1计数器寄存器:TIMx_CNT16位的计数器,设定值从1~65535计数器模式向上计数模式:计数器从0计数到设定的数值,然后重新从0开始计数并且产生一个计数器溢出事件。向下计数模式:计数器从设定的数值开始向下计数到0,然后自动从设定的数值重新向下计数,并产生一个向下溢出事件。中央对齐模式(向上/向下计数):计数器从0开始计数到设定的数值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;再从0开始重新计数。预分频器寄存器:TIMx_PSC预分频器可以讲计数器的时钟频率按1到65536之间的任意值分频,它是一个16位寄存器。这个寄存器带有缓冲区,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采用。预分频器寄存器在事件更新时采用自动装载寄存器:TIMx_ARR自动装载寄存器是预先装载的(要在使能定时器之前设定好),根据在TIMx_CR1寄存器中自动装载使能位(ARPE)的设置,立即或者在每次更新事件时传送到计数器。立即加载计数器更新事件时加载计数器控制寄存器:TIMx_CR1控制寄存器:TIMx_CR1控制寄存器:TIMx_CR1寄存器操作编程voidTimer3_Init(u16arr,u16psc){RCC-APB1ENR|=11;TIM3-ARR=arr;//设置重装载值TIM3-PSC=psc;//设置分频系数TIM3-DIER|=10;//允许更新中断TIM3-DIER|=16;//允许TIME中断TIM3-CR1|=10;MY_NVIC_Init(3,3,TIM3_IRQChannel,2);}固件库操作编程voidTimer_Config(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);TIM_DeInit(TIM5);//时钟分频系数设定,不分频,定时器采用72MHZ时钟信号TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//计数器模式设定:向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器上限值,从0计数到9999将产生中断请求TIM_TimeBaseStructure.TIM_Period=9999;//定时器分频器:10000*7200=72MHZ,将产生1S的定时周期TIM_TimeBaseStructure.TIM_Prescaler=7199;TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);TIM_Cmd(TIM5,ENABLE);//使能定时器5}STM32------中断Cortex内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号为0~15的称为内核异常,而16以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量表。而STM32对这个表重新进行了编排,把编号从-3至6的中断向量定义为系统异常,编号为负的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断(NMI)、硬错误(Hardfault)。从编号7开始的为外部中断,这些中断的优先级都是可以自行设置的。STM32------中断STM32的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器NVIC(NestedVectoredInterruptController),NVIC是属于Cortex内核的器件。STM32中断配置配置STM32的中断只需要理解2个内容,配置4个变量即可。两个内容:抢占优先级,响应优先级4个变量:NVIC_IRQChannel中断向量NVIC_IRQChannelCmd使能/禁止NVIC_IRQChannelPreemptionPriority抢占优先级NVIC_IRQChannelSubPriority响应优先级抢占优先级抢占,是指打断其他中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数A的过程中被中断B打断,先执行完中断服务B再继续执行中断服务A)其属性编号越小,优先级别越高。响应优先级响应属性则应用在抢占属性相同的情况下,如果两个中断同时到达,则先处理响应优先级高的中断,再处理响应优先级低的中断其属性编号越小,优先级别越高若内核正在执行C的中断服务函数,则它能被抢占优先级更高的中断A打断,由于B和C的抢占优先级相同,所以C不能被B打断。但如果B和C中断是同时到达的,内核就会首先响应响应优先级别更高的B中断。抢占优先级和响应优先级的数量由一个4位的数字来决定。第0组:所有4位用来配置抢占优先级,即NVIC配置的24=16种中断向量都是只有抢占属性,没有响应属性。第1组:最高1位用来配置抢占优先级,低3位用来配置响应优先级。抢占优先级(0级,1级),响应优先级分别为0~7。第2组:2位用来配置抢占优先级,2位用来配置响应优先级。即22=4种抢占优先级,22=4种响应优先级。第3组:高3位用来配置抢占优先级,最低1位用来配置响应优先级。即有8种抢占优先级,2种响应2优先级。第4组:所有4位用来配置响应优先级。即16种中断向量具有都不相同的响应优先级。STM32中断的配置方法第一步定义一个中断配置结构体变量NVIC_InitTypeDefNVIC_InitStructure;第二步建立中断优先级配置组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);第三步对结构体变量初始化NVIC_IRQChannel中断向量NVIC_IRQChannelCmd使能/禁止NVIC_IRQChannelPreemptionPriority抢占优先级NVIC_IRQChannelSubPriority响应优先级第四步NVIC_Init(&NVIC_InitStructure);STM32的中断服务函数stm32f10x_it.c文件是专门用来存放中断服务函数的。文件中默认只有几个关于系统异常的中断服务函数,而且都是空函数,在需要的时候自已进行编写。那么中断服务函数名是不是可以自己定义呢?不可以。中断服务函数的名字必须要跟启动文件startup_stm32f10x_hd.s中的中断向量表定义一致。STM32的中断服务函数voidTIM5_IRQHandler(void){if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET){TIM_ClearITPendingBit(TIM5,TIM_IT_Update);Disp_Buffer[0]++;if(Disp_Buffer[0]==60){Disp_Buffer[0]=0;Disp_Buffer[1]++;if(Disp_Buffer[1]==60){Disp_Buffer[1]=0;Disp_Buffer[2]++;if(Disp_Buffer[2]==24)Disp_Buffer[2]=0;}}}}1)TIMx时钟使能。2)设置TIMx_ARR和TIMx_PSC的值。3)设置TIMx_DIER允许更新中断。4)允许TIMx工作。5)TIMx中断分组设置。6)编写中断服务函数。
本文标题:11--STM32定时器
链接地址:https://www.777doc.com/doc-3976781 .html