|
|
发表于 2026-1-29 18:51:36
|
显示全部楼层
硬汉哥,为什么我用HRTIM输出30MHZ的方波都不行,固定50占空比的 ,输出出来的都是像三角形的,难道是探头的问题吗.。 还是因为用的是开发板,走线不规范导致的。示波器参数350MHz ,,2GSa/s
#include "./BSP/hf_pwm.h"
HRTIM_HandleTypeDef hhrtim;
void HF_PWM_Init(void)
{
HRTIM_TimeBaseCfgTypeDef sTimeBaseCfg = {0};
HRTIM_TimerCfgTypeDef sTimerCfg = {0};
HRTIM_CompareCfgTypeDef sCompareCfg = {0};
HRTIM_OutputCfgTypeDef sOutputCfg = {0};
// 1. 开启时钟并复位模块
__HAL_RCC_HRTIM1_CLK_ENABLE();
__HAL_RCC_HRTIM1_FORCE_RESET();
__HAL_RCC_HRTIM1_RELEASE_RESET();
__HAL_RCC_GPIOA_CLK_ENABLE();
// 2. 配置 GPIO: PA8 -> AF2 (HRTIM1_CHB2)
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_HRTIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 3. HRTIM 基础初始化
hhrtim.Instance = HRTIM1;
hhrtim.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
hhrtim.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;
HAL_StatusTypeDef status = HAL_HRTIM_Init(&hhrtim);
if (status != HAL_OK) return;
// 4. 配置主定时器 (Master Timer) - 有些版本需要主定时器初始化
HRTIM_TimerCfgTypeDef sMasterTimerCfg = {0};
sMasterTimerCfg.InterruptRequests = HRTIM_IT_NONE;
sMasterTimerCfg.DMARequests = HRTIM_IT_NONE;
sMasterTimerCfg.StartOnSync = HRTIM_SYNCSTART_DISABLED;
sMasterTimerCfg.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
sMasterTimerCfg.DACSynchro = HRTIM_DACSYNC_NONE;
sMasterTimerCfg.PreloadEnable = HRTIM_PRELOAD_ENABLED;
sMasterTimerCfg.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
sMasterTimerCfg.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
sMasterTimerCfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_DISABLED;
HAL_HRTIM_WaveformTimerConfig(&hhrtim, HRTIM_TIMERINDEX_MASTER, &sMasterTimerCfg);
// 5. 配置时基 (Time Base) - 关键:设置为连续模式
sTimeBaseCfg.Period = 0xFFDF; // 初始周期
sTimeBaseCfg.RepetitionCounter = 0;
sTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;
HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, &sTimeBaseCfg);
// 5. 定时器 B 配置 (Timer B)
sTimerCfg.InterruptRequests = HRTIM_TIM_IT_NONE;
sTimerCfg.DMARequests = HRTIM_TIM_DMA_NONE;
sTimerCfg.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
sTimerCfg.StartOnSync = HRTIM_SYNCSTART_DISABLED;
sTimerCfg.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
sTimerCfg.DACSynchro = HRTIM_DACSYNC_NONE;
sTimerCfg.PreloadEnable = HRTIM_PRELOAD_ENABLED;
sTimerCfg.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
sTimerCfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;
sTimerCfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
sTimerCfg.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
sTimerCfg.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
sTimerCfg.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
sTimerCfg.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
sTimerCfg.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;
sTimerCfg.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;
sTimerCfg.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
sTimerCfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_DISABLED;
HAL_HRTIM_WaveformTimerConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, &sTimerCfg);
// 6. 比较单元配置 (用于控制占空比)
sCompareCfg.CompareValue = 0x7FFF;
HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, &sCompareCfg);
// 7. 输出配置 (CHB2)
sOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
sOutputCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
sOutputCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
sOutputCfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
sOutputCfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
// 设置输出逻辑:周期匹配时置高,比较匹配时复位
sOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMPER;
sOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB2, &sOutputCfg);
// 8. 设置初始频率并启动
HF_PWM_Set_Freq(30000000);
// 启动输出和计数器
HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TB2);
HAL_HRTIM_WaveformCountStart(&hhrtim, HRTIM_TIMERID_TIMER_B);
HAL_HRTIM_WaveformCountStart(&hhrtim, HRTIM_TIMERID_MASTER); // 启动主定时器
// 强制更新以生效
HAL_HRTIM_SoftwareUpdate(&hhrtim, HRTIM_TIMERUPDATE_B | HRTIM_TIMERUPDATE_MASTER);
}
void HF_PWM_Set_Freq(uint32_t freq_hz)
{
if (freq_hz == 0) return;
// HRTIM 在 H743 上没有 DLL 32倍频,其计数频率等于 CPU 时钟 (400MHz)
// Period = 400000000 / freq_hz
uint32_t period = (uint32_t)(400000000ULL / freq_hz);
if (period > 0xFFDF) period = 0xFFDF;
if (period < 1) period = 1;
__HAL_HRTIM_SETPERIOD(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, period);
__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, period / 2);
// 强制更新寄存器以立即生效
HAL_HRTIM_SoftwareUpdate(&hhrtim, HRTIM_TIMERUPDATE_B);
}
main文件涉及到的如下
// 3. 配置 HRTIM1 时钟源为 CPU 时钟 (400MHz)
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_HRTIM1;
PeriphClkInitStruct.Hrtim1ClockSelection = RCC_HRTIM1CLK_CPUCLK;
if (HAL_RCCEx_PeriphCLKConfig(& eriphClkInitStruct) != HAL_OK) Error_Handler(); |
-
-
|