历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2019年08月26日 | 【STM32H7教程】第32章 STM32H7的TIM定时器基础知识和HAL库API

2019-08-26 来源:eefocus

32.1 初学者重要提示

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

  STM32H7的定时器输出100MHz方波是完全没问题。http://forum.armfly.com/forum.php?mod=viewthread&tid=86434 。

  STM32H7定时器进出中断的速度能跑到12.5MHz,所有程序在TCM和Flash运行没差别。http://forum.armfly.com/forum.php?mod=viewthread&tid=90836 。

  STM32H7的定时器输入捕获可以实现12MHz方波的双边沿捕获,单边沿可以做到24MHz。http://forum.armfly.com/forum.php?mod=viewthread&tid=91283。

  特别注意STM32H7的TIM1,8,15,16,17才有RCR重复计数器,其它都没用的。

  STM32H7的单个定时器中不同通道可以配置不同频率PWM。http://forum.armfly.com/forum.php?mod=viewthread&tid=89008 。

  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      <------------------要注意,定时器12也是用的这个

TIM8_UP_TIM13_IRQHandler       <------------------要注意,定时器13也是用的这个

TIM8_TRG_COM_TIM14_IRQHandler  <------------------要注意,定时器14也是用的这个

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 生成(边沿和中心对齐模式)。


– 单脉冲模式输出。


  带死区插入,断路功能和PWM互补输出,效果可看此贴:http://forum.armfly.com/forum.php?mod=viewthread&tid=88997 。

  发生如下事件时生成中断/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                                                 */

  __IO uint32_t CR2;         /*!< TIM control register 2,                   Address offset: 0x04 */

  __IO uint32_t SMCR;        /*!< TIM slave mode control register,          Address offset: 0x08 */

  __IO uint32_t DIER;        /*!< TIM DMA/interrupt enable register,        Address offset: 0x0C */

  __IO uint32_t SR;          /*!< TIM status register,                      Address offset: 0x10 */

  __IO uint32_t EGR;         /*!< TIM event generation register,            Address offset: 0x14 */

  __IO uint32_t CCMR1;       /*!< TIM capture/compare mode register 1,      Address offset: 0x18 */

  __IO uint32_t CCMR2;       /*!< TIM capture/compare mode register 2,      Address offset: 0x1C */

  __IO uint32_t CCER;        /*!< TIM capture/compare enable register,      Address offset: 0x20 */

  __IO uint32_t CNT;         /*!< TIM counter register,                     Address offset: 0x24 */

  __IO uint16_t PSC;         /*!< TIM prescaler,                            Address offset: 0x28 */

  uint16_t      RESERVED9;   /*!< Reserved, 0x2A                                                 */

  __IO uint32_t ARR;         /*!< TIM auto-reload register,                 Address offset: 0x2C */

  __IO uint16_t RCR;         /*!< TIM repetition counter register,          Address offset: 0x30 */

  uint16_t      RESERVED10;  /*!< Reserved, 0x32                                                 */

  __IO uint32_t CCR1;        /*!< TIM capture/compare register 1,           Address offset: 0x34 */

  __IO uint32_t CCR2;        /*!< TIM capture/compare register 2,           Address offset: 0x38 */

  __IO uint32_t CCR3;        /*!< TIM capture/compare register 3,           Address offset: 0x3C */

  __IO uint32_t CCR4;        /*!< TIM capture/compare register 4,           Address offset: 0x40 */

  __IO uint32_t BDTR;        /*!< TIM break and dead-time register,         Address offset: 0x44 */

  __IO uint16_t DCR;         /*!< TIM DMA control register,                 Address offset: 0x48 */

  uint16_t      RESERVED12;  /*!< Reserved, 0x4A                                                 */

  __IO uint16_t DMAR;        /*!< TIM DMA address for full transfer,        Address offset: 0x4C */

  uint16_t      RESERVED13;  /*!< Reserved, 0x4E                                                 */

  uint16_t      RESERVED14;  /*!< Reserved, 0x50                                                 */

推荐阅读

史海拾趣

Easy Magnet Corp公司的发展小趣事

随着环保意识的提高,Easy Magnet Corp公司开始关注产品的环保性能。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还积极参与环保公益活动,倡导绿色消费理念。这些举措不仅提升了公司的社会形象,也吸引了更多注重环保的消费者。

ELM Technology Corporation公司的发展小趣事

ELM Technology Corporation自创立之初,就致力于电子技术的研发与创新。公司聚集了一批顶尖的科研人才,不断探索新的电子技术和解决方案。在某一关键时期,ELM推出了一款具有革命性的电子产品,该产品在市场上引起了巨大反响,不仅极大地提升了用户体验,还推动了整个电子行业的发展。通过不断的技术创新,ELM逐渐在电子行业中树立了领先地位。

