×
单片机 > 单片机程序设计 > 详情

【STM32H7教程】第32章 STM32H7的TIM定时器基础知识和HAL库API

发布时间:2020-06-09 发布时间:
|

32.1 初学者重要提示

  学习定时器外设推荐从硬件框图开始了解基本的功能特性,然后逐步深入了解各种特性,这种方式方便记忆和以后查阅。


  STM32H7的TIM1-TIM17中断入口函数名使用时要注意,别搞错了:

TIM1_BRK_IRQHandler             

TIM1_UP_IRQHandler              

TIM1_TRG_COM_IRQHandler        

TIM1_CC_IRQHandler                                                    

TIM2_IRQHandler                                           

TIM3_IRQHandler                                                 

TIM4_IRQHandler                 

TIM5_IRQHandler            

TIM6_DAC_IRQHandler           

TIM7_IRQHandler 

TIM8_BRK_TIM12_IRQHandler     

TIM8_UP_TIM13_IRQHandler       

TIM8_TRG_COM_TIM14_IRQHandler 

TIM8_CC_IRQHandler          

TIM15_IRQHandler 

TIM16_IRQHandler 

TIM17_IRQHandler

32.2 定时器基础知识

注,不同定时支持的功能略有区别,基础定时器功能较少,TIM1和TIM8高级定时器功能多些。


  TIM2和TIM5是32位定时器,其它定时器都是16位定时器。16位和32位的区别是CNT计数器范围不同,32位的范围是0 到2^32 – 1,而16位的是0到65535;它们支持的分频是范围是一样的,都是1到65535。

  计数器支持递增、递减和递增/递减二合一。

  多个独立通道,可用于:

– 输入捕获。


– 输出比较。


– PWM 生成(边沿和中心对齐模式)。


– 单脉冲模式输出。



  发生如下事件时生成中断/DMA 请求:

– 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)


– 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)


– 输入捕获


– 输出比较


  支持增量式编码器和霍尔传感器。

32.2.1 定时器TIM1-TIM17的区别

STM32H7支持的定时器有点多,要简单的区分下。STM32H7支持TIM1-TIM8,TIM12-TIM17共14个定时器,而中间的TIM9,TIM10,TIM11是不存在的,这点要注意。


粗略的比较如下:

通过上面的表格,至少要了解到以下两点:


  STM32H7的定时器主要分为高级定时器,通用定时器,基础定时器和低功耗定时器。

  TIM2和TIM5是32位定时器,其它都是16位定时器。

32.2.2 定时器的硬件框图

认识一个外设,最好的方式就是看他的框图,方便我们快速的了解定时器的基本功能,然后再看手册了解细节。


下面我们直接看最复杂的高级定时器TIM1&TIM8框图:

通过这个框图,我们可以得到如下信息:


  TIMx_ETR接口

外部触发输入接口。ETR支持多种输入源:输入引脚(默认配置)、比较器输出和模拟看门狗。


  截图左侧的TIMx_CH1,TIMx_CH2,TIMx_CH3和TIMx_CH4接口

这四个通道主要用于输入捕获,可以计算波形频率和脉宽。                                                                                                                             


  TIMx_BKIN和TIMx_BKIN2接口

断路功能,主要用于保护由 TIM1 和 TIM8 定时器产生的 PWM 信号所驱动的功率开关


  TRGO内部输出通道

主要用于定时器级联,ADC和DAC的定时器触发。


  6组输出比较单元OC1到OC6

OC1到OC4有对应的输出引脚,而OC5和OC6没有对应的输出引脚,主要用于内部控制。


  截图右侧的输出比较通道TIMx_CH1,TIMx_CH1N,TIMx_CH2,TIMx_CH2N,TIMx_CH3,TIMx_CH3N和TIMx_CH4

主要用于PWM输出,注意CH1到CH3有互补输出,而CH4没有互补输出。


  其它框图里面未展示出来功能

定时器TIM1&TIM8还支持的其它功能在用到的时候再做说明。


32.2.3 定时器的时基单元

定时器要工作就需要一个基本时基单元,而基本的时基单元是由下面几个寄存器组成的:


  预分频器寄存器 (TIMx_PSC)

