《《STM定时器》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《STM定时器》PPT课件.ppt(39页珍藏版)》请在三一办公上搜索。
1、新语新知,STM32的定时器使用,STM32定时器的工作原理,STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振)T=1/F F为频率例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为 12MHz/12=1MHzT=1/1MHz=1us,STM32定时器的工作原理,最小定时时间 T=1/1MHz=1us51单片机定时器:方式0 13位 最大定时时间间隔 213=8.192ms方式1 16位 最大定时时间间隔 216=65.536ms方式2 8位 最大定时时间间隔 28=256us,STM3
2、2定时器的工作原理,由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容1.分频器(分频比)2.定时计数器的值,STM32定时器类型,按功能划分 2个高级控制定时器 TIM1 TIM8可分配6个通道的三相PWM发生器(多用于电机控制)4个普通定时器 TIM2 TIM3 TIM4 TIM5每个定时器有4个输入捕获/输出比较/PWM/脉冲计数,STM32定时器类型,2个基本定时器 TIM6 TIM7 主要用于产生DAC触发信号 2个看门狗定时器 独立看门狗 窗口看门狗 系统时基定时器 SysTick24位递减计数器自动重加载常用于产生延时 us级 ms级,STM32定时器的时钟,CK_CN
3、T 表示定时器工作频率TIMx_PSC 表示分频系数则定时器的工作频率计算公式为CK_CNT=定时器时钟/(TIMx_PSC+1)由此我们可得到STM32单片机1个时钟周期为:T=1/CK_CNT,例如普通定时器模块的时钟为72MHz,分频比位7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为TIMx_ARR=10 000因为72 000 000/7200=10KHz时钟周期T=1/10KHz=100us100us 10 000=1S结论:分频比7199 定时计数器的值 10 000,普通定时器相关的寄存器介绍及配制方法,第一步:打开(使能)相应定时器的时钟信号由于普通定时器
4、使用的是低速外部时钟信号APB1,所以我们使能时钟信号时要采用函数:void RCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState),第二步:配置四个寄存器的内容计数器寄存器:TIMx_CNT预分频器寄存器:TIMx_PSC自动装载寄存器:TIMx_ARR(以上3个寄存器合起来成为时基单元)控制寄存器:TIMx_CR1,计数器寄存器:TIMx_CNT,16位的计数器,设定值从165535,计数器模式,向上计数模式:计数器从0计数到设定的数值,然后重新从0开始计数并且产生一个计数器溢出事件。向下计数模式:计数器
5、从设定的数值开始向下计数到0,然后自动从设定的数值重新向下计数,并产生一个向下溢出事件。中央对齐模式(向上/向下计数):计数器从0开始计数到设定的数值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;再从0开始重新计数。,预分频器寄存器:TIMx_PSC,预分频器可以讲计数器的时钟频率按1到65536之间的任意值分频,它是一个16位寄存器。这个寄存器带有缓冲区,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采用。,预分频器寄存器在事件更新时采用,自动装载寄存器:TIMx_ARR,自动装载寄存器是预先装载的(要在使能定时器之前设定好),根据在TIMx_CR
6、1寄存器中自动装载使能位(ARPE)的设置,立即或者在每次更新事件时传送到计数器。,立即加载计数器,更新事件时加载计数器,控制寄存器:TIMx_CR1,控制寄存器:TIMx_CR1,控制寄存器:TIMx_CR1,寄存器操作编程,void Timer3_Init(u16 arr,u16 psc)RCC-APB1ENR|=1 ARR=arr;/设置重装载值TIM3-PSC=psc;/设置分频系数TIM3-DIER|=1 DIER|=1 CR1|=1 0;MY_NVIC_Init(3,3,TIM3_IRQChannel,2);,固件库操作编程,void Timer_Config(void)TIM_T
7、imeBaseInitTypeDef TIM_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_TimeBaseStru
8、cture.TIM_Period=9999;/定时器分频器:10000*7200=72MHZ,将产生1S的定时周期TIM_TimeBaseStructure.TIM_Prescaler=7199;TIM_TimeBaseInit(TIM5,/使能定时器5,STM32定时器中断的实现方法,STM32-中断,Cortex内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号为015的称为内核异常,而16以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量表。而STM32对这个表重新进行了编排
9、,把编号从-3至6的中断向量定义为系统异常,编号为负 的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断(NMI)、硬错误(Hardfault)。从编号7开始的为外部中断,这些中断的优先级都是可以自行设置的。,STM32-中断,STM32的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器NVIC(Nested Vectored Interrupt Controller),NVIC是属于Cortex内核的器件。,STM32中断配置,配置STM32的中断只需要理解2个内容,配置4个变量即可。两个内容:抢占优先级,响应优先级4个变量:NVIC_IRQChannel
10、 中断向量 NVIC_IRQChannelCmd 使能/禁止NVIC_IRQChannelPreemptionPriority 抢占优先级NVIC_IRQChannelSubPriority 响应优先级,抢占优先级,抢占,是指打断其他中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数A的过程中被中断B打断,先执行完中断服务B再继续执行中断服务A)其属性编号越小,优先级别越高。,响应优先级,响应属性则应用在抢占属性相同的情况下,如果两个中断同时到达,则先处理响应优先级高的中断,再处理响应优先级低的中断其属性编号越小,优先级别越高,若内核正在执行C的中断服务函数,则它能被抢占优先级
11、更高的中断A打断,由于B和C的抢占优先级相同,所以C不能被B打断。但如果B和C中断是同时到达的,内核就会首先响应响应优先级别更高的B中断。,抢占优先级和响应优先级的数量由一个4位的数字来决定。第0组:所有4位用来配置抢占优先级,即NVIC配置的24=16种中断向量都是只有抢占属性,没有响应属性。第1组:最高1位用来配置抢占优先级,低3位用来配置响应优先级。抢占优先级(0级,1级),响应优先级分别为07。第2组:2位用来配置抢占优先级,2位用来配置响应优先级。即22=4种抢占优先级,22=4种响应优先级。,第3组:高3位用来配置抢占优先级,最低1位用来配置响应优先级。即有8种抢占优先级,2种响应
12、2优先级。第4组:所有4位用来配置响应优先级。即16种中断向量具有都不相同的响应优先级。,STM32中断的配置方法,第一步 定义一个中断配置结构体变量NVIC_InitTypeDef NVIC_InitStructure;第二步 建立中断优先级配置组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);第三步 对结构体变量初始化NVIC_IRQChannel 中断向量 NVIC_IRQChannelCmd 使能/禁止NVIC_IRQChannelPreemptionPriority 抢占优先级NVIC_IRQChannelSubPriority 响应优先
13、级第四步 NVIC_Init(,STM32的中断服务函数,stm32f10 x_it.c文件是专门用来存放中断服务函数的。文件中默认只有几个关于系统异常的中断服务函数,而且都是空函数,在需要的时候自已进行编写。那么中断服务函数名是不是可以自己定义呢?不可以。中断服务函数的名字必须要跟启动文件startup_stm32f10 x_hd.s中的中断向量表定义一致。,STM32的中断服务函数,void TIM5_IRQHandler(void)if(TIM_GetITStatus(TIM5,TIM_IT_Update)=SET)TIM_ClearITPendingBit(TIM5,TIM_IT_Update);Disp_Buffer0+;if(Disp_Buffer0=60)Disp_Buffer0=0;Disp_Buffer1+;if(Disp_Buffer1=60)Disp_Buffer1=0;Disp_Buffer2+;if(Disp_Buffer2=24)Disp_Buffer2=0;,1)TIMx时钟使能。2)设置TIMx_ARR和TIMx_PSC的值。3)设置TIMx_DIER允许更新中断。4)允许TIMx工作。5)TIMx中断分组设置。6)编写中断服务函数。,