eric2013 发表于 2018-8-30 14:52:25

STM32H7的HRTIM配置输出5组不同频率,不同占空比的波形,同时5组互补输出也是没问题的

说明:

官方例程:HRTIM_MultiplePWM

我这里对例程做了简单修改,输出不同频率,默认情况下五组都输出的2MHz波形,不同占空比。

static/image/hrline/4.gif
测试的前三组TIMA,TIMB,TIMC的输出



static/image/hrline/4.gif
测试代码

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define HRTIM_MAX_PERIOD1000
#define HRTIM_TIMA_PULSE1 500
#define HRTIM_TIMB_PULSE1 250
#define HRTIM_TIMC_PULSE1 100
#define HRTIM_TIMD_PULSE1 500
#define HRTIM_TIME_PULSE1 500

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Timer handler declaration */
HRTIM_HandleTypeDef               HrtimHandle;

HRTIM_TimeBaseCfgTypeDef            sConfig_time_base;
HRTIM_SimplePWMChannelCfgTypeDef    sConfig_Channel;
       
/* Private function prototypes -----------------------------------------------*/
static void SystemClock_Config(void);
static void Error_Handler(void);
static void CPU_CACHE_Enable(void);

/* Private functions ---------------------------------------------------------*/

/**
* @briefMain program
* @paramNone
* @retval None
*/
int main(void)
{

/* Enable the CPU Cache */
CPU_CACHE_Enable();

/* STM32H7xx HAL library initialization:
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 4
       - Low Level Initialization
*/
HAL_Init();

/* Configure the system clock to 400 MHz */
SystemClock_Config();

/*##-1- Configure the HRTIM peripheral ######################################################*/
/* Initialize the HRTIM structure */
HrtimHandle.Instance = HRTIM1;
HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;

HAL_HRTIM_Init(&HrtimHandle);

/*##-2- Configure the HRTIM TIMA PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
         
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &sConfig_time_base);         
         
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIMA_PULSE1;
         
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
                                        HRTIM_OUTPUT_TA1, &sConfig_Channel);
       
/*##-3- Configure the HRTIM TIMB PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD/2;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
         
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, &sConfig_time_base);         
         
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIMB_PULSE1;
         
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
                                        HRTIM_OUTPUT_TB1, &sConfig_Channel);
       
/*##-4- Configure the HRTIM TIMC PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD/4;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
         
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &sConfig_time_base);         
         
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIMC_PULSE1;
         
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
                                        HRTIM_OUTPUT_TC1, &sConfig_Channel);
       
/*##-5- Configure the HRTIM TIMD PWM channels 1 #############################################*/       
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
         
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_time_base);         
                                                                                                                                               
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIMD_PULSE1;
         
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
                                        HRTIM_OUTPUT_TD1, &sConfig_Channel);                                                                                                                                       
       
/*##-6- Configure the HRTIM TIME PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
         
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base);         
         
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIME_PULSE1;
         
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,
                                        HRTIM_OUTPUT_TE1, &sConfig_Channel);
       
/*##-7- Start PWM signals generation #########################################################*/
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1) != HAL_OK)
{
    /* PWM Generation Error */
    Error_Handler();
}   
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB1) != HAL_OK)
{
    /* PWM Generation Error */
    Error_Handler();
}
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC1) != HAL_OK)
{
    /* PWM Generation Error */
    Error_Handler();
}
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1) != HAL_OK)
{
    /* PWM Generation Error */
    Error_Handler();
}
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE1) != HAL_OK)
{
    /* PWM Generation Error */
    Error_Handler();
}
/* Infinite loop */
while (1)
{
}
}



hpdell 发表于 2018-8-30 15:15:17

{:8:}

roguebear 发表于 2019-1-24 21:26:13

每组都可以精确计数脉冲数不? 不用内部定时器级联

三虎 发表于 2020-2-19 02:01:32

roguebear 发表于 2019-1-24 21:26
每组都可以精确计数脉冲数不? 不用内部定时器级联

我估计是不行的。1主5从共6个TIM只管输出pwm

huajin 发表于 2020-4-28 08:50:36

硬汉老师本人新手想问一下 这个高分辨率的定时器可以做输出捕获测量频率?有没有例程

dsl1784 发表于 2021-7-14 00:15:03

大佬,我遇到问题了,我试了下HRTIM_TIMERINDEX_TIMER_A ~ HRTIM_TIMERINDEX_TIMER_E只能输出HRTIM_OUTPUT_Tx1输出,HRTIM_OUTPUT_Tx2无法输出。

dsl1784 发表于 2021-7-14 00:16:15

