【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值

前言

相较于普通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库之时钟.
    【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
    【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
  2. HRTIM配置
    开启主定时器(Master Timer)
    选择其他合适的独立定时器
    【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
    设置主定时器
    选择合适的倍频数或分频数
    设置周期计数器长度得以得出控制频率
    【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
    使能预加载
    使能更新重复
    开启中断
    【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
    【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值

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

相同方式 选择合适的倍频数或分频数
设置周期计数器长度得以得出控制频率
【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
使能预加载
开启重复更新
设置死区(只要输出两个互补的信号就得选择设置死区,如不需要死区时间将参数设置为零,另一个选项为两个独立的输出)
设置比较器
开启DMA请求,将比较器的值装入DMA,
【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
设置死区时间
死区在上升沿还是下降沿
【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
设置有效输出电频
设置源:复位源、启动源
【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
开启DMA
【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值

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

如需开启同步的,可以选择使用主定时器作为同步源,让时钟复位其他独立定时器既可。
【STM32】CubeMX+HAL库之HRTIM 多路同步独立定时器 DMA传输比较值
生成代码

代码部分

初始化

	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;
}
上一篇:STM32CubeMX(03)GPIO口输出+定时器实验实现交通灯


下一篇:YIE002开发探索03-按键