stm32定时器例程PPT课件

简介 相关

截图

stm32定时器例程PPT课件

简介

这是一个关于stm32定时器例程PPT课件,包括了STM32定时器的工作原理,STM32定时器类型,STM32定时器的时钟,普通定时器相关的寄存器介绍及配制方法,STM32定时器中断的实现方法等内容,新语新知 STM32的定时器使用 STM32定时器的工作原理 STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振) T = 1/F F为频率例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为 12MHz / 12 = 1MHz T = 1 / 1MHz = 1us STM32定时器的工作原理最小定时时间 T = 1 / 1MHz = 1us 51单片机定时器: 方式0 13位 最大定时时间间隔 2^13=8.192ms 方式1 16位 最大定时时间间隔 2^16=65.536ms 方式2 8位 最大定时时间间隔 2^8=256us STM32定时器的工作原理由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容 1.分频器(分频比) 2.定时计数器的值 STM32定时器类型按功能划分 ● 2个高级控制定时器 TIM1 TIM8 可分配6个通道的三相PWM发生器(多用于电机控制) ● 4个普通定时器 TIM2 TIM3 TIM4 TIM5 每个定时器有4个输入捕获/输出比较/PWM/脉冲计数 STM32定时器类型 ● 2个基本定时器 TIM6 TIM7 主要用于产生DAC触发信号 ● 2个看门狗定时器—— 独立看门狗 窗口看门狗 ● 系统时基定时器 SysTick 24位递减计数器 自动重加载,欢迎点击下载stm32定时器例程PPT课件。

stm32定时器例程PPT课件是由红软PPT免费下载网推荐的一款仪器设备PPT类型的PowerPoint.

新语新知 STM32的定时器使用 STM32定时器的工作原理 STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振) T = 1/F F为频率例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为 12MHz / 12 = 1MHz T = 1 / 1MHz = 1us STM32定时器的工作原理最小定时时间 T = 1 / 1MHz = 1us 51单片机定时器: 方式0 13位 最大定时时间间隔 2^13=8.192ms 方式1 16位 最大定时时间间隔 2^16=65.536ms 方式2 8位 最大定时时间间隔 2^8=256us STM32定时器的工作原理由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容 1.分频器(分频比) 2.定时计数器的值 STM32定时器类型按功能划分 ● 2个高级控制定时器 TIM1 TIM8 可分配6个通道的三相PWM发生器(多用于电机控制) ● 4个普通定时器 TIM2 TIM3 TIM4 TIM5 每个定时器有4个输入捕获/输出比较/PWM/脉冲计数 STM32定时器类型 ● 2个基本定时器 TIM6 TIM7 主要用于产生DAC触发信号 ● 2个看门狗定时器—— 独立看门狗 窗口看门狗 ● 系统时基定时器 SysTick 24位递减计数器 自动重加载 常用于产生延时 us级 ms级 STM32定时器的时钟 CK_CNT 表示定时器工作频率 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=100us 100us × 10 000 = 1S 结论 :分频比7199 定时计数器的值 10 000 普通定时器相关的寄存器介绍及配制方法 第一步:打开(使能)相应定时器的时钟信号 由于普通定时器使用的是低速外部时钟信号APB1,所以我们使能时钟信号时要采用函数: void RCC_APB1PeriphClockCmd (uint32_t RCC_APB1Periph, FunctionalState NewState ) 第二步:配置四个寄存器的内容 计数器寄存器:TIMx_CNT 预分频器寄存器:TIMx_PSC 自动装载寄存器:TIMx_ARR (以上3个寄存器合起来成为时基单元) 控制寄存器:TIMx_CR1 计数器寄存器:TIMx_CNT 16位的计数器,设定值从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 寄存器操作编程 void Timer3_Init(u16 arr,u16 psc) { RCC->APB1ENR |= 1 << 1; TIM3->ARR = arr;//设置重装载值 TIM3->PSC = psc;//设置分频系数 TIM3->DIER |= 1 << 0;//允许更新中断 TIM3->DIER |= 1 << 6;//允许TIME中断 TIM3->CR1 |= 1 << 0; MY_NVIC_Init(3,3,TIM3_IRQChannel,2); } 固件库操作编程 void Timer_Config(void) { TIM_TimeBaseInitTypeDef 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_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 (Nested Vectored Interrupt Controller),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_InitTypeDef NVIC_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的中断服务函数 void TIM5_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)编写中断服务函数。w6j红软基地

展开

同类推荐

热门PPT

相关PPT