STM32F334 HRTIM 无法输出PWM
STM32F334,用的cubeMX设置,如图:使用timer E, PC8,PC9输出,使用外部时钟,HRTIM 144M,CUBE生成代码如下:
static void MX_HRTIM1_Init(void)
{
HRTIM_TimeBaseCfgTypeDef pTimeBaseCfg;
HRTIM_TimerCfgTypeDef pTimerCfg;
HRTIM_CompareCfgTypeDef pCompareCfg;
HRTIM_OutputCfgTypeDef pOutputCfg;
hhrtim1.Instance = HRTIM1;
hhrtim1.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
hhrtim1.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;
if (HAL_HRTIM_Init(&hhrtim1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
if (HAL_HRTIM_DLLCalibrationStart(&hhrtim1, HRTIM_CALIBRATIONRATE_14) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
if (HAL_HRTIM_PollForDLLCalibration(&hhrtim1, 10) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
pTimeBaseCfg.Period = 30000;
pTimeBaseCfg.RepetitionCounter = 0x00;
pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;
if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, &pTimeBaseCfg) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
pTimerCfg.InterruptRequests = HRTIM_MASTER_IT_NONE;
pTimerCfg.DMARequests = HRTIM_TIM_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_ENABLED;
pTimerCfg.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
pTimerCfg.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
pTimerCfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_DISABLED;
pTimerCfg.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
pTimerCfg.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
pTimerCfg.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
pTimerCfg.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;
pTimerCfg.DelayedProtectionMode = HRTIM_TIMER_D_E_DELAYEDPROTECTION_DISABLED;
pTimerCfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;
pTimerCfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_UPDATE;
pTimerCfg.ResetUpdate = HRTIM_TIMUPDATEONRESET_ENABLED;
if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, &pTimerCfg) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
pCompareCfg.CompareValue = 15000;
if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMPER;
pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
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_E, HRTIM_OUTPUT_TE1, &pOutputCfg) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE2, &pOutputCfg) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_HRTIM_MspPostInit(&hhrtim1);
} qiuyuqiang001 发表于 2018-8-13 18:52
CUBE生成代码如下:
static void MX_HRTIM1_Init(void)
烧录后PC8,PC9始终没有输出,调试了一整天,没有任何头绪,希望用过的高手能帮忙给看看问题出在哪儿,非常感谢 qiuyuqiang001 发表于 2018-8-13 18:53
烧录后PC8,PC9始终没有输出,调试了一整天,没有任何头绪,希望用过的高手能帮忙给看看问题出在哪儿,非 ...
好像少了输出使能:
HAL_HRTIM_WaveformOutputStart(&hhrtim1, ENABLE); wenyangzeng 发表于 2018-8-13 19:54
好像少了输出使能:
HAL_HRTIM_WaveformOutputStart(&hhrtim1, ENABLE);
谢谢前辈的回复,但是还是不行,我找到库里函数的原型,应该是:
HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TE1);
HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TE1);
加上这两个函数后还是没有反应,我又写了个函数使能timer E
void timerE_enable(void) //使能timer E
{
HRTIM_Master_TypeDefpmaster;
pmaster.MCR= HRTIM_TIMERID_TIMER_E;
}
在主函数里面调用,还是没有反应,能不能再帮忙给看看,尤其是CUBEMX里面HRTIM的设置界面里面有没有参数选择的不对?谢谢!已经弄了一整天了 本帖最后由 wenyangzeng 于 2018-8-13 21:23 编辑
qiuyuqiang001 发表于 2018-8-13 20:26
谢谢前辈的回复,但是还是不行,我找到库里函数的原型,应该是:
HAL_HRTIM_WaveformOutputStart(&hhrtim ...
HTIM我也没玩过。
其实你要输出PWM直接用定时器TIMx就很方便,为何要用HRTIM?
搬运工,搬运一个网上下载的代码,不知道能用否:
void HRTIM_Config(void)
{
HRTIM_OutputCfgTypeDef HRTIM_TIM_OutputStructure;
HRTIM_BaseInitTypeDef HRTIM_BaseInitStructure;
HRTIM_TimerInitTypeDef HRTIM_TimerInitStructure;
HRTIM_TimerCfgTypeDef HRTIM_TimerWaveStructure;
HRTIM_CompareCfgTypeDef HRTIM_CompareStructure;
HRTIM_DeadTimeCfgTypeDef HRTIM_DeadtimeStructure;
RCC_HRTIM1CLKConfig(RCC_HRTIM1CLK_PLLCLK);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_HRTIM1,ENABLE);
HRTIM_DLLCalibrationStart(HRTIM1, HRTIM_CALIBRATIONRATE_14);
HRTIM1_COMMON->DLLCR |= HRTIM_DLLCR_CALEN;
while(HRTIM_GetCommonFlagStatus(HRTIM1, HRTIM_ISR_DLLRDY) == RESET);
GPIO_HRTIM_outputs_Config();
HRTIM_BaseInitStructure.Mode=HRTIM_MODE_CONTINOUS;
HRTIM_BaseInitStructure.Period=PERIOD;
HRTIM_BaseInitStructure.PrescalerRatio=HRTIM_PRESCALERRATIO_MUL32;
HRTIM_BaseInitStructure.RepetitionCounter=0x00;
//HRTIM_SimpleBase_Init(HRTIM1,HRTIM_TIMERINDEX_TIMER_D,&HRTIM_BaseInitStructure);
HRTIM_TimerInitStructure.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
HRTIM_TimerInitStructure.StartOnSync = HRTIM_SYNCSTART_DISABLED;
HRTIM_TimerInitStructure.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
HRTIM_TimerInitStructure.DACSynchro = HRTIM_DACSYNC_NONE;
HRTIM_TimerInitStructure.PreloadEnable = HRTIM_PRELOAD_ENABLED;
HRTIM_TimerInitStructure.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
HRTIM_TimerInitStructure.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
HRTIM_TimerInitStructure.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
HRTIM_Waveform_Init(HRTIM1,HRTIM_TIMERINDEX_TIMER_D,&HRTIM_BaseInitStructure,&HRTIM_TimerInitStructure);
HRTIM_TimerWaveStructure.DeadTimeInsertion=HRTIM_TIMDEADTIMEINSERTION_ENABLED;
HRTIM_TimerWaveStructure.DelayedProtectionMode = HRTIM_TIMDELAYEDPROTECTION_DISABLED;
HRTIM_TimerWaveStructure.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
HRTIM_TimerWaveStructure.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
HRTIM_TimerWaveStructure.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
HRTIM_TimerWaveStructure.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
HRTIM_TimerWaveStructure.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
HRTIM_TimerWaveStructure.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;
HRTIM_WaveformTimerConfig(HRTIM1,HRTIM_TIMERINDEX_TIMER_D,&HRTIM_TimerWaveStructure);
HRTIM_TIM_OutputStructure.Polarity=HRTIM_OUTPUTPOLARITY_HIGH;
HRTIM_TIM_OutputStructure.SetSource=HRTIM_OUTPUTSET_TIMPER;
HRTIM_TIM_OutputStructure.ResetSource=HRTIM_OUTPUTRESET_TIMCMP1;
HRTIM_TIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
HRTIM_TIM_OutputStructure.IdleState = HRTIM_OUTPUTIDLESTATE_INACTIVE;
HRTIM_TIM_OutputStructure.FaultState = HRTIM_OUTPUTFAULTSTATE_INACTIVE;
HRTIM_TIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
HRTIM_TIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
HRTIM_WaveformOutputConfig(HRTIM1,HRTIM_TIMERINDEX_TIMER_D,HRTIM_OUTPUT_TD1,&HRTIM_TIM_OutputStructure);
//HRTIM_WaveformOutputConfig(HRTIM1,HRTIM_TIMERINDEX_TIMER_D,HRTIM_OUTPUT_TD2,&HRTIM_TIM_OutputStructure);
HRTIM_CompareStructure.AutoDelayedMode=HRTIM_AUTODELAYEDMODE_REGULAR;
HRTIM_CompareStructure.AutoDelayedTimeout=0x00;
HRTIM_CompareStructure.CompareValue=PERIOD/2;
HRTIM_WaveformCompareConfig(HRTIM1,HRTIM_TIMERINDEX_TIMER_D,HRTIM_COMPAREUNIT_1,&HRTIM_CompareStructure);
HRTIM_DeadtimeStructure.FallingLock=HRTIM_TIMDEADTIME_FALLINGLOCK_READONLY;
HRTIM_DeadtimeStructure.FallingSign=HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
HRTIM_DeadtimeStructure.FallingSignLock=HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_READONLY;
HRTIM_DeadtimeStructure.FallingValue=0X00;
HRTIM_DeadtimeStructure.RisingLock=HRTIM_TIMDEADTIME_RISINGLOCK_READONLY;
HRTIM_DeadtimeStructure.RisingSign=HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
HRTIM_DeadtimeStructure.RisingSignLock=HRTIM_TIMDEADTIME_RISINGSIGNLOCK_READONLY;
HRTIM_DeadtimeStructure.RisingValue=0X00;
HRTIM_DeadTimeConfig(HRTIM1,HRTIM_TIMERINDEX_TIMER_D,&HRTIM_DeadtimeStructure);
HRTIM_WaveformOutputStart(HRTIM1,HRTIM_OUTPUT_TD1);
HRTIM_WaveformOutputStart(HRTIM1,HRTIM_OUTPUT_TD2);
HRTIM_WaveformCounterStart(HRTIM1,HRTIM_TIMERID_TIMER_D);
}
可以参考类似的实例,引脚配置好了吗?可以先试下用高级/通用定时器输出PWM,成功了再换HRTIM。或许是主函数里的TIM_SetCompare1没换成TIM_SetCompare2。
HRTIM_OutputCfgTypeDef HRTIM_TIM_OutputStructure;//配置输出特性,高低电平等
HRTIM_BaseInitTypeDef HRTIM_BaseInitStructure;//配置基本参数,这部分和普通定时器一样
HRTIM_TimerInitTypeDef HRTIM_TimerInitStructure;//配置不同模式
HRTIM_TimerCfgTypeDef HRTIM_TimerWaveStructure;//配置波形参数,错误等
HRTIM_CompareCfgTypeDef HRTIM_CompareStructure;//配置比较寄存器
用以上几个部分就能产生最简单的PWM波形 feixiang20 发表于 2018-8-13 23:19
可以参考类似的实例,引脚配置好了吗?可以先试下用高级/通用定时器输出PWM,成功了再换HRTIM。或许是主函 ...
暂时没有找到HAL库的例子,管脚配置我找不出毛病来, wenyangzeng 发表于 2018-8-13 21:17
HTIM我也没玩过。
其实你要输出PWM直接用定时器TIMx就很方便,为何要用HRTIM?
搬运工,搬运一个网上下载的 ...
因为HRTIM功能比较强大,向后面熟悉了做数字电源用,程序我试一下,谢谢 现在比较忙,没时间仔细看你得帖子,不过我有一个好办法能帮助你在很短的时间里搞定。多看HRTIM的寄存器,一个礼拜的时间就能把你想学的都学到手了。要有耐心,才调一天,不算什么
页:
[1]
2