/******************************************************************************** Copyright (C), Sinowealth Electronic. Ltd. Author: Sino Version: V0.0 Date: 2020/04/26 History: V2.0 2020/04/26 Preliminary ********************************************************************************/ #include "Main.h" /************************************************************************************************* * 函数名: McuTimer3Set * 参 数: ClkSource: 定时器的基准源(分别为32KHz,128KHz,24MHz的系统时钟) XmS,定时器周期(当周期小于1000mS时,可选择以上三个时钟;当周期大于1000mS时,只能选择32KHz和128KHz) * 返回值: 无 * 描 述: 初始化Timer3定时器,并开启定时器 *************************************************************************************************/ void McuTimer3Set(U8 ClkSource, U16 XmS) { U16 TempVal; McuBank1Sel(); // if(ClkSource == TIM_CLK_32KHz) // { // if(XmS < 1000) // { // T3CON = 0x02; //外部32.768kHz为时钟源,1分频,最大2S // TempVal = (U32)0x10000 - (U32)32.768*XmS; // } // else // { // T3CON = 0x22; //外部32.768kHz为时钟源,64分频,最大128s // TempVal = 0x10000 - (U32)32.768*XmS/64; // } // } // else if(ClkSource == TIM_CLK_128KHz) // { // if(XmS < 4000) // { // T3CON = 0x12; //外部128kHz为时钟源,8分频,最大4.096S // TempVal = 0x10000 - (U32)128*XmS/8; // } // else // { // T3CON = 0x32; //外部128kHz为时钟源,256分频,最大131.072S // TempVal = 0x10000 - (U32)128*XmS/256; // } // } // else if(ClkSource == TIM_CLK_24MHz) // { // if(XmS < 500) // { // T3CON = 0x30; //系统24MHz为时钟源,256分频,最大669.5ms // TempVal = 0x10000 - (U32)24000*XmS/256; // } // else // { // T3CON = 0x32; //外部128kHz为时钟源,256分频,最大131.072S // TempVal = 0x10000 - (U32)128*XmS/256; // } // } //8MHz晶振 T3CON = 0x30; //系统8MHz为时钟源,256分频,最大669.5ms TempVal = 0x10000 - (U32)8000*XmS/256; TL3 = TempVal; TH3 = TempVal>>8; TR3 = 1; //启动定时器3 McuBank0Sel(); } /************************************************************************************************* * 函数名: McuClockSet * 参 数: SysClock:当前所需设置的系统时钟 * 返回值: 无 * 描 述: 初始化AFE *************************************************************************************************/ void McuClockSet(U8 SysClock) { U8 ea; ea = EA; EA = 0; CLKCON |= 0x08; //SETB HFON _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); CLKCON &= 0x60; CLKCON |= 0x04; //SETB FS, SYSCLK=24M EA = ea; } /************************************************************************************************* * 函数名: McuPWM0Set、McuPWM1Set、McuPWM2Set * 参 数: PwmFreq:PWM的频率Hz;DutyRatio:PWM的高电平占空比 * 返回值: 无 * 描 述: 初始化AFE *************************************************************************************************/ void McuPWM0Set(U16 PwmFreq, U8 DutyRatio) { PWM0CON = 0xb0; //系统时钟/64 PWM0PL = 375000/PwmFreq; //PWM2P=24000000/(64*E2uiDSG1PWMFreq); PWM0PH = (375000/PwmFreq) >> 8; PWM0DL = (U16)(PWM0PL+PWM0PH*256)*DutyRatio/100; PWM0DH = ((U16)(PWM0PL+PWM0PH*256)*DutyRatio/100) >> 8; } void McuPWM1Set(U16 PwmFreq, U8 DutyRatio) { PWM1CON = 0xb0; //系统时钟/64 PWM1PL = 375000/PwmFreq; //PWM2P=24000000/(64*E2uiDSG1PWMFreq); PWM1PH = (375000/PwmFreq) >> 8; PWM1DL = (U16)(PWM1PL+(U16)PWM1PH*256)*DutyRatio/100; PWM1DH = ((U16)(PWM1PL+(U16)PWM1PH*256)*DutyRatio/100) >> 8; } void McuPWM2Set(U16 PwmFreq, U8 DutyRatio) { PWM2CON = 0xb0; //系统时钟/64 PWM2PL = 375000/PwmFreq; //PWM2P=24000000/(64*E2uiDSG1PWMFreq); PWM2PH = (375000/PwmFreq) >> 8; PWM2DL = (U16)(PWM2PL+(U16)PWM2PH*256)*DutyRatio/100; PWM2DH = ((U16)(PWM2PL+(U16)PWM2PH*256)*DutyRatio/100) >> 8; } /************************************************************************************************* * 函数名: Delay1ms * 参 数: Xms:延迟多少mS * 返回值: 无 * 描 述: 延时函数,单位为1mS 特别注意该函数的延时准确性问题,在不同优化等级时,反汇编不同造成延时不一致,实测如下: 1.当配置选项里的代码优化等级设置为3时,j=1670,若禁止所有中断,则实际延时为3.484ms,不禁止中断则受中断影响,达到3.804ms 2.当配置选项里的代码优化等级设置为3时,j=480,若禁止所有中断,则实际延时为1.010ms,不禁止中断则受中断影响,达到1.104ms 3.当配置选项里的代码优化等级设置为7时,j=1670,若禁止所有中断,则实际延时为1.002ms,不禁止中断则受中断影响,达到1.090ms *************************************************************************************************/ void Delay1ms(U8 Xms) { U8 i; U16 j, Tcnt; if((CLKCON&0x70) == MCU_CLK_24MHz) { Tcnt = 1670; } else if((CLKCON&0x70) == MCU_CLK_12MHz) { Tcnt = 1670/2; } else if((CLKCON&0x70) == MCU_CLK_6MHz) { Tcnt = 1670/4; } else //2MHz { Tcnt = 1670/12; } for(i=0; i