ZDBMS/code_drv/McuLib.c

344 lines
9.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
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: 定时器的基准源分别为32KHz128KHz24MHz的系统时钟
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
* 参 数: PwmFreqPWM的频率HzDutyRatioPWM的高电平占空比
* 返回值: 无
* 描 述: 初始化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)(); //指向起始地址
}
}