本帖最后由 kfhzy 于 2021-7-20 09:24 编辑
HC32F073,内部高速时钟8M,使用ADT4输出PWM,只能得到与配置值一半的时钟频率,我的PCLK配置为8M,ADT4的周期配置为100-1,按照计算应该是80kHz的PWM输出,可是实际输出只有40kHz,找了规格书,也没搞明白哪里弄错了,另外用TIM0进行计时,也用的PCLK,测试输出显示PCLK确实是8M。
时钟配置:
Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
Sysctrl_SysClkSwitch(SysctrlClkRCL);
///< 加载目标频率的RCH的TRIM值
Sysctrl_SetRCHTrim(SysctrlRchFreq8MHz);
///< 使能RCH(默认打开,此处可不需要再次打开)
//Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
///< 时钟切换到RCH
Sysctrl_SysClkSwitch(SysctrlClkRCH);
///< 关闭RCL时钟
Sysctrl_ClkSourceEnable(SysctrlClkRCL, FALSE);
SystemCoreClock = 8000000;
ADT4配置:
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE); //ADT外设时钟使能
stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;
stcAdtBaseCntCfg.enCntDir = AdtCntUp;
stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0;
Adt_Init(M0P_ADTIM4, &stcAdtBaseCntCfg); //ADT载波、计数模式、时钟配置
Adt_SetPeriod(M0P_ADTIM4, 99); //周期值
Adt_SetCompareValue(M0P_ADTIM4, AdtCompareA, 49); //通用比较基准值寄存器A设置
Adt_SetCompareValue(M0P_ADTIM4, AdtCompareB, 49); //通用比较基准值寄存器B设置
Adt_EnableValueBuf(M0P_ADTIM4, AdtCHxA, FALSE); //缓存传送A使能 GCMCR--->GCMAR,三角波A模式在下溢点传送
Adt_EnableValueBuf(M0P_ADTIM4, AdtCHxB, FALSE);
stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput; //比较输出模式
stcAdtTIM4ACfg.bOutEn = TRUE; //CHA输出使能
stcAdtTIM4ACfg.enPerc = AdtCHxPeriodKeep; //计数值与周期匹配时CHA电平保持不变
stcAdtTIM4ACfg.enCmpc = AdtCHxCompareInv; //计数值与比较值A匹配时,CHA电平翻转
stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS; //CHA起始结束电平由STACA与STPCA控制
stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutLow; //CHA起始电平为低
stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutLow; //CHA结束电平为低
Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxA, &stcAdtTIM4ACfg); //端口CHA配置
stcAdtTIM4BCfg.enCap = AdtCHxCompareOutput;
stcAdtTIM4BCfg.bOutEn = TRUE;
stcAdtTIM4BCfg.enPerc = AdtCHxPeriodKeep;
stcAdtTIM4BCfg.enCmpc = AdtCHxCompareInv;
stcAdtTIM4BCfg.enStaStp = AdtCHxStateSelSS;
stcAdtTIM4BCfg.enStaOut = AdtCHxPortOutLow;
stcAdtTIM4BCfg.enStpOut = AdtCHxPortOutLow; //CHB结束电平为低
Adt_CHxXPortCfg(M0P_ADTIM4, AdtCHxB, &stcAdtTIM4BCfg); //端口CHB配置
// Adt_SetDTUA(M0P_ADTIM4, 0x2000); //CNT向上计数时的死区时间,GCMBR = GCMAR - DTUAR
// Adt_SetDTDA(M0P_ADTIM4, 0x2000); //CNT向下计数时的死区时间,GCMBR = GCMAR - DTDAR
// Adt_CfgDT(M0P_ADTIM4, TRUE, TRUE); //中断使能,并且DTUAR和DTDAR自动相等
Adt_ClearAllIrqFlag(M0P_ADTIM4); //清标志位
// Adt_CfgIrq(M0P_ADTIM4, AdtUDFIrq, TRUE); //下溢中断配置
// EnableNvic(ADTIM4_IRQn, IrqLevel3, TRUE); //使能AdvTimer4 中断
Adt_StartCount(M0P_ADTIM4);
|