ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-19 13:04:24  阅读:505  来源: 互联网

标签:DMA 定时器 HAL hhrtim1 HRTIM Timer


前言

相较于普通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)

相同方式 选择合适的倍频数或分频数
设置周期计数器长度得以得出控制频率
在这里插入图片描述
使能预加载
开启重复更新
设置死区(只要输出两个互补的信号就得选择设置死区,如不需要死区时间将参数设置为零,另一个选项为两个独立的输出)
设置比较器
开启DMA请求,将比较器的值装入DMA,
在这里插入图片描述
设置死区时间
死区在上升沿还是下降沿
在这里插入图片描述
设置有效输出电频
设置源:复位源、启动源
在这里插入图片描述
开启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;
}

标签:DMA,定时器,HAL,hhrtim1,HRTIM,Timer
来源: https://blog.csdn.net/weixin_45065888/article/details/120370677

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有