EVERLIGHT公司的发展小趣事

面对未来,EVERLIGHT有着明确的发展规划。公司将继续加大研发投入,不断推出创新型的LED产品和技术解决方案。同时,公司还将加强与国际知名品牌的合作,拓展更广阔的市场空间。此外,EVERLIGHT还将积极应对市场变化和竞争挑战,不断提升自身的核心竞争力和市场影响力。在未来的发展中,EVERLIGHT将继续秉持创新、品质、环保的理念,为电子行业的发展做出更大的贡献。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

面对未来,EVERLIGHT有着明确的发展规划。公司将继续加大研发投入,不断推出创新型的LED产品和技术解决方案。同时,公司还将加强与国际知名品牌的合作,拓展更广阔的市场空间。此外,EVERLIGHT还将积极应对市场变化和竞争挑战,不断提升自身的核心竞争力和市场影响力。在未来的发展中,EVERLIGHT将继续秉持创新、品质、环保的理念,为电子行业的发展做出更大的贡献。

ADL [ADL Embedded Solutions Inc]公司的发展小趣事

EVERLIGHT公司的故事始于1983年,当时台湾的电子产业正迎来蓬勃发展的时期。创始人凭借对LED(发光二极管)技术的深刻洞察,决定创立EVERLIGHT,专注于LED的研发和生产。公司从一开始就注重技术创新,投入大量资源研发新型LED产品,不断提高产品的亮度和稳定性。随着技术的不断突破,EVERLIGHT逐渐在LED市场上崭露头角。

Antex公司的发展小趣事

Antex公司始于1917年,当时它主要从事锻件的制造和销售。这一时期的Antex,凭借着对锻造技术的深入研究和不断创新,逐渐在电子行业中崭露头角。公司注重产品质量和客户需求,通过设计、锻造、机械加工、装配的一站式服务,赢得了客户的信赖。

问答坊 | AI 解惑

求助:关于微带线,共面线和带状线等传输线的工作原理

各位大侠们,麻烦介绍一下,微带线,共面线和带状线等几种传输线的工作原理呀,最好详细一点..谢谢了先…

查看全部问答>

关于wince下键盘驱动的问题

我任务是修改开发板bsp里的关于键盘的driver程序(操作系统是wince5.0),从而可以用在另外自己设计的键盘上。程序研究了几天,有一些问题: 1.EINT_IRQ[0]=IRQ_EINT5;EINT_IRQ[1]=IRQ_EINT6;EINT_IRQ[2]=IRQ_EINT7;EINT_IRQ[3]=IRQ_EINT8;等等, ...…

查看全部问答>

串口通讯校验和问题(100分)

  格式:      ESC+ID+COMMAND+DATA+CHECKSUM+END(ASCII 码传送)   说明:         名称         内容     长度( ...…

查看全部问答>

今天是10月11日了!几时开始派发学习板啊?

  盯了好久了,可是一点眉目都没有,一个字急啊!…

查看全部问答>

请问版主主,外设库3.3.0版本有BUG吗?

听别人说的,研讨会上说这个版本有BUG,用SWD调试时会卡在SystemInit()函数中,要在编译器的linker选项下重新设置库的入口。 怎样设置? 如果用jtag是不是就没这个问题了?…

查看全部问答>

关于将外部正弦信号导入音频MIC接口的问题

从信号发生器输出的一个正弦信号,通过什么方法能将其导入MIC接口,作为输入信号,将信号在ARM6410上编写的一个android的模拟示波器上显示出来。求知道的大侠们帮我一下  感激不尽!!…

查看全部问答>

【TI精选】跨阻型放大器应用指南

好东西不常有哟~~ 刚好今天找到一份有关跨阻型放大器的应用指南,出自TI高速应用工程师毛华平之手。 TIA 全称为trans-impedance amplifier,也就是跨阻型放大器。在需要电流转电压的应用场合, 如检测微弱光电流信号的场合, 通常需要用到跨阻型 ...…

查看全部问答>

寻找一种传感器

我需要做一个在线测量电池长度的设计,请问有没有一种光学传感器能够射出一排光线,另一端有接收端,当电池经过时会挡住部分光线,通过被挡住的光线多少来确定电池的长度。请问有这样的传感器吗?这种传感器叫什么名字?有没有推荐的厂家和型号啊? ...…

查看全部问答>

向入手一块嵌入式开发板,请使用过的朋友推荐一款

本人最近想入手一块Linux开发板,请有用过的朋友推荐一款,最好是A8,A9系列的。…

查看全部问答>

博大电源模块

菜鸟一个,项问下各位大神,有没有使用博大电源的?博大电源模块型号FED40(W)和HAE75W,这两款的使用手册急需急需,谢谢!…

查看全部问答>