前言

相较于普通TIM,HRTIM最显著的特点就是可以倍频到最大的32倍,这就可以使得定时器即使工作在较高频率下,仍有较高的分辨率。 因此它主要用于数字电源、照明,电源耗材,太阳能逆变器和无线充电等应用场合,当然,也可以作为通用目的。

所用工具:

  1. 开发板:STM32G474RE
  2. STM32CubeMX
  3. IDE: Keil-MDK

基础知识

主定时器(Master Timer):
基于 16 位递增计数器。它可通过 4 个比较单元置位/ 复位 定时器的输出,并向其他独立定时器单元(Timer A~Timer F)提供同步信号。其主要用途是使定时器单元受唯一的时钟源控制。全桥Buck-Boost数字电源是一个典型的应用示例,主定时器在其中管理多个单元之间的相移。

独立定时器(Timer A~Timer F):
既可以独立工作,也可以与其它定时器(包括主定时器)配合工作。每个定时器都可控制两路输出。输出置位/复位事件可以由定时单元比较寄存器触发,或者由主定时器事件、其他定时器的事件或外部事件触发。
每个定时器的两路输出:
支持PWM互补输出,支持添加死区时间。
将载波频率添加到调制信号上。
通过将异步输出置为预定义的安全电平来管理故障事件。

外部事件(可用于任何定时器单元)
可编程极性和边沿有效性。
5个事件用于快速异步模式。
5个事件用于可编程数字滤波器。
利用消隐和窗口模式实现伪事件过滤。

通道(连接到内置模拟外设)
4个用于 ADC 转换器的触发信号。
3个用于 DAC 转换器的触发信号。
3个用于比较器。

保护机制
5 路故障输入可组合使用,而且可以关联到任何定时单元。
可编程极性和边沿有效性。
对谐振变换器配有专门的延时保护。

不同HRTIM之间可以做同步输入/输出

STM32CubeMX HRTIM配置

  1. 时钟配置 (如不了解点击下面链接)
    【STM32】CubeMX+HAL库之时钟.
  2. HRTIM配置
    开启主定时器(Master Timer)
    选择其他合适的独立定时器

    设置主定时器
    选择合适的倍频数或分频数
    设置周期计数器长度得以得出控制频率

    使能预加载
    使能更新重复
    开启中断

开启独立定时器(Timer A~Timer F)

相同方式 选择合适的倍频数或分频数

设置周期计数器长度得以得出控制频率

CubeMax的EXTI配置_置位


使能预加载

开启重复更新

设置死区(只要输出两个互补的信号就得选择设置死区,如不需要死区时间将参数设置为零,另一个选项为两个独立的输出)

设置比较器

开启DMA请求,将比较器的值装入DMA,

CubeMax的EXTI配置_比较器_02


设置死区时间

死区在上升沿还是下降沿

CubeMax的EXTI配置_stm32_03


设置有效输出电频

设置源:复位源、启动源

CubeMax的EXTI配置_CubeMax的EXTI配置_04


开启DMA

CubeMax的EXTI配置_stm32_05

相同的方式设置其他的独立定时器
这样的方式就可以开启互补的信号,但未同步

如需开启同步的,可以选择使用主定时器作为同步源,让时钟复位其他独立定时器既可。

CubeMax的EXTI配置_置位_06


生成代码

代码部分

初始化

HAL_HRTIM_WaveformCounterStart_IT(&hhrtim1, HRTIM_TIMERID_MASTER);

  __HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, (uint32_t)HRTIM_DMA_Buffer[0]);
  __HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, HRTIM_COMPAREUNIT_2, (uint32_t)HRTIM_DMA_Buffer[1]);

  HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TB1 + HRTIM_OUTPUT_TB2);
  HAL_HRTIM_WaveformCounterStart_DMA(&hhrtim1, HRTIM_TIMERID_TIMER_B);

  HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TE1 + HRTIM_OUTPUT_TE2);
  HAL_HRTIM_WaveformCounterStart_DMA(&hhrtim1, HRTIM_TIMERID_TIMER_E);

更新DMA装值写在主定时器中断函数(HAL_HRTIM_RepetitionEventCallback)中

void HAL_HRTIM_RepetitionEventCallback(HRTIM_HandleTypeDef * hhrtim, uint32_t TimerIdx)
{
	//计算函数
	HRTIM_DMA_Buffer[0] = 13600;   //计算结果
	HRTIM_DMA_Buffer[1] = 13600;
}