ST意法半导体
直播中

李桂英

8年用户 1454经验值
私信 关注
[问答]

请问STM32F334如何配置PB1输出HRTIM同步信号?

我尝试通过cube配置HRtiM的同步输出,输出管脚选择PB1,并且在生成的工程中启用了HRTIM,但实际运行测试发现,在PA8管脚上有PWM波形输出,说明HRTIM已正常启动运行,但PB1管脚上没有任何波形,不知是哪里配置的问题,导致没有同步信号输出呢?

回帖(2)

李韵鹤

2025-3-7 14:48:17
Cube生成的HRTIM初始化配置代码如下:
HRTIM_ADCTriggerCfgTypeDef pADCTriggerCfg = {0};HRTIM_TimeBaseCfgTypeDef pTimeBaseCfg = {0};HRTIM_TimerCfgTypeDef pTimerCfg = {0};HRTIM_CompareCfgTypeDef pCompareCfg = {0};HRTIM_OutputCfgTypeDef pOutputCfg = {0};
/ USER CODE BEGIN HRTIM1_Init 1 /
/ USER CODE END HRTIM1_Init 1 /hhrtim1.Instance = HRTIM1;hhrtim1.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;hhrtim1.Init.SyncOptions = HRTIM_SYNCOPTION_MASTER;hhrtim1.Init.SyncOutputSource = HRTIM_SYNCOUTPUTSOURCE_MASTER_CMP1;hhrtim1.Init.SyncOutputPolarity = HRTIM_SYNCOUTPUTPOLARITY_NONE;if (HAL_HRTIM_Init(&hhrtim1) != HAL_OK){Error_Handler();}if (HAL_HRTIM_DLLCalibrationStart(&hhrtim1, HRTIM_CALIBRATIONRATE_14) != HAL_OK){Error_Handler();}if (HAL_HRTIM_PollForDLLCalibration(&hhrtim1, 10) != HAL_OK){Error_Handler();}pADCTriggerCfg.UpdateSource = HRTIM_ADCTRIGGERUPDATE_MASTER;pADCTriggerCfg.Trigger = HRTIM_ADCTRIGGEREVENT24_TIMERA_CMP2;if (HAL_HRTIM_ADCTriggerConfig(&hhrtim1, HRTIM_ADCTRIGGER_2, &pADCTriggerCfg) != HAL_OK){Error_Handler();}pADCTriggerCfg.Trigger = HRTIM_ADCTRIGGEREVENT24_TIMERB_CMP2;if (HAL_HRTIM_ADCTriggerConfig(&hhrtim1, HRTIM_ADCTRIGGER_4, &pADCTriggerCfg) != HAL_OK){Error_Handler();}pTimeBaseCfg.Period = 15360;pTimeBaseCfg.RepetitionCounter = 0x00;pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, &pTimeBaseCfg) != HAL_OK){Error_Handler();}pTimerCfg.InterruptRequests = HRTIM_MASTER_IT_NONE;pTimerCfg.DMARequests = HRTIM_MASTER_DMA_NONE;pTimerCfg.DMASrcAddress = 0x0000;pTimerCfg.DMADstAddress = 0x0000;pTimerCfg.DMASize = 0x1;pTimerCfg.HalfModeEnable = HRTIM_HALFMODE_DISABLED;pTimerCfg.StartOnSync = HRTIM_SYNCSTART_DISABLED;pTimerCfg.ResetOnSync = HRTIM_SYNCRESET_DISABLED;pTimerCfg.DACSynchro = HRTIM_DACSYNC_NONE;pTimerCfg.PreloadEnable = HRTIM_PRELOAD_DISABLED;pTimerCfg.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;pTimerCfg.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;pTimerCfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_DISABLED;if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, &pTimerCfg) != HAL_OK){Error_Handler();}pCompareCfg.CompareValue = 7680;if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK){Error_Handler();}if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pTimeBaseCfg) != HAL_OK){Error_Handler();}pTimerCfg.InterruptRequests = HRTIM_TIM_IT_NONE;pTimerCfg.DMARequests = HRTIM_TIM_DMA_NONE;pTimerCfg.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;pTimerCfg.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;pTimerCfg.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;pTimerCfg.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;pTimerCfg.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;pTimerCfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;pTimerCfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;pTimerCfg.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pTimerCfg) != HAL_OK){Error_Handler();}if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pTimerCfg) != HAL_OK){Error_Handler();}pCompareCfg.CompareValue = 2000;pCompareCfg.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;pCompareCfg.AutoDelayedTimeout = 0x0000;
if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_2, &pCompareCfg) != HAL_OK){Error_Handler();}
if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_2, &pCompareCfg) != HAL_OK){Error_Handler();}pCompareCfg.CompareValue = 100;
if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_4, &pCompareCfg) != HAL_OK){Error_Handler();}pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;pOutputCfg.SetSource = HRTIM_OUTPUTSET_MASTERPER;pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_MASTERCMP1;pOutputCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;pOutputCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;pOutputCfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;pOutputCfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &pOutputCfg) != HAL_OK){Error_Handler();}pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMCMP4;if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB1, &pOutputCfg) != HAL_OK){Error_Handler();}pOutputCfg.SetSource = HRTIM_OUTPUTSET_NONE;pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_NONE;if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA2, &pOutputCfg) != HAL_OK){Error_Handler();}if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB2, &pOutputCfg) != HAL_OK){Error_Handler();}if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pTimeBaseCfg) != HAL_OK){Error_Handler();}/ USER CODE BEGIN HRTIM1_Init 2 /
/ USER CODE END HRTIM1_Init 2 /HAL_HRTIM_MspPostInit(&hhrtim1);
举报