// 高精度定时器初始化函数,用于初始化输出频率&基础占空比
void InitHRTIM(void)
{
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
HRTIM_TimeBaseCfgTypeDef         sConfig_time_base = {0};
HRTIM_SimplePWMChannelCfgTypeDef   sConfig_Channel = {0};

```
// HRTIM定时的默认配置
HrtimMaxPeriod = 50000000 / DEFAULT_PWM_PHQ;//4分频系数(200/4=50MHz)计算出的周期计数值(DEFAULT_PWM_PHQ 来自app_data.h)

/*##-1- 配置HRTIM的主频时钟 ######################################*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_HRTIM1;
/*
        HRTIM时钟有两种选择:
    1、使用CPU主频时钟,本程序配置的是400MHz,对应参数RCC_HRTIM1CLK_CPUCLK。
    2、使用通用定时器时钟,本程序是200MHz,对应参数RCC_HRTIM1CLK_TIMCLK。
*/
PeriphClkInitStruct.Hrtim1ClockSelection = RCC_HRTIM1CLK_TIMCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
    Error_Handler(__FILE__, __LINE__);
}

/*##-2- 初始化HRTIM ###################################################*/
HrtimHandle.Instance = HRTIM1;/* 例化,使用的HRTIM1 */
HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE; /* 用于配置支持的中断请求,当前配置无中断 */
HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;   /* 配置HRTIM作为Master,发送同步信号,或者作为Slave,接收同步信号,当前配置没有做同步功能 */

HAL_HRTIM_Init(&HrtimHandle);

/*##-3 - Configure the HRTIM TIMx PWM#############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HrtimMaxPeriod - 1;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV4;// 4 分Timer时钟,即8分主时钟
sConfig_time_base.RepetitionCounter = 0;

HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &sConfig_time_base);
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, &sConfig_time_base);
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &sConfig_time_base);
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_time_base);
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base);

sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = (HrtimMaxPeriod * DEFAULT_PWM_PUL / 100) - 1;

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
                                                                                HRTIM_OUTPUT_TA1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
                                                                                HRTIM_OUTPUT_TA2, &sConfig_Channel);

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
                                                                                HRTIM_OUTPUT_TB1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
                                                                                HRTIM_OUTPUT_TB2, &sConfig_Channel);

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
                                                                                HRTIM_OUTPUT_TC1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
                                                                                HRTIM_OUTPUT_TC2, &sConfig_Channel);

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
                                                                                HRTIM_OUTPUT_TD1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
                                                                                HRTIM_OUTPUT_TD2, &sConfig_Channel);

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,
                                                                                HRTIM_OUTPUT_TE1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,
                                                                                HRTIM_OUTPUT_TE2, &sConfig_Channel);

HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,HRTIM_OUTPUT_TA1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,HRTIM_OUTPUT_TA2);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,HRTIM_OUTPUT_TB1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,HRTIM_OUTPUT_TB2);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,HRTIM_OUTPUT_TC1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,HRTIM_OUTPUT_TC2);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,HRTIM_OUTPUT_TD1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,HRTIM_OUTPUT_TD2);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,HRTIM_OUTPUT_TE1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,HRTIM_OUTPUT_TE2);
}

dsl1784 发表于 2021-7-14 00:16:48

GPIO 初始化检查过了,应该是没问题的。百思不得其解。

eric2013 发表于 2021-7-14 01:37:20

dsl1784 发表于 2021-7-14 00:16
GPIO 初始化检查过了,应该是没问题的。百思不得其解。

你跑我楼主位的官方代码正常吗

dsl1784 发表于 2021-7-14 08:27:08

eric2013 发表于 2021-7-14 01:37
你跑我楼主位的官方代码正常吗

正常的5个通道都输出的。

eric2013 发表于 2021-7-15 08:10:26

dsl1784 发表于 2021-7-14 08:27
正常的5个通道都输出的。

回头我试试,你可以使用CubeMX生成个代码先对比下

dsl1784 发表于 2021-7-15 16:33:29

有时间可以研究看下,用Simple的API方便是方便。 我后面还是用复杂的Wave方式达成了10路PWM的输出。

eric2013 发表于 2021-7-16 09:40:37

dsl1784 发表于 2021-7-15 16:33
有时间可以研究看下,用Simple的API方便是方便。 我后面还是用复杂的Wave方式达成了10路PWM的输出。

好的,HRTIM后面要深入搞下,很多地方还没有去研究挖掘,发挥不了威力。

苗苗儿 发表于 2022-7-11 17:10:22

您好,直接把代码放到main文件中不对,有很多没定义的

eric2013 发表于 2022-7-11 19:53:46

苗苗儿 发表于 2022-7-11 17:10
您好,直接把代码放到main文件中不对,有很多没定义的
那估计是HAL库版本不同造成的。

不是这个问题的话,就是移植有问题了

gurong60 发表于 2022-9-17 17:41:13

请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现

eric2013 发表于 2022-9-18 08:26:05

gurong60 发表于 2022-9-17 17:41
请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现

可以使用HRIM的DMA,这样就可以发任意波形了。

fei6203150 发表于 2024-1-5 10:39:46

这个是官方例程吗,硬汉能给个链接么?

eric2013 发表于 2024-1-6 09:17:14

fei6203150 发表于 2024-1-5 10:39
这个是官方例程吗,硬汉能给个链接么?

下载STM32CubeH7的软件包,解压后检索HRTIM_MultiplePWM

Neil 发表于 2024-3-4 18:28:56

gurong60 发表于 2022-9-17 17:41
请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现

请问楼上搞定了吗?搞定的话,能不能解释一下如何设置的。谢谢!

eric2013 发表于 2024-3-5 11:47:37

Neil 发表于 2024-3-4 18:28
请问楼上搞定了吗?搞定的话,能不能解释一下如何设置的。谢谢!

使用HRTIM的DMA方式就行,可以发送任意脉冲。
页: [1]
查看完整版本: STM32H7的HRTIM配置输出5组不同频率,不同占空比的波形,同时5组互补输出也是没问题的