
我尝试通过cube配置HRTIM的同步输出,输出管脚选择PB1,并且在生成的工程中启用了HRTIM,但实际运行测试发现,在PA8管脚上有PWM波形输出,说明HRTIM已正常启动运行,但PB1管脚上没有任何波形,不知是哪里配置的问题,导致没有同步信号输出呢? |
STM32F373的VDDSD电压一直处于2.5v左右,其他电压正常,附上原理图,求指导
谜之BUG求解
STM32G030F6P6写FLASH最后8字节出错
stm32的同一个定时器,不同的通道,可以不同时的输出pwm波形吗
哪里能下载ST官方展示的NUCLEO-G071RB配合X-NUCLEO-GFX01M1运行TouchGFX案例的源程序?
STM32的上电启动过程
STM32中如何实现数据加密
I2C从模式编程之STOP中断
I2C从模式编程之空闲状态
STM32的I2S外设
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);
其实,你贴cubeMx的配置会更直观点。
我手边一会没找到F334的板,使用STM32G474开发板做了测试验证,可以实现HRTIM的同步输出。
这里提醒下:
1、一定要使能MASTER TIMER;
2、在同步输出那里要选择合适的同步输出触发源,比方可以针对MASTER的比较事件,TIMA的启动或复位事件;
3、你如果选择TIMER的启动和复位事件,如果程序运行过程中没有复位事件,是看不到基于复位事件的同步输出的,但启动事件一般来讲每次运行代码就一个,过了就过了,可能要不停复位才看得到。为了快速验证这个功能,可以先基于master的周期性比较事件来观察同步输出;
4、你HRTIM相关代码没啥问题,即该配置的 该启动都正确无误;