qiuyuqiang001 发表于 2018-8-13 18:51:19

STM32F334 HRTIM 无法输出PWM

STM32F334,用的cubeMX设置,如图:使用timer E, PC8,PC9输出,使用外部时钟,HRTIM 144M,

qiuyuqiang001 发表于 2018-8-13 18:52:43

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:53:59

qiuyuqiang001 发表于 2018-8-13 18:52
CUBE生成代码如下:

static void MX_HRTIM1_Init(void)


烧录后PC8,PC9始终没有输出,调试了一整天,没有任何头绪,希望用过的高手能帮忙给看看问题出在哪儿,非常感谢

wenyangzeng 发表于 2018-8-13 19:54:27

qiuyuqiang001 发表于 2018-8-13 18:53
烧录后PC8,PC9始终没有输出,调试了一整天,没有任何头绪,希望用过的高手能帮忙给看看问题出在哪儿,非 ...

好像少了输出使能:
HAL_HRTIM_WaveformOutputStart(&hhrtim1, ENABLE);

qiuyuqiang001 发表于 2018-8-13 20:26:46

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:17:35

本帖最后由 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);

}





feixiang20 发表于 2018-8-13 23:19:47

可以参考类似的实例,引脚配置好了吗?可以先试下用高级/通用定时器输出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波形

qiuyuqiang001 发表于 2018-8-14 13:45:26

feixiang20 发表于 2018-8-13 23:19
可以参考类似的实例,引脚配置好了吗?可以先试下用高级/通用定时器输出PWM,成功了再换HRTIM。或许是主函 ...

暂时没有找到HAL库的例子,管脚配置我找不出毛病来,

qiuyuqiang001 发表于 2018-8-14 13:47:29

wenyangzeng 发表于 2018-8-13 21:17
HTIM我也没玩过。
其实你要输出PWM直接用定时器TIMx就很方便,为何要用HRTIM?
搬运工,搬运一个网上下载的 ...

因为HRTIM功能比较强大,向后面熟悉了做数字电源用,程序我试一下,谢谢

budaoweng 发表于 2018-8-18 08:30:04

现在比较忙,没时间仔细看你得帖子,不过我有一个好办法能帮助你在很短的时间里搞定。多看HRTIM的寄存器,一个礼拜的时间就能把你想学的都学到手了。要有耐心,才调一天,不算什么
页: [1] 2
查看完整版本: STM32F334 HRTIM 无法输出PWM