问答

汇集网友智慧,解决技术难题

21ic问答首页 - 使用HC32F005的TIME5输出不了PWM

华大芯片 HC PWM TI 使用 输出

使用HC32F005的TIME5输出不了PWM

RDT20202022-04-14
用的是华大开发库,想分别用TIME4,TIME5,TIME6输出周期和占空比是一样的互补PWM信号。但发现只有TIME4,TIME6可正常输出,而TIME5的CHA只固定输出个高电平,CHB则固定输出个低电平。想不明白,因为TIME4,5,6都是的同样配置函数,只是输出引脚不同,相关的引脚也选择相应的复用功能,唯独TIME5不正常工作,是不是TIME5有什么特别的地方?
说明一下:
TIME4  用的IO输出是P23,P26
TIME5  用的IO输出是P33,P34
TIME6  用的IO输出是P35,P36


回答 +关注 5
693人浏览 5人回答问题 分享 举报
5 个回答
  • 找到了,另外一个开发文档《HC32F003系列_HC32F005系列用户手册Rev2.31.pdf》关于IO功能配置这里,说法与你说的是一致的。
    而在文档《HC32F003系列_HC32F005系列数据手册Rev2.8.pdf》这里面说的是错误的,谢谢楼上回答
  • 感谢你的回复,这是我在文档上面看到的配置,感觉是在功能2上啊,请帮忙指出,谢谢
  • 你虽然照搬了例程,却忘了P33和P34的TIM5输出PWM功能,并不在功能2上,看书要仔细啊。
  • 看到资料TIME4/5/6三个定时器是一样的,没什么特别的地方,不知哪个出错或者漏掉什么了
  • 用的也是官方的例子

    static void ADV_TIM5_Config(uint16_t u16Period, uint16_t u16CHA_PWMDuty)
    {
        stc_gpio_cfg_t            stcTIM5Port;
           
        en_adt_compare_t          enAdtCompareA;
        stc_adt_basecnt_cfg_t     stcAdtBaseCntCfg;
        stc_adt_CHxX_port_cfg_t   stcAdtTIM5ACfg;

        //---------PWM输出IO设置-------------------------------------
        DDL_ZERO_STRUCT(stcTIM5Port);

        Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //端口外设时钟使能
           
        stcTIM5Port.enDir  = GpioDirOut;
        //P33 34设置为 TIM5_CHB  TIM5_CHA
        Gpio_Init(GpioPort3, GpioPin3, &stcTIM5Port);
               Gpio_Init(GpioPort3, GpioPin4, &stcTIM5Port);
        Gpio_SetAfMode(GpioPort3, GpioPin3,GpioAf2);
        Gpio_SetAfMode(GpioPort3, GpioPin4,GpioAf2);

               //-----------PWM输出方式定义--------------------------------------------------------
               DDL_ZERO_STRUCT(stcAdtBaseCntCfg);
        DDL_ZERO_STRUCT(stcAdtTIM5ACfg);
        Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE);    //ADT外设时钟使能

        stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;                 //锯齿波模式
        stcAdtBaseCntCfg.enCntDir = AdtCntUp;
        stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0;

        Adt_Init(M0P_ADTIM5, &stcAdtBaseCntCfg);                      //ADT载波、计数模式、时钟配置

        Adt_SetPeriod(M0P_ADTIM5, u16Period);                         //周期设置

        enAdtCompareA = AdtCompareA;
        Adt_SetCompareValue(M0P_ADTIM5, enAdtCompareA, u16CHA_PWMDuty);  //通用比较基准值寄存器A设置
        enAdtCompareA = AdtCompareB;
        Adt_SetCompareValue(M0P_ADTIM5, enAdtCompareA, u16CHA_PWMDuty);  //通用比较基准值寄存器A设置

        stcAdtTIM5ACfg.enCap = AdtCHxCompareOutput;            //比较输出
        stcAdtTIM5ACfg.bOutEn = TRUE;                          //CHA输出使能
        stcAdtTIM5ACfg.enPerc = AdtCHxPeriodLow;               //计数值与周期匹配时CHA电平保持不变
        stcAdtTIM5ACfg.enCmpc = AdtCHxCompareHigh;             //计数值与比较值A匹配时,CHA电平翻转
        stcAdtTIM5ACfg.enStaStp = AdtCHxStateSelSS;            //CHA起始结束电平由STACA与STPCA控制
        stcAdtTIM5ACfg.enStaOut = AdtCHxPortOutLow;            //CHA起始电平为低
        stcAdtTIM5ACfg.enStpOut = AdtCHxPortOutLow;            //CHA结束电平为低
        Adt_CHxXPortCfg(M0P_ADTIM5, AdtCHxA, &stcAdtTIM5ACfg);   //端口CHA配置
                                   
        stcAdtTIM5ACfg.enCap = AdtCHxCompareOutput;            //比较输出
        stcAdtTIM5ACfg.bOutEn = TRUE;                          //CHB输出使能
        stcAdtTIM5ACfg.enPerc = AdtCHxPeriodHigh;               //计数值与周期匹配时CHB电平保持不变
        stcAdtTIM5ACfg.enCmpc = AdtCHxCompareLow;             //计数值与比较值B匹配时,CHB电平翻转
        stcAdtTIM5ACfg.enStaStp = AdtCHxStateSelSS;            //CHB起始结束电平由STACA与STPCA控制
        stcAdtTIM5ACfg.enStaOut = AdtCHxPortOutHigh;            //CHB起始电平为低
        stcAdtTIM5ACfg.enStpOut = AdtCHxPortOutHigh;            //CHB结束电平为低
        Adt_CHxXPortCfg(M0P_ADTIM5, AdtCHxB, &stcAdtTIM5ACfg);   //端口CHB配置
                                   
        Adt_StartCount(M0P_ADTIM5); //AdvTimer6运行
    }

您需要登录后才可以回复 登录 | 注册