2019年-STM32定时器-PPT精选文档

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

新语新知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定时器类型按功能划分●2个高级控制定时器TIM1TIM8可分配6个通道的三相PWM发生器(多用于电机控制)●4个普通定时器TIM2TIM3TIM4TIM5每个定时器有4个输入捕获/输出比较/PWM/脉冲计数STM32定时器类型●2个基本定时器TIM6TIM7主要用于产生DAC触发信号●2个看门狗定时器——独立看门狗窗口看门狗●系统时基定时器SysTick24位递减计数器自动重加载常用于产生延时us级ms级STM32定时器的时钟CK_CNT表示定时器工作频率TIMx_PSC表示分频系数则定时器的工作频率计算公式为CK_CNT=定时器时钟/(TIMx_PSC+1)由此我们可得到STM32单片机1个时钟周期为:T=1/CK_CNT例如普通定时器模块的时钟为72MHz,分频比位7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为TIMx_ARR=10000因为72000000/7200=10KHz时钟周期T=1/10KHz=100us100us×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定时器中断的实现方法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)编写中断服务函数。

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功