用于设置定时器的分频,比如定时器的主频是200MHz,通过此寄存器可以将其设置为100MHz,50MHz,25MHz等分频值。


注:预分频器有个缓冲功能,可以让用户实时更改,新的预分频值将在下一个更新事件发生时被采用(以递增计数模式为例,就是CNT计数值达到ARR自动重装寄存器的数值时会产生更新事件)。


  计数器寄存器 (TIMx_CNT)

计数器是最基本的计数单元,计数值是建立在分频的基础上面,比如通过TIMx_PSC设置分频后的频率为100MHz,那么计数寄存器计一次数就是10ns。


  自动重载寄存器 (TIMx_ARR)

自动重装寄存器是CNT计数寄存器能达到的最大计数值,以递增计数模式为例,就是CNT计数器达到ARR寄存器数值时,重新从0开始计数。


注,自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存器。预装载寄存器的内容既可以立即传送到影子寄存器(让设置立即起到效果的寄存器),也可以在每次发生更新事件时传送到影子寄存器。简单的说就是让ARR寄存器的数值立即更新还是更新事件发送的时候更新。


  重复计数器寄存器 (TIMx_RCR)

以递增计数模式为例,当CNT计数器数值达到ARR自动重载数值时,重复计数器的数值加1,重复次数达到TIMx_RCR+ 1后就,将生成更新事件。


注,只有TIM1,TIM8,TIM15,TIM16,TIM17有此寄存器。


 


比如我们要配置定时器实现周期性的中断,主要使用这几个寄存器即可。


32.2.4 定时器输出比较(PWM)

使用定时器时基单元的那几个寄存器仅仅能设置周期,还不能设置占空比。针对这个问题,还需要比较捕获寄存CCR的参与,这样就可以设置占空比了。


为了方便大家理解,以PWM 边沿对齐模式,递增计数配置为例:


  当计数器TIMx_CNT < 比较捕获寄存器TIMx_CCRx期间,PWM参考信号OCxREF输出高电平。

  当计数器TIMx_CNT >= 比较捕获寄存器TIMx_CCRx期间, PWM参考信号OCxREF输出低电平。

  当比较捕获寄存器TIMx_CCRx > 自动重载寄存器TIMx_ARR,OCxREF保持为1。

  当比较捕获寄存器TIMx_CCRx = 0,则OCxRef保持为0。

下面是TIMx_ARR=8的波形效果:


32.2.5 定时器输入捕获

与PWM一样,使用定时器实现输入捕获,仅靠时基单元的那几个寄存器是不行的,我们需要一个寄存器来记录发生捕获时的具体时间,这个寄存器依然由比较捕获寄存器TIMx_CCRx来实现。


比如我们要测量一路方波的周期:


  配置定时器为输入捕获模式,上升沿触发,设置分频,自动重装等寄存器,比如设置的CNT计数器计数1次是1微秒。

  当有上升沿触发的时候,TIMx_CCRx寄存器就会自动记录当前的CNT数值,然后用户就可以通过CC中断,在中断复位程序里面保存当前的TIMx_CCRx寄存器数值。等下次再检测到上升沿触发,两次时间求差就可以得到方波的周期。

不过这里要特别注意一点,如果CNT发生溢出(比如16位定时器,计数到65535就溢出了)就需要特别处理下,将CNT计数溢出考虑进来。


32.3 定时器的HAL库用法

定时器的HAL库用法其实就是几个结构体变量成员的配置和使用,然后配置GPIO、时钟,并根据需要配置NVIC、中断和DMA。下面我们逐一展开为大家做个说明。


32.3.1 定时器寄存器结构体TIM_TypeDef

定时器相关的寄存器是通过HAL库中的结构体TIM_TypeDef定义的,在stm32h743xx.h中可以找到这个类型定义:


typedef struct

{

  __IO uint16_t CR1;         /*!< TIM control register 1,                   Address offset: 0x00 */

uint16_t RESERVED0; /*!< Reserved, 0x02


关键字:STM32H7  TIM定时器  HAL库  API

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些