硬汉嵌入式论坛

 找回密码
 立即注册
查看: 127|回复: 3
收起左侧

[技术讨论] G474的HRTIM定时器,中心对其模式

[复制链接]

6

主题

8

回帖

26

积分

新手上路

积分
26
发表于 4 天前 | 显示全部楼层 |阅读模式
这个G474的HRTIM定时器,中心对其模式,输出波形是中心对称,但是这个计数器值,打印出来不是中心对称,

屏幕截图 2025-06-06 001641.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 4 天前 | 显示全部楼层
这个是我之前做H7的HRTIM做的一个配置,好像没有专门的CMS中心对齐模式和DIR计数方向的配置项,后面我也研究看下

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: bsp_SetHRTIMOutPWM
*	功能说明: 配置HRTIM的TIMER D输出两路PWM,周期都是100KHz,PA11引脚输出占空比50%,PA12引脚输出的占空比25%。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_SetHRTIMOutPWM(void)
{
	GPIO_InitTypeDef   GPIO_InitStruct;
	RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

	/*##-1- 使能时钟 ################################################*/
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_HRTIM1_CLK_ENABLE();

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

	/*##-3- 配置HRTIM的TIMER D使用的两个输出通道引脚PA11和PA12 #######*/	
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

	GPIO_InitStruct.Alternate = GPIO_AF2_HRTIM1;
	GPIO_InitStruct.Pin = GPIO_PIN_11;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.Alternate = GPIO_AF2_HRTIM1;
	GPIO_InitStruct.Pin = GPIO_PIN_12;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	/*##-4- 初始化HRTIM ###################################################*/	
	HrtimHandle.Instance = HRTIM1;  /* 例化,使用的HRTIM1 */
	HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE; /* 用于配置支持的中断请求,当前配置无中断 */
	HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;     /* 配置HRTIM作为Master,发送同步信号,或者作为Slave,接收同步信号,当前配置没有做同步功能 */
	
	HAL_HRTIM_Init(&HrtimHandle);
    
	/*##-5- 配置HRTIM的TIMER D 时基 #########################################*/	
	/*
		PWM的频率 = 400MHz / HRTIM_TIMD_PERIOD
	              = 400000000 / 4000
				  = 100KHz
	*/
	sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS; /* 连续工作模式 */
	sConfig_time_base.Period = HRTIM_TIMD_PERIOD;   /* 设置周期 */
	sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1; /* 设置HRTIM分频,当前设置的1分频,也就是不分频 */
	sConfig_time_base.RepetitionCounter = 0;        /* 设置重复计数器为0,即不做重复计数 */
		  
	HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_time_base);

	/*##-6- HRTIM的TIMER D配置 #############################################*/	
	sConfig_timerD.DMARequests = HRTIM_TIM_DMA_NONE;         /* 不使用DMA */    
	sConfig_timerD.HalfModeEnable = HRTIM_HALFMODE_DISABLED; /* 关闭HALF模式 */
	sConfig_timerD.StartOnSync = HRTIM_SYNCSTART_DISABLED;   /* 设置同步输入端接收到上升沿信号后,不启动定时器 */
	sConfig_timerD.ResetOnSync = HRTIM_SYNCRESET_DISABLED;   /* 设置同步输入端接收到上升沿信号后,不复位定时器 */
	sConfig_timerD.DACSynchro = HRTIM_DACSYNC_NONE;			 /* 不使用DAC同步事件 */
	sConfig_timerD.PreloadEnable = HRTIM_PRELOAD_ENABLED;	 /* 使能寄存器预加载 */
	sConfig_timerD.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;      /* 独立更新,与DMA突发传输完成无关 */
	sConfig_timerD.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;     /* 在突发模式下,定时器正常运行 */
	sConfig_timerD.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;/* 设置重计数器事件可以触发寄存器更新 */
	sConfig_timerD.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;	   /* 当HRTIM TIMER的计数器复位时或者计数回滚到0时,不触发寄存器更新 */
	sConfig_timerD.InterruptRequests = HRTIM_TIM_IT_NONE;              /* 不使用中断 */
	sConfig_timerD.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;          /* 不开启推挽模式 */
	sConfig_timerD.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;            /* 不使用HRTIM TIMER的Fault通道 */
	sConfig_timerD.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;           /* 不开启HRTIM TIMER的异常使能状态写保护 */
	sConfig_timerD.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;/* 不开启死区时间插入 */
	sConfig_timerD.DelayedProtectionMode = HRTIM_TIMER_D_E_DELAYEDPROTECTION_DISABLED;/* 不开启HRTIM TIMER的延迟保护模式 */
	sConfig_timerD.UpdateTrigger= HRTIM_TIMUPDATETRIGGER_NONE;         /* Master或者TIMER(A到E)更新时,不同步更新寄存器 */
	sConfig_timerD.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;          /* 无复位触发 */

	HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_timerD);

	/*##-7- 配置HRTIM的TIMER D的比较输出 ###########################*/	
	sConfig_compare.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR; /* 这里使用标准模式,即未使用自动延迟 */
	sConfig_compare.AutoDelayedTimeout = 0;                          /* 由于前面的参数未使用自动延迟模式,此参数无作用 */
	/*
	    设置定时器比较单元的比较值:
		最小值要大于等于3个HRTIM时钟周期。
		最大值要小于等于0xFFFF – 1
	*/
	sConfig_compare.CompareValue = HRTIM_TIMD_PERIOD / 2;  /* 占空比50% */
	HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_1, &sConfig_compare);
	sConfig_compare.CompareValue = HRTIM_TIMD_PERIOD / 4;  /* 占空比25% */
	HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_2, &sConfig_compare);


	/*##-8- 定时器输出配置 ##########################################*/	
	sConfig_output_config.Polarity = HRTIM_OUTPUTPOLARITY_LOW;    /* 设置定时器输出极性 */
	sConfig_output_config.SetSource = HRTIM_OUTPUTRESET_TIMCMP1;  /* 定时器比较事件1可以将输出置位 */
	sConfig_output_config.ResetSource = HRTIM_OUTPUTSET_TIMPER;   /* 定时器周期性更新事件可以将输出清零 */
	sConfig_output_config.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;   /* 输出不受突发模式影响 */
	sConfig_output_config.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE; /* 设置空闲状态输出低电平 */
	sConfig_output_config.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;   /* 输出不受异常输入影响 */
	sConfig_output_config.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED; /* 关闭Chopper模式 */
	sConfig_output_config.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR; /* 设置从突发模式切换到空闲模式,不插入死区时间 */

	HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1, &sConfig_output_config);
	
	sConfig_output_config.SetSource = HRTIM_OUTPUTRESET_TIMCMP2;  /* 定时器比较事件2可以将输出置位 */    
	HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD2, &sConfig_output_config);
	
	/*##-9- 启动PWM输出 #############################################*/
	if (HAL_HRTIM_WaveformOutputStart(&HrtimHandle,  HRTIM_OUTPUT_TD1 + HRTIM_OUTPUT_TD2) != HAL_OK)
	{
        Error_Handler(__FILE__, __LINE__);
	}

	/*##-10- 启动计数器 #############################################*/	
	if (HAL_HRTIM_WaveformCounterStart(&HrtimHandle, HRTIM_TIMERID_TIMER_D) != HAL_OK)
	{
        Error_Handler(__FILE__, __LINE__);
	}
	
}
回复

使用道具 举报

6

主题

8

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 4 天前 | 显示全部楼层
大佬这个论坛帖子没有删除帖子的选项嘛,我找半天没看到
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 4 天前 | 显示全部楼层
1571946997 发表于 2025-6-6 09:27
大佬这个论坛帖子没有删除帖子的选项嘛,我找半天没看到

有回复的帖子不能删除了。

你前面重复发的那个帖子,我在后台已经帮你删除了,那个帖子只有文字,没有图片,对比你这个帖子是完整的,就把里这个贴通过了,那个帖子删掉了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 05:05 , Processed in 0.286256 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表