[STM32H7 教程] 第 63 章 STM32H7 高分辨率定时器 HRTIM 基础知识和 HAL 库 API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
第63章 STM32H7的高分辨率定时器HRTIM基础知识和HAL库API
本章节为大家讲解高分辨率定时器(High-Resolution Timer)的基础知识和对应的HAL库API。
63.1 初学者重要提示
63.2 HRTIM基础知识
63.3 HRTIM定时器的HAL库用法
63.4 源文件stm32h7xx_hal_hrtim.c
63.5 总结
63.1 初学者重要提示
- 高分辨率定时器可以产生多达10路高分辨率信号。它主要用数字电源、照明,电源耗材,太阳能逆变器和无线充电等应用场合,当然,也可以作为通用目的。
- HRTIM模块化的架构允许产生独立或者叠加波形。通过带的时序控制单元和各种外部事件的配合,可以产生各种信号PWM,相移等。
- HRTIM定时器还具有定时测量功能和链接到内置ADC和DAC转换器。 并且它还具有轻载管理模式和能够处理各种故障的方案以实现安全关闭。
- HRTIM有多个中断入口函数,使用的时候别搞错了:
HRTIM1_Master_IRQHandler
HRTIM1_TIMA_IRQHandler
HRTIM1_TIMB_IRQHandler
HRTIM1_TIMC_IRQHandler
HRTIM1_TIMD_IRQHandler
HRTIM1_TIME_IRQHandler
HRTIM1_FLT_IRQHandler
63.2 HRTIM基础知识
-
HRTIM由6个定时器组成,分别是1个主定时器(Master Timer)和5个独立的定时器单元,从Timer A到Timer E。
- 这6个都是16bit定时器,每个定时器都包含 1 个独立计数器和 4 个比较单元。
- 主定时器(Master Timer):
基于 16 位递增计数器。它可通过 4 个比较单元置位/ 复位 10 路输出中的任何一路,并向 5 个定时器单元提供同步信号。其主要用途是使定时器单元受唯一的时钟源控制。交错降压转换器是一个典型的应用示例,主定时器在其中管理多个单元之间的相移。
-
- 5个定时器Timer A到Timer E:
既可以独立工作,也可以与其它定时器(包括主定时器)配合工作。每个定时器都可控制两路输出。输出置位/复位事件可以由定时单元比较寄存器触发,或者由主定时器事件、其他定时器的事件或外部事件触发。
-
- 每个定时器的两路输出:
- 支持PWM互补输出,支持添加死区时间。
- 将载波频率添加到调制信号上。
- 通过将异步输出置为预定义的安全电平来管理故障事件。
- 每个定时器的两路输出:
-
10个外部事件,可用于任何定时器单元。
- 可编程极性和边沿有效性。
- 5个事件用于快速异步模式。
- 5个事件用于可编程数字滤波器。
- 利用消隐和窗口模式实现伪事件过滤。
-
多条通道可连接到内置模拟外设。
- 4个用于 ADC 转换器的触发信号。
- 3个用于 DAC 转换器的触发信号。
- 3个用于比较器。
-
丰富的保护机制。
- 5 路故障输入可组合使用,而且可以关联到任何定时单元。
- 可编程极性和边沿有效性。
- 对谐振变换器配有专门的延时保护。
- 不同HRTIM之间可以做同步输入/输出。
63.2.1 定时器的硬件框图
认识一个外设,最好的方式就是看他的框图,方便我们快速的了解HRTIM的基本功能,然后再看手册了解细节。
下面我们直接看HRTIM的框图:
通过这个框图,我们可以得到如下信息:
- hrtim_in_sync[3:1]
同步输入端,将HRTIM与其他内部或外部定时器资源进行同步输入:
hrtim_in_sync[1]:保留。
hrtim_in_sync[2]:时钟源为通用TIMx定时器(通过片上互连)。
hrtim_in_sync[3]:时钟源为外部HRTIM(通过HRTIM_SCIN输入引脚)。
- hrtim_out_sync[2:1]
同步输出端,用于级联或同步多个片上或片外HRTIM,由于H7只有一个HRTIM,所以只能同步其它器件上带的HRTIM。
hrtim_out_sync[1]:保留。
hrtim_out_sync[2]:目标为片外 HRTIM 或外设(通过HRTIM_SCOUT输出引脚)。
- hrtim_adc_trg[4:1]
输出端,用于触发ADC转换。
- hrtim_dac_trg[3:1]
输出端,用于触发DAC转换。
- hrtim_mst_it[7:1]
输出端,用于发出中断请求。
- hrtim_dma[6:1]
输出端,用于发出DMA请求。
- hrtim_pclk
输入端,APB时钟。
- hrtim_ker_ck
输出端, HRTIM内核时钟。
- hrtim_evtX[4:1] 大写字母X的范围是1到10。
输入端,用于接收外部事件,支持接收10个事件,每个事件有4种输入源可以选择,可选择片上(来自其他内置外设:比较器、ADC模拟看门狗、TIMx定时器、触发输出等)或片外(HRTIM_EEVx输入引脚)。
- HRTIM_FLT[5:1]
hrtim_in_flt[5:1]
故障输入端,5 路片上输入和 5 路片外HRTIM_FLTx 输入。
当输入信号有效时立即禁止HRTIM 输出。
- hrtim_sys_flt
系统故障输入,比如时钟安全系统、 SRAM奇偶校验错误、 Cortex®-M7 LOCKUP (HardFault)、 PVD输出等。
- hrtim_upd_en[3:1]
输入端,HRTIM寄存器更新使能(片上互连)会触发从影子寄存器到活动寄存器的传输。
- hrtim_bm_trg
输入端,突发模式触发事件。
- hrtim_bm_ck
输入端,突发模式时钟。
- HRTIM_CHA1
- HRTIM_CHA2
- HRTIM_CHB1
- HRTIM_CHB2
- HRTIM_CHC1
- HRTIM_CHC2
- HRTIM_CHD1
- HRTIM_CHD2
- HRTIM_CHE1
- HRTIM_CHE2
对应定时器单元Timer A,B,C,D,E的输出,每个定时器有两路。
63.2.2 HRTIM时钟选择
HRTIM支持两种时钟输入,一个是通用定时器时钟输入,另一个是CPU主频时钟输入:
反映到程序代码上,通过下两个宏定义参数区分:
#define RCC_HRTIM1CLK_TIMCLK ((uint32_t)0x00000000) #define RCC_HRTIM1CLK_CPUCLK RCC_CFGR_HRTIMSEL
- 使用CPU主频时钟,对应参数RCC_HRTIM1CLK_CPUCLK
- 使用通用定时器时钟,对应参数RCC_HRTIM1CLK_TIMCLK。如果CPU主频时钟是400MHz的话,通用定时器时钟就是200MHz。
- 具体实现,通过函数HAL_RCCEx_PeriphCLKConfig来配置:
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_HRTIM1; PeriphClkInitStruct.Hrtim1ClockSelection = RCC_HRTIM1CLK_TIMCLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }
63.2.3 HRTIM主定时器
HRTIM的主定时器框图:
对于这个框图,了解到以下几点即可:
- 主定时器有1个计数器,4个比较单元,但没有捕获单元和输出。
- 主定时器的控制寄存器包含主定时器Master Timer和定时单元Timer A到E的所有定时器使能位。
63.2.4 HRTIM定时器单元(Timer A到E)
5个定时器单元的Timer A到E都是一样的,框图如下:
对于这个框图,了解到以下几点即可:
- 有1个计数器,4个比较单元,2个捕获单元,带两个输出。
- 比较单元2和比较单元4支持自带延迟。
- 事件消隐和窗口模式可以实现伪事件过滤。
- REP,CMP1,CMP2,CMP3,CMP和定时器更新这几个信号可以设置输出端的置位/复位。
63.2.5 HRTIM的分辨率
STM32H7的主频配置为400MHz时,那么HRTIM的时钟最高就是400MHz。对于H7系列,HRTIM不支持倍频设置,仅支持1分频,2分频和4分频:
H7系列与F3以及G4的对比:
分辨率最高是G4系列,可以做到184ps。
63.2.6 HRTIM的PWM多路输出实现
这里我们先来看下单路PWM输出:
寄存器HRTIM_PERxR存储定时器的周期,寄存器HRTIM_CMP1xR存储比较值。执行过程如下:
- 计数器Counter计数到HRTIM_CMP1xR存储的比较值时,HRTIM_CHD1输出端复位。
- 计数到HRTIM_PERxR时,HRTIM_CHD1输出端置位,并且Counter重新从头开始计数。
理解了单路PWM输出后,再看实现这个功能对应的框图就很好理解了:
接下来再来看多路PWM输出:
截图上半部分波形是Timer D输出两路:
- HRTIM_CHD1输出是通过CMP1以及计数更新实现输出的置位/复位。
- HRTIM_CHD2输出是通过CMP2以及计数更新实现输出的置位/复位。
截图下半部分波形是Timer A输出两路:
- HRTIM_CHA1输出是通过CMP1以及计数更新实现输出的置位/复位。
- HRTIM_CHA2输出是通过CMP2,CMP3以及计数更新实现输出的置位/复位。
63.3 HRTIM定时器的HAL库用法
HRTIM的HAL库用法其实就是几个结构体变量成员的配置和使用,然后配置GPIO、时钟,并根据需要配置NVIC、中断和DMA。下面我们逐一展开为大家做个说明。
63.3.1 定时器寄存器结构体HRTIM_TypeDef
定时器相关的寄存器是通过HAL库中的结构体HRTIM_TypeDef定义的,在stm32h743xx.h中可以找到这个定义类型:
typedef struct { HRTIM_Master_TypeDef sMasterRegs; HRTIM_Timerx_TypeDef sTimerxRegs[5]; uint32_t RESERVED0[32]; HRTIM_Common_TypeDef sCommonRegs; }HRTIM_TypeDef; typedef struct { __IO uint32_t MCR; __IO uint32_t MISR; __IO uint32_t MICR; __IO uint32_t MDIER; __IO uint32_t MCNTR; __IO uint32_t MPER; __IO uint32_t MREP; __IO uint32_t MCMP1R; uint32_t RESERVED0; __IO uint32_t MCMP2R; __IO uint32_t MCMP3R; __IO uint32_t MCMP4R; uint32_t RESERVED1[20]; }HRTIM_Master_TypeDef; typedef struct { __IO uint32_t TIMxCR; __IO uint32_t TIMxISR; __IO uint32_t TIMxICR; __IO uint32_t TIMxDIER; __IO uint32_t CNTxR; __IO uint32_t PERxR; __IO uint32_t REPxR; __IO uint32_t CMP1xR; __IO uint32_t CMP1CxR; __IO uint32_t CMP2xR; __IO uint32_t CMP3xR; __IO uint32_t CMP4xR; __IO uint32_t CPT1xR; __IO uint32_t CPT2xR; __IO uint32_t DTxR; __IO uint32_t SETx1R; __IO uint32_t RSTx1R; __IO uint32_t SETx2R; __IO uint32_t RSTx2R; __IO uint32_t EEFxR1; __IO uint32_t EEFxR2; __IO uint32_t RSTxR; __IO uint32_t CHPxR; __IO uint32_t CPT1xCR; __IO uint32_t CPT2xCR; __IO uint32_t OUTxR; __IO uint32_t FLTxR; uint32_t RESERVED0[5]; }HRTIM_Timerx_TypeDef; typedef struct { __IO uint32_t CR1; __IO uint32_t CR2; __IO uint32_t ISR; __IO uint32_t ICR; __IO uint32_t IER; __IO uint32_t OENR; __IO uint32_t ODISR; __IO uint32_t ODSR; __IO uint32_t BMCR; __IO uint32_t BMTRGR; __IO uint32_t BMCMPR; __IO uint32_t BMPER; __IO uint32_t EECR1; __IO uint32_t EECR2; __IO uint32_t EECR3; __IO uint32_t ADC1R; __IO uint32_t ADC2R; __IO uint32_t ADC3R; __IO uint32_t ADC4R; __IO uint32_t RESERVED0; __IO uint32_t FLTINR1; __IO uint32_t FLTINR2; __IO uint32_t BDMUPR; __IO uint32_t BDTAUPR; __IO uint32_t BDTBUPR; __IO uint32_t BDTCUPR; __IO uint32_t BDTDUPR; __IO uint32_t BDTEUPR; __IO uint32_t BDMADR; }HRTIM_Common_TypeDef;
这个结构体的成员名称和排列次序和CPU的定时器寄存器是一 一对应的。
__IO表示volatile, 这是标准C语言中的一个修饰字,表示这个变量是非易失性的,编译器不要将其优化掉。core_m7.h 文件定义了这个宏:
#define __O volatile /*!< Defines 'write only' permissions */ #define __IO volatile /*!< Defines 'read / write' permissions */
下面我们看下定时器的定义,在stm32h743xx.h文件。
#define PERIPH_BASE (0x40000000UL) #define D2_APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) #define HRTIM1_BASE (D2_APB2PERIPH_BASE + 0x7400UL) #define HRTIM1_TIMA_BASE (HRTIM1_BASE + 0x00000080UL) #define HRTIM1_TIMB_BASE (HRTIM1_BASE + 0x00000100UL) #define HRTIM1_TIMC_BASE (HRTIM1_BASE + 0x00000180UL) #define HRTIM1_TIMD_BASE (HRTIM1_BASE + 0x00000200UL) #define HRTIM1_TIME_BASE (HRTIM1_BASE + 0x00000280UL) #define HRTIM1_COMMON_BASE (HRTIM1_BASE + 0x00000380UL) #define HRTIM1 ((HRTIM_TypeDef *) HRTIM1_BASE)<----- 展开这个宏,(HRTIM_TypeDef *)0x40017400 #define HRTIM1_TIMA ((HRTIM_Timerx_TypeDef *) HRTIM1_TIMA_BASE) #define HRTIM1_TIMB ((HRTIM_Timerx_TypeDef *) HRTIM1_TIMB_BASE) #define HRTIM1_TIMC ((HRTIM_Timerx_TypeDef *) HRTIM1_TIMC_BASE) #define HRTIM1_TIMD ((HRTIM_Timerx_TypeDef *) HRTIM1_TIMD_BASE) #define HRTIM1_TIME ((HRTIM_Timerx_TypeDef *) HRTIM1_TIME_BASE) #define HRTIM1_COMMON ((HRTIM_Common_TypeDef *) HRTIM1_COMMON_BASE)
我们访问HRTIM的MCR寄存器可以采用这种形式:HRTIM1->sMasterRegs.MCR = 0;
63.3.2 定时器初始化结构体HRTIM_InitTypeDef
此结构体主要用于HRTIM初始化,定义如下:
typedef struct { uint32_t HRTIMInterruptResquests; uint32_t SyncOptions; uint32_t SyncInputSource; uint32_t SyncOutputSource; uint32_t SyncOutputPolarity; } HRTIM_InitTypeDef;
下面将这几个参数一 一做个说明。
- HRTIMInterruptResquests
用于配置支持的中断请求,支持的模式较多:
#define HRTIM_IT_NONE 0x00000000U /*!< No interrupt enabled */ #define HRTIM_IT_FLT1 HRTIM_IER_FLT1 /*!< Fault 1 interrupt enable */ #define HRTIM_IT_FLT2 HRTIM_IER_FLT2 /*!< Fault 2 interrupt enable */ #define HRTIM_IT_FLT3 HRTIM_IER_FLT3 /*!< Fault 3 interrupt enable */ #define HRTIM_IT_FLT4 HRTIM_IER_FLT4 /*!< Fault 4 interrupt enable */ #define HRTIM_IT_FLT5 HRTIM_IER_FLT5 /*!< Fault 5 interrupt enable */ #define HRTIM_IT_SYSFLT HRTIM_IER_SYSFLT /*!< System Fault interrupt enable */ #define HRTIM_IT_BMPER HRTIM_IER_BMPER /*!< Burst mode period interrupt enable */
- SyncOptions
配置HRTIM作为Master,发送同步信号,或者作为Slave,接收同步信号。
#define HRTIM_SYNCOPTION_NONE 0x00000000U #define HRTIM_SYNCOPTION_MASTER 0x00000001U /* 作为MASTER, 同步输出SYNCOUT */ #define HRTIM_SYNCOPTION_SLAVE 0x00000002U /* 作为SLAVE, 同步输入SYNCIN */
- SyncInputSource
设置外部同步输入源,只有当HRTIM配置为Slave时才可以使用。
#define HRTIM_SYNCINPUTSOURCE_NONE 0x00000000U /* 片上定时器做同步输入源 */ #define HRTIM_SYNCINPUTSOURCE_INTERNALEVENT HRTIM_MCR_SYNC_IN_1 /* 外部输入引脚SYNCIN做同步输入源 */ #define HRTIM_SYNCINPUTSOURCE_EXTERNALEVENT (HRTIM_MCR_SYNC_IN_1 | HRTIM_MCR_SYNC_IN_0)
- SyncOutputSource
设置同步脉冲输出源,只有当HRTIM配置为Master时才可以使用。
/* 主定时器启动事件触发SYNCOUT引脚发送脉冲 */ #define HRTIM_SYNCOUTPUTSOURCE_MASTER_START 0x00000000U /* 主定时器比较1事件触发SYNCOUT引脚发送脉冲 */ #define HRTIM_SYNCOUTPUTSOURCE_MASTER_CMP1 (HRTIM_MCR_SYNC_SRC_0) /* Timer A启动或者复位事件触发SYNCOUT引脚发送脉冲 */ #define HRTIM_SYNCOUTPUTSOURCE_TIMA_START (HRTIM_MCR_SYNC_SRC_1) /* Timer A比较1事件触发SYNCOUT引脚发送脉冲 */ #define HRTIM_SYNCOUTPUTSOURCE_TIMA_CMP1 (HRTIM_MCR_SYNC_SRC_1 | HRTIM_MCR_SYNC_SRC_0)
- SyncOutputPolarity
同步输出极性。
/* 同步输出关闭 */ #define HRTIM_SYNCOUTPUTPOLARITY_NONE 0x00000000U /* SCOUT引脚空闲状态是低电平,发送一个长度为16个HRTIM时钟周期的正脉冲 */ #define HRTIM_SYNCOUTPUTPOLARITY_POSITIVE (HRTIM_MCR_SYNC_OUT_1) /* SCOUT引脚空闲状态是高电平,发送一个长度为16个HRTIM时钟周期的负脉冲 */ #define HRTIM_SYNCOUTPUTPOLARITY_NEGATIVE (HRTIM_MCR_SYNC_OUT_1 | HRTIM_MCR_SYNC_OUT_0)
63.3.3 定时器参数结构体HRTIM_TimerParamTypeDef
此结构体主要用于参数定义:
typedef struct { uint32_t CaptureTrigger1; uint32_t CaptureTrigger2; uint32_t InterruptRequests; uint32_t DMARequests; uint32_t DMASrcAddress; uint32_t DMADstAddress; uint32_t DMASize; } HRTIM_TimerParamTypeDef;
下面将这几个参数一 一做个说明。
- CaptureTrigger1
触发捕获单元1。
当HRTIM工作在Simple Mode,支持的参数如下:
#define HRTIM_EVENT_NONE (0x00000000U) /*!< Undefined event channel */ #define HRTIM_EVENT_1 (0x00000001U) /*!< External event channel 1 identifier */ #define HRTIM_EVENT_2 (0x00000002U) /*!< External event channel 2 identifier */ #define HRTIM_EVENT_3 (0x00000003U) /*!< External event channel 3 identifier */ #define HRTIM_EVENT_4 (0x00000004U) /*!< External event channel 4 identifier */ #define HRTIM_EVENT_5 (0x00000005U) /*!< External event channel 5 identifier */ #define HRTIM_EVENT_6 (0x00000006U) /*!< External event channel 6 identifier */ #define HRTIM_EVENT_7 (0x00000007U) /*!< External event channel 7 identifier */ #define HRTIM_EVENT_8 (0x00000008U) /*!< External event channel 8 identifier */ #define HRTIM_EVENT_9 (0x00000009U) /*!< External event channel 9 identifier */ #define HRTIM_EVENT_10 (0x0000000AU) /*!< External event channel 10 identifier */
当HRTIM工作在Waveform Mode,支持的参数如下:
#define HRTIM_CAPTURETRIGGER_NONE 0x00000000U #define HRTIM_CAPTURETRIGGER_UPDATE (HRTIM_CPT1CR_UPDCPT) #define HRTIM_CAPTURETRIGGER_EEV_1 (HRTIM_CPT1CR_EXEV1CPT) #define HRTIM_CAPTURETRIGGER_EEV_2 (HRTIM_CPT1CR_EXEV2CPT) #define HRTIM_CAPTURETRIGGER_EEV_3 (HRTIM_CPT1CR_EXEV3CPT) #define HRTIM_CAPTURETRIGGER_EEV_4 (HRTIM_CPT1CR_EXEV4CPT) #define HRTIM_CAPTURETRIGGER_EEV_5 (HRTIM_CPT1CR_EXEV5CPT) #define HRTIM_CAPTURETRIGGER_EEV_6 (HRTIM_CPT1CR_EXEV6CPT) #define HRTIM_CAPTURETRIGGER_EEV_7 (HRTIM_CPT1CR_EXEV7CPT) #define HRTIM_CAPTURETRIGGER_EEV_8 (HRTIM_CPT1CR_EXEV8CPT) #define HRTIM_CAPTURETRIGGER_EEV_9 (HRTIM_CPT1CR_EXEV9CPT) #define HRTIM_CAPTURETRIGGER_EEV_10 (HRTIM_CPT1CR_EXEV10CPT) #define HRTIM_CAPTURETRIGGER_TA1_SET (HRTIM_CPT1CR_TA1SET) #define HRTIM_CAPTURETRIGGER_TA1_RESET (HRTIM_CPT1CR_TA1RST) #define HRTIM_CAPTURETRIGGER_TIMERA_CMP1 (HRTIM_CPT1CR_TIMACMP1) #define HRTIM_CAPTURETRIGGER_TIMERA_CMP2 (HRTIM_CPT1CR_TIMACMP2) #define HRTIM_CAPTURETRIGGER_TB1_SET (HRTIM_CPT1CR_TB1SET) #define HRTIM_CAPTURETRIGGER_TB1_RESET (HRTIM_CPT1CR_TB1RST) #define HRTIM_CAPTURETRIGGER_TIMERB_CMP1 (HRTIM_CPT1CR_TIMBCMP1) #define HRTIM_CAPTURETRIGGER_TIMERB_CMP2 (HRTIM_CPT1CR_TIMBCMP2) #define HRTIM_CAPTURETRIGGER_TC1_SET (HRTIM_CPT1CR_TC1SET) #define HRTIM_CAPTURETRIGGER_TC1_RESET (HRTIM_CPT1CR_TC1RST) #define HRTIM_CAPTURETRIGGER_TIMERC_CMP1 (HRTIM_CPT1CR_TIMCCMP1) #define HRTIM_CAPTURETRIGGER_TIMERC_CMP2 (HRTIM_CPT1CR_TIMCCMP2) #define HRTIM_CAPTURETRIGGER_TD1_SET (HRTIM_CPT1CR_TD1SET) #define HRTIM_CAPTURETRIGGER_TD1_RESET (HRTIM_CPT1CR_TD1RST) #define HRTIM_CAPTURETRIGGER_TIMERD_CMP1 (HRTIM_CPT1CR_TIMDCMP1) #define HRTIM_CAPTURETRIGGER_TIMERD_CMP2 (HRTIM_CPT1CR_TIMDCMP2) #define HRTIM_CAPTURETRIGGER_TE1_SET (HRTIM_CPT1CR_TE1SET) #define HRTIM_CAPTURETRIGGER_TE1_RESET (HRTIM_CPT1CR_TE1RST) #define HRTIM_CAPTURETRIGGER_TIMERE_CMP1 (HRTIM_CPT1CR_TIMECMP1) #define HRTIM_CAPTURETRIGGER_TIMERE_CMP2 (HRTIM_CPT1CR_TIMECMP2)
- CaptureTrigger2
触发捕获单元2,支持的参数与CaptureTrigger1一样。
- InterruptRequests
定时器的中断请求使能。
- DMASrcAddress
DMA源地址。
- DMADstAddress
DMA目的地址。
- DMASize
DMA传输大小。
63.3.4 定时器时基配置HRTIM_TimeBaseCfgTypeDef
此结构体主要用于定时器时间基准配置:
typedef struct { uint32_t Period; uint32_t RepetitionCounter; uint32_t PrescalerRatio; uint32_t Mode; } HRTIM_TimeBaseCfgTypeDef;
下面将这几个参数一 一做个说:
- Period
定时器周期,至少3个HRTIM时钟周期,最大值0xFFDF。
- RepetitionCounter
重复周期计数器,最小值0x00,最大值0xFF。
- PrescalerRatio
用于设置定时器分频,对于H7系列,此参数仅支持分频,也就是下面参数的后三个:
#define HRTIM_PRESCALERRATIO_MUL32 (0x00000000U) #define HRTIM_PRESCALERRATIO_MUL16 (0x00000001U) #define HRTIM_PRESCALERRATIO_MUL8 (0x00000002U) #define HRTIM_PRESCALERRATIO_MUL4 (0x00000003U) #define HRTIM_PRESCALERRATIO_MUL2 (0x00000004U) /* STM32H7仅支持下面这三种 */ #define HRTIM_PRESCALERRATIO_DIV1 (0x00000005U) #define HRTIM_PRESCALERRATIO_DIV2 (0x00000006U) #define HRTIM_PRESCALERRATIO_DIV4 (0x00000007U)
- Mode
设置工作模式,支持的参数如下:
#define HRTIM_MODE_CONTINUOUS (0x00000008U) #define HRTIM_MODE_SINGLESHOT (0x00000000U) #define HRTIM_MODE_SINGLESHOT_RETRIGGERABLE (0x00000010U)
63.3.5 定时器配置HRTIM_TimerCfgTypeDef
此结构体主要用于定时器配置:
typedef struct { /* 下面这些参数支持所有定时器,含主定时器和Timer A到Timer E*/ uint32_t InterruptRequests; uint32_t DMARequests; uint32_t DMASrcAddress; uint32_t DMADstAddress; uint32_t DMASize; uint32_t HalfModeEnable; uint32_t StartOnSync; uint32_t ResetOnSync; uint32_t DACSynchro; uint32_t PreloadEnable; uint32_t UpdateGating; uint32_t BurstMode; uint32_t RepetitionUpdate; /* 下面这些参数仅支持Timer A到Timer E */ uint32_t PushPull; uint32_t FaultEnable; uint32_t FaultLock; uint32_t DeadTimeInsertion; uint32_t DelayedProtectionMode; uint32_t UpdateTrigger; uint32_t ResetTrigger; uint32_t ResetUpdate; } HRTIM_TimerCfgTypeDef;
下面将这几个参数一 一做个说:
- InterruptRequests
用于使能HRTIM的中断,支持的中断如下:
#define HRTIM_MASTER_IT_NONE 0x00000000U /*!< No interrupt enabled */ #define HRTIM_MASTER_IT_MCMP1 HRTIM_MDIER_MCMP1IE /*!< Master compare 1 interrupt enable */ #define HRTIM_MASTER_IT_MCMP2 HRTIM_MDIER_MCMP2IE /*!< Master compare 2 interrupt enable */ #define HRTIM_MASTER_IT_MCMP3 HRTIM_MDIER_MCMP3IE /*!< Master compare 3 interrupt enable */ #define HRTIM_MASTER_IT_MCMP4 HRTIM_MDIER_MCMP4IE /*!< Master compare 4 interrupt enable */ #define HRTIM_MASTER_IT_MREP HRTIM_MDIER_MREPIE /*!< Master Repetition interrupt enable */ #define HRTIM_MASTER_IT_SYNC HRTIM_MDIER_SYNCIE /*!< Synchronization input interrupt enable */ #define HRTIM_MASTER_IT_MUPD HRTIM_MDIER_MUPDIE /*!< Master update interrupt enable */
- DMARequests
用于设置支持的DMA请求,此参数支持两种类型的参数,下面是HRTIM Master支持的请求
#define HRTIM_MASTER_DMA_NONE 0x00000000U /*!< No DMA request enable */ #define HRTIM_MASTER_DMA_MCMP1 HRTIM_MDIER_MCMP1DE /*!< Master compare 1 DMA request enable */ #define HRTIM_MASTER_DMA_MCMP2 HRTIM_MDIER_MCMP2DE /*!< Master compare 2 DMA request enable */ #define HRTIM_MASTER_DMA_MCMP3 HRTIM_MDIER_MCMP3DE /*!< Master compare 3 DMA request enable */ #define HRTIM_MASTER_DMA_MCMP4 HRTIM_MDIER_MCMP4DE /*!< Master compare 4 DMA request enable */ #define HRTIM_MASTER_DMA_MREP HRTIM_MDIER_MREPDE /*!< Master Repetition DMA request enable */ #define HRTIM_MASTER_DMA_SYNC HRTIM_MDIER_SYNCDE /*!< Synchronization input DMA request enable */ #define HRTIM_MASTER_DMA_MUPD HRTIM_MDIER_MUPDDE /*!< Master update DMA request enable */
下面是HRTIM 的TIMER A到TIMER E支持的请求:
#define HRTIM_TIM_DMA_NONE 0x00000000U /*!< No DMA request enable */ #define HRTIM_TIM_DMA_CMP1 HRTIM_TIMDIER_CMP1DE /*!< Timer compare 1 DMA request enable */ #define HRTIM_TIM_DMA_CMP2 HRTIM_TIMDIER_CMP2DE /*!< Timer compare 2 DMA request enable */ #define HRTIM_TIM_DMA_CMP3 HRTIM_TIMDIER_CMP3DE /*!< Timer compare 3 DMA request enable */ #define HRTIM_TIM_DMA_CMP4 HRTIM_TIMDIER_CMP4DE /*!< Timer compare 4 DMA request enable */ #define HRTIM_TIM_DMA_REP HRTIM_TIMDIER_REPDE /*!< Timer repetition DMA request enable */ #define HRTIM_TIM_DMA_UPD HRTIM_TIMDIER_UPDDE /*!< Timer update DMA request enable */ #define HRTIM_TIM_DMA_CPT1 HRTIM_TIMDIER_CPT1DE /*!< Timer capture 1 DMA request enable */ #define HRTIM_TIM_DMA_CPT2 HRTIM_TIMDIER_CPT2DE /*!< Timer capture 2 DMA request enable */ #define HRTIM_TIM_DMA_SET1 HRTIM_TIMDIER_SET1DE /*!< Timer output 1 set DMA request enable */ #define HRTIM_TIM_DMA_RST1 HRTIM_TIMDIER_RST1DE /*!< Timer output 1 reset DMA request enable */ #define HRTIM_TIM_DMA_SET2 HRTIM_TIMDIER_SET2DE /*!< Timer output 2 set DMA request enable */ #define HRTIM_TIM_DMA_RST2 HRTIM_TIMDIER_RST2DE /*!< Timer output 2 reset DMA request enable */ #define HRTIM_TIM_DMA_RST HRTIM_TIMDIER_RSTDE /*!< Timer reset DMA request enable */ #define HRTIM_TIM_DMA_DLYPRT HRTIM_TIMDIER_DLYPRTDE /*!< Timer delay protection DMA request enable */
- DMASrcAddress
用于设置DMA源地址。
- DMADstAddress
用于设置DMA目的地址。
- DMASize
用于设置DMA大小。
- HalfModeEnable
用于使能Half Mode。
#define HRTIM_HALFMODE_DISABLED (0x00000000U) /* 禁止 */ #define HRTIM_HALFMODE_ENABLED (0x00000020U) /* 使能 */
- StartOnSync
设置同步输入端接收到上升沿信号后,是否启动定时器:
#define HRTIM_SYNCSTART_DISABLED (0x00000000U) /* 禁止 */ #define HRTIM_SYNCSTART_ENABLED (HRTIM_MCR_SYNCSTRTM) /* 使能 */
- ResetOnSync
设置同步输入端接收到上升沿信号后,是否复位定时器。
#define HRTIM_SYNCRESET_DISABLED (0x00000000U) /* 禁止 */ #define HRTIM_SYNCRESET_ENABLED (HRTIM_MCR_SYNCRSTM) /* 使能 */
- DACSynchro
用于设置是否使能DAC同步事件。
/* 禁止DAC同步事件 */ #define HRTIM_DACSYNC_NONE 0x00000000U /* 定时器更新时,DACTrigOut1输出同步事件 */ #define HRTIM_DACSYNC_DACTRIGOUT_1 (HRTIM_MCR_DACSYNC_0) /* 定时器更新时,DACTrigOut2输出同步事件 */ #define HRTIM_DACSYNC_DACTRIGOUT_2 (HRTIM_MCR_DACSYNC_1) /* 定时器更新时,DACTrigOut3输出同步事件 */ #define HRTIM_DACSYNC_DACTRIGOUT_3 (HRTIM_MCR_DACSYNC_1 | HRTIM_MCR_DACSYNC_0)
- PreloadEnable
用于设置是否使能寄存器预加载。
/* 禁止预加载,写操作是直接写入到寄存器里面 */ #define HRTIM_PRELOAD_DISABLED (0x00000000U) /* 使能预加载,写操作是写入到预加载寄存器里面 */ #define HRTIM_PRELOAD_ENABLED (HRTIM_MCR_PREEN)
- UpdateGating
用于设置HRTIM更新方式来源。
/* 独立更新,不受DMA突发传输完成影响 */ #define HRTIM_UPDATEGATING_INDEPENDENT 0x00000000U /* 突发传输完成时,完成更新!< Update done when the DMA burst transfer is completed */ #define HRTIM_UPDATEGATING_DMABURST (HRTIM_TIMCR_UPDGAT_0) /* 代码太长,其它定义省略未写 */
- BurstMode
设置定时器在突发模式下表现。
/* 定时器计数器时钟保持,定时器正常操作 */ #define HRTIM_TIMERBURSTMODE_MAINTAINCLOCK 0x00000000U /* 定时器计数时钟停止,计数器复位 */ #define HRTIM_TIMERBURSTMODE_RESETCOUNTER (HRTIM_BMCR_MTBM)
- RepetitionUpdate
设置重复计数事件是否可以触发寄存器更新。
#define HRTIM_UPDATEONREPETITION_DISABLED 0x00000000U /* 禁止 */ #define HRTIM_UPDATEONREPETITION_ENABLED (HRTIM_MCR_MREPU) /* 使能 */
- PushPull
设置是否使能HRTIM的TIMER(A到E)的推挽模式。
#define HRTIM_TIMPUSHPULLMODE_DISABLED 0x00000000U /* 禁止推挽输出 */ #define HRTIM_TIMPUSHPULLMODE_ENABLED (HRTIM_TIMCR_PSHPLL) /* 使能推挽输出 */
- FaultEnable
使能HRTIM TIMER的Fault通道。
#define HRTIM_TIMFAULTENABLE_NONE 0x00000000U #define HRTIM_TIMFAULTENABLE_FAULT1 (HRTIM_FLTR_FLT1EN) #define HRTIM_TIMFAULTENABLE_FAULT2 (HRTIM_FLTR_FLT2EN) #define HRTIM_TIMFAULTENABLE_FAULT3 (HRTIM_FLTR_FLT3EN) #define HRTIM_TIMFAULTENABLE_FAULT4 (HRTIM_FLTR_FLT4EN) #define HRTIM_TIMFAULTENABLE_FAULT5 (HRTIM_FLTR_FLT5EN)
- FaultLock
设置HRTIM TIMER的异常使能状态是否写保护。
#define HRTIM_TIMFAULTLOCK_READWRITE (0x00000000U) /* 可读可写 */ #define HRTIM_TIMFAULTLOCK_READONLY (HRTIM_FLTR_FLTLCK) /* 只读 */
- DeadTimeInsertion
设置HRTIM TIMER的死区插入。
#define HRTIM_TIMDEADTIMEINSERTION_DISABLED (0x00000000U) /* 输出1和输出2信号是独立的 */ #define HRTIM_TIMDEADTIMEINSERTION_ENABLED HRTIM_OUTR_DTEN /* 输出1和输出2之间插入死区时间 */
- DelayedProtectionMode
设置HRTIM TIMER的延迟保护模式。
#define HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED (0x00000000U) /* 代码太长,其它定义省略未写 */
- UpdateTrigger
设置Master或者TIMER(A到E)更新时,同步更新寄存器。
#define HRTIM_TIMUPDATETRIGGER_NONE 0x00000000U #define HRTIM_TIMUPDATETRIGGER_MASTER (HRTIM_TIMCR_MSTU) #define HRTIM_TIMUPDATETRIGGER_TIMER_A (HRTIM_TIMCR_TAU) #define HRTIM_TIMUPDATETRIGGER_TIMER_B (HRTIM_TIMCR_TBU) #define HRTIM_TIMUPDATETRIGGER_TIMER_C (HRTIM_TIMCR_TCU) #define HRTIM_TIMUPDATETRIGGER_TIMER_D (HRTIM_TIMCR_TDU) #define HRTIM_TIMUPDATETRIGGER_TIMER_E (HRTIM_TIMCR_TEU)
- ResetTrigger
设置那个事件可以触发定时器计数复位。
#define HRTIM_TIMRESETTRIGGER_NONE 0x00000000U /* 无触发 */ /* 代码太长,其它定义省略未写 */
- ResetUpdate
当HRTIM TIMER的计数器复位时或者计数回滚到0时,是否触发寄存器更新。
#define HRTIM_TIMUPDATEONRESET_DISABLED 0x00000000U /* 禁止 */ #define HRTIM_TIMUPDATEONRESET_ENABLED (HRTIM_TIMCR_TRSTU) /* 使能 */
63.3.6 定时器输出配置HRTIM_OutputCfgTypeDef
此结构体主要用于定时器输出配置:
typedef struct { uint32_t Polarity; uint32_t SetSource; uint32_t ResetSource; uint32_t IdleMode; uint32_t IdleLevel; uint32_t FaultLevel; uint32_t ChopperModeEnable; uint32_t BurstModeEntryDelayed; } HRTIM_OutputCfgTypeDef;
下面将这几个参数一 一做个说:
- Polarity
输出极性是用来设置激活状态Active对应的高电平还是低电平
#define HRTIM_OUTPUTPOLARITY_HIGH (0x00000000U) #define HRTIM_OUTPUTPOLARITY_LOW (HRTIM_OUTR_POL1)
- SetSource
可以将输出由Inactive状态转为Active状态的事件,即输出置位。
#define HRTIM_OUTPUTSET_NONE 0x00000000U #define HRTIM_OUTPUTSET_RESYNC (HRTIM_SET1R_RESYNC) #define HRTIM_OUTPUTSET_TIMPER (HRTIM_SET1R_PER) #define HRTIM_OUTPUTSET_TIMCMP1 (HRTIM_SET1R_CMP1) #define HRTIM_OUTPUTSET_TIMCMP2 (HRTIM_SET1R_CMP2) #define HRTIM_OUTPUTSET_TIMCMP3 (HRTIM_SET1R_CMP3) #define HRTIM_OUTPUTSET_TIMCMP4 (HRTIM_SET1R_CMP4) /* 代码太长,其它定义省略未写 */
- ResetSource
可以将输出由Active状态转为Inactive状态的事件,即输出复位。
#define HRTIM_OUTPUTRESET_NONE 0x00000000U #define HRTIM_OUTPUTRESET_RESYNC (HRTIM_RST1R_RESYNC) #define HRTIM_OUTPUTRESET_TIMPER (HRTIM_RST1R_PER) #define HRTIM_OUTPUTRESET_TIMCMP1 (HRTIM_RST1R_CMP1) #define HRTIM_OUTPUTRESET_TIMCMP2 (HRTIM_RST1R_CMP2) #define HRTIM_OUTPUTRESET_TIMCMP3 (HRTIM_RST1R_CMP3) #define HRTIM_OUTPUTRESET_TIMCMP4 (HRTIM_RST1R_CMP4) /* 代码太长,其它定义省略未写 */
- IdleMode
设置进入突发模式后,输出空闲状态。
#define HRTIM_OUTPUTIDLEMODE_NONE 0x00000000U /* 输出不受突发模式影响 */ #define HRTIM_OUTPUTIDLEMODE_IDLE (HRTIM_OUTR_IDLM1) /* 进入突发模式后,输出空闲状态*/
- IdleLevel
设置输出为空闲状态时,输出电平为Inactive或者Active。
#define HRTIM_OUTPUTIDLELEVEL_INACTIVE 0x00000000U #define HRTIM_OUTPUTIDLELEVEL_ACTIVE (HRTIM_OUTR_IDLES1)
- FaultLevel
设置输出为Fault状态时,输出电平为Inactive,Active或者HIGHZ(高阻)。
#define HRTIM_OUTPUTFAULTLEVEL_NONE 0x00000000U #define HRTIM_OUTPUTFAULTLEVEL_ACTIVE (HRTIM_OUTR_FAULT1_0) #define HRTIM_OUTPUTFAULTLEVEL_INACTIVE (HRTIM_OUTR_FAULT1_1) #define HRTIM_OUTPUTFAULTLEVEL_HIGHZ (HRTIM_OUTR_FAULT1_1 | HRTIM_OUTR_FAULT1_0)
- ChopperModeEnable
设置是否使能chopper模式
#define HRTIM_OUTPUTCHOPPERMODE_DISABLED 0x00000000U /* 禁止 */ #define HRTIM_OUTPUTCHOPPERMODE_ENABLED (HRTIM_OUTR_CHP1) /* 使能 */
- BurstModeEntryDelayed
设置从突发模式切换到空闲模式前,是否插入一个死区时间。
#define HRTIM_OUTPUTBURSTMODEENTRY_REGULAR 0x00000000U /* 立即进入空闲状态 */ #define HRTIM_OUTPUTBURSTMODEENTRY_DELAYED (HRTIM_OUTR_DIDL1) /* 进入空闲状态前,插入死区时间 */
63.3.7 定时器比较配置HRTIM_CompareCfgTypeDef
此结构体主要用于定时器比较配置:
typedef struct { uint32_t CompareValue; uint32_t AutoDelayedMode; uint32_t AutoDelayedTimeout; } HRTIM_CompareCfgTypeDef;
下面将这几个参数一 一做个说:
- CompareValue
设置定时器比较单元的比较值。
最小值要大于等于3个HRTIM时钟周期。
最大值要小于等于0xFFFF – 1。
- AutoDelayedMode
设置比较单元2和4的自动延迟模式。
#define HRTIM_AUTODELAYEDMODE_REGULAR (0x00000000U) #define HRTIM_AUTODELAYEDMODE_AUTODELAYED_NOTIMEOUT (HRTIM_TIMCR_DELCMP2_0) #define HRTIM_AUTODELAYEDMODE_AUTODELAYED_TIMEOUTCMP1 (HRTIM_TIMCR_DELCMP2_1) #define HRTIM_AUTODELAYEDMODE_AUTODELAYED_TIMEOUTCMP3 (HRTIM_TIMCR_DELCMP2_1 | HRTIM_TIMCR_DELCMP2_0)
- AutoDelayedTimeout
当选择了溢出时间的自动延迟模式时,指定计时单元1或3的比较值。
注意:CompareValue + AutoDelayedTimeout必须小于0xFFFFU
63.3.8 定时器句柄结构体HRTIM_HandleTypeDef
HAL库在前面几个结构体的基础上封装了一个结构体HRTIM_HandleTypeDef,定义如下:
#if (USE_HAL_HRTIM_REGISTER_CALLBACKS == 1) typedef struct __HRTIM_HandleTypeDef #else typedef struct #endif { HRTIM_TypeDef * Instance; /*!< Register base address */ HRTIM_InitTypeDef Init; /*!< HRTIM required parameters */ HRTIM_TimerParamTypeDef TimerParam[MAX_HRTIM_TIMER]; /*!< HRTIM timers */ HAL_LockTypeDef Lock; /*!< Locking object */ __IO HAL_HRTIM_StateTypeDef State; /*!< HRTIM communication state */ DMA_HandleTypeDef * hdmaMaster; /*!< Master timer DMA handle parameters */ DMA_HandleTypeDef * hdmaTimerA; /*!< Timer A DMA handle parameters */ DMA_HandleTypeDef * hdmaTimerB; /*!< Timer B DMA handle parameters */ DMA_HandleTypeDef * hdmaTimerC; /*!< Timer C DMA handle parameters */ DMA_HandleTypeDef * hdmaTimerD; /*!< Timer D DMA handle parameters */ DMA_HandleTypeDef * hdmaTimerE; /*!< Timer E DMA handle parameters */ #if (USE_HAL_HRTIM_REGISTER_CALLBACKS == 1) void (* Fault1Callback)(struct __HRTIM_HandleTypeDef *hhrtim); void (* Fault2Callback)(struct __HRTIM_HandleTypeDef *hhrtim); void (* Fault3Callback)(struct __HRTIM_HandleTypeDef *hhrtim); void (* Fault4Callback)(struct __HRTIM_HandleTypeDef *hhrtim); void (* Fault5Callback)(struct __HRTIM_HandleTypeDef *hhrtim); void (* SystemFaultCallback)(struct __HRTIM_HandleTypeDef *hhrtim); void (* BurstModePeriodCallback)(struct __HRTIM_HandleTypeDef *hhrtim);