344 lines
9.2 KiB
C
344 lines
9.2 KiB
C
/********************************************************************************
|
||
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<Xms; i++) //system clock = 24MHz
|
||
{
|
||
for(j=0; j<Tcnt; j++)
|
||
{
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: ClrRam
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 清零DATA、IDATA、XRAM区域;堆栈区域不清零
|
||
*************************************************************************************************/
|
||
//void ClrRam(void)
|
||
//{
|
||
// U8 idata *ptr1;
|
||
// U8 xdata *ptr2;
|
||
// U8 xdata i;
|
||
// U16 idata j;
|
||
|
||
// for(i=0x08; i<=STACK_ADDR-1; i++) //clear ram address: 08H~STACK_ADDR-1
|
||
// {
|
||
// ptr1 = (U8 idata *)i;
|
||
// *ptr1 = 0;
|
||
// }
|
||
|
||
// for(j=0; j<=0xAFF; j++) //clear XDATA address:0000H-0AFFH
|
||
// {
|
||
// ptr2 = (U8 xdata *)j;
|
||
// *ptr2 = 0;
|
||
// }
|
||
//}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: RamCheckProcess
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 定时检测系统参数XRAM区的标志是否正确,如果不正确,则初始化
|
||
*************************************************************************************************/
|
||
BOOL RamCheckProcess(void)
|
||
{
|
||
if((E2ucRamCheckFlg0 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlg1 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlg2 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlg3 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlg5 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlg6 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlg7 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlg8 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlg9 != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlgA != RAM_CHECK_DATA)
|
||
|| (E2ucRamCheckFlgB != RAM_CHECK_DATA)
|
||
|| (E2uiCheckFlag != 0x5AA5))
|
||
{
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: MemorySet
|
||
* 参 数: pt--memory指针
|
||
setval---需要赋值的数据
|
||
length---需要赋值的memory长度(Byres)
|
||
* 返回值: 无
|
||
* 描 述: 定时检测系统参数XRAM区的标志是否正确,如果不正确,则初始化
|
||
*************************************************************************************************/
|
||
void MemorySet(U8 xdata *pt, U8 setval, U8 length)
|
||
{
|
||
U8 i;
|
||
for(i=0; i<length; i++)
|
||
{
|
||
*pt = setval;
|
||
pt++;
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: MemoryCopy
|
||
* 参 数: source--源Memory指针
|
||
target---目的Memory指针
|
||
length---需要拷贝的数据长度(Byres)
|
||
* 返回值: 无
|
||
* 描 述: 定时检测系统参数XRAM区的标志是否正确,如果不正确,则初始化
|
||
*************************************************************************************************/
|
||
void MemoryCopy(U8 xdata *source, U8 xdata *target, U8 length)
|
||
{
|
||
U8 i;
|
||
for(i=0; i<length; i++)
|
||
{
|
||
*target = *source;
|
||
target++;
|
||
source++;
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: McuIntoIdle、McuIntoPD
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: MCU进入PD(掉电模式)和IDLE模式,以降低功耗
|
||
*************************************************************************************************/
|
||
void McuIntoIdle(void)
|
||
{
|
||
SUSLO = 0x55;
|
||
PCON |= 0x01;
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
}
|
||
|
||
void McuIntoPD(void)
|
||
{
|
||
SUSLO = 0x55;
|
||
PCON |= 0x02;
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
_nop_();
|
||
}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: SystemResetProcess
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 系统复位,从程序起始地址开始执行
|
||
*************************************************************************************************/
|
||
void SystemResetProcess(void)
|
||
{
|
||
if( (ucResetFlag==0x12) && (bUart0SndAckFlg||bUart1SndAckFlg||bUart2SndAckFlg) //Software reset occurs, and ended UART communication
|
||
&& (!bMcuFlashWrWaitFlg) && (!bMcuFlashWrFlg) ) //Flash has been updated
|
||
{
|
||
IrqDis();
|
||
IEN0 = 0x00; //Disable Interrupt
|
||
IEN1 = 0x00;
|
||
TCON = 0x00;
|
||
EXF0 = 0x00;
|
||
|
||
SBRTH = 0x00; //Disable UART0
|
||
SBRTL = 0x00;
|
||
SCON = 0x00;
|
||
|
||
((void(code*)(void))0x0000)(); //指向起始地址
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|