历史上的今天
今天是: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 */
史海拾趣
|
我任务是修改开发板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;等等, ...… 查看全部问答> |
|
听别人说的,研讨会上说这个版本有BUG,用SWD调试时会卡在SystemInit()函数中,要在编译器的linker选项下重新设置库的入口。 怎样设置? 如果用jtag是不是就没这个问题了?… 查看全部问答> |
|
从信号发生器输出的一个正弦信号,通过什么方法能将其导入MIC接口,作为输入信号,将信号在ARM6410上编写的一个android的模拟示波器上显示出来。求知道的大侠们帮我一下 感激不尽!!… 查看全部问答> |
|
好东西不常有哟~~ 刚好今天找到一份有关跨阻型放大器的应用指南,出自TI高速应用工程师毛华平之手。 TIA 全称为trans-impedance amplifier,也就是跨阻型放大器。在需要电流转电压的应用场合, 如检测微弱光电流信号的场合, 通常需要用到跨阻型 ...… 查看全部问答> |