北上北京

2025-3-8 17:22:45

要在STM32F334上配置PB1输出HRTIM同步信号,你需要确保以下几个步骤正确配置。以下是一个详细的配置流程:


1. 使用STM32CubeMX配置HRTIM



  1. 打开STM32CubeMX并选择你的STM32F334芯片。

  2. 启用HRTIM

    • 在“Timers”选项卡中找到HRTIM。

    • 启用HRTIM,并配置你需要的定时器单元(例如Timer A, Timer B等)。


  3. 配置同步输出

    • 在HRTIM配置中,找到“Synchronization Output”选项。

    • 选择你需要的同步输出信号(例如SYNCOUT1, SYNCOUT2等)。

    • 将同步输出映射到PB1引脚。通常,你可以通过选择“Alternate Function”来将PB1配置为HRTIM的同步输出引脚。



2. 配置PB1引脚



  1. 配置PB1为复用功能

    • 在“Pinout & Configuration”选项卡中,找到PB1引脚。

    • 将PB1配置为“Alternate Function”模式。

    • 选择正确的复用功能(例如HRTIM_SYNCOUT1或HRTIM_SYNCOUT2,具体取决于你的配置)。



3. 生成代码并检查



  1. 生成代码

    • 完成配置后,点击“Generate Code”生成初始化代码。


  2. 检查生成的代码

    • 打开生成的代码,检查main.c文件中的MX_HRTIM_Init()函数,确保HRTIM和PB1的配置正确。

    • 检查MX_GPIO_Init()函数,确保PB1引脚被正确配置为复用功能。



4. 启动HRTIM并测试



  1. 启动HRTIM

    • main()函数中,确保调用了HAL_HRTIM_Start()函数来启动HRTIM。


  2. 测试PB1引脚

    • 使用示波器或逻辑分析仪测量PB1引脚,检查是否有同步信号输出。



5. 调试和验证



  1. 检查时钟配置

    • 确保HRTIM的时钟源已正确配置并启用。


  2. 检查同步输出配置

    • 确保同步输出的配置与HRTIM的定时器单元配置一致。


  3. 检查PB1引脚状态

    • 使用调试器检查PB1引脚的状态,确保它被正确配置为输出模式。



示例代码片段


以下是一个简单的代码片段,展示了如何配置和启动HRTIM:


// main.c
int main(void)
{
  // 初始化HAL库
  HAL_Init();

  // 配置系统时钟
  SystemClock_Config();

  // 初始化所有配置的外设
  MX_GPIO_Init();
  MX_HRTIM_Init();

  // 启动HRTIM
  HAL_HRTIM_Start(&hhrtim, HRTIM_TIMERID_MASTER);

  while (1)
  {
    // 主循环
  }
}

// hrtim.c
void MX_HRTIM_Init(void)
{
  // HRTIM初始化代码
  // 确保同步输出配置正确
}

// gpio.c
void MX_GPIO_Init(void)
{
  // GPIO初始化代码
  // 确保PB1配置为复用功能
}

总结


如果按照上述步骤配置后,PB1引脚仍然没有同步信号输出,建议检查以下几点:



  • 确认PB1引脚没有被其他外设占用。

  • 确认HRTIM的时钟配置正确。

  • 确认同步输出的配置与HRTIM的定时器单元配置一致。


通过仔细检查这些配置,你应该能够成功在PB1引脚上输出HRTIM的同步信号。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分