chiplib.c
来自「电能表源码」· C语言 代码 · 共 498 行
C
498 行
/*************************************************************************************
文件类型:底层驱动函数文件
文件作用:
修改权限:底层驱动维护人员
文件相关:
创 建 人:GeminiKQ
创建日期:2006.12.19
当前版本:Ver0.1
版本信息:Ver0.1 GeminiKQ
**************************************************************************************/
//#include "ExTigReg.h"
//#include "ChipMac.h"
//#include "HardwareDef.h"
//#include "defvar.h"
#include "tiger.h"
#define WPADDRESS 0x1094 // 写缓存首地址
#define RLADDRESS 0x1093 // 读缓存末地址
//=======================================================
//函数名:W_Buff
//函数作用:写数据到写缓存
//入口参数:需要写的32位数据
//出口参数:无
//
//=======================================================
void W_Buff(unsigned long lword)
{
unsigned char xdata *point;
point = WPADDRESS;
*(point++) = (unsigned char)lword;
*(point++) = (unsigned char)(lword>>8);
*(point++) = (unsigned char)(lword>>16);
*point = (unsigned char)(lword>>24);
}
//=======================================================
//函数名:W_Byte
//出口参数:无
//
//函数作用:写数据到地址
//入口参数:Addr-目标地址,Wdata-操作数据
//=======================================================
void W_Byte(unsigned int Addr,unsigned char Wdata)
{
unsigned char xdata *point;
point = Addr;
*point = Wdata;
}
//=======================================================
//函数名:R_Byte
//函数作用:从目标地址读数据
//入口参数:目标地址
//出口参数:读出的数据
//
//=======================================================
unsigned char R_Byte(unsigned int Addr)
{
unsigned char xdata *point;
unsigned char Rdata;
point = Addr;
Rdata = *point;
return Rdata;
}
//=======================================================
//函数名:R_Buff
//函数作用:从读缓存读数据
//入口参数:无
//出口参数:读出的32位数据
//
//=======================================================
unsigned long R_Buff(void)
{
unsigned char xdata *point;
unsigned long longword;
point = RLADDRESS;
longword = *(point--);
longword <<= 8;
longword += *(point--);
longword <<= 8;
longword += *(point--);
longword <<= 8;
longword += *(point--);
return longword;
}
//=======================================================
//函数名:Init_ExTU2
//函数作用:外扩timer2及uart2模块初始化
//入口参数:无
//出口参数:无
//
//=======================================================
void Init_ExTU2(void)
{
// timer mode control
TMOD2 = ExT2M;
TL20 = ExT2TL;
TH20 = ExT2TH;
#ifdef ExT2_4CLK
// T0M = 1 -> t0clk = system.clk/4
TCON2 |= BIT4;
#endif
// TR0 = 1; <TCON2.0>
TCON2 |= 0x01;
// 以下为串口设置
SCON2 = ExU2M; // 波特率方式1
#ifdef ExU2_SMOD1
TCON2 |= BIT7; // SET SMOD,波特率加倍
#endif
TL21 = ExU2TL;
TH21 = ExU2TH; //
// T1M = 1;
TCON2 |= BIT5;
#ifdef ExU2_38K
// 载波38K选择
Txd2FS = 0x01;
#endif
// 打开定时器1
TCON2 |= BIT1;
}
//=======================================================
//函数名:Init_ExTU3
//函数作用:外扩timer3及uart3模块初始化
//入口参数:无
//出口参数:无
//
//=======================================================
void Init_ExTU3(void)
{
// timer mode control
TMOD3 = ExT3M;
TL30 = ExT3TL;
TH30 = ExT3TH;
#ifdef ExT3_4CLK
// T0M = 1 -> t0clk = system.clk/4
TCON3 |= BIT4;
#endif
// TR0 = 1; <TCON2.0>
TCON3 |= 0x01;
// 以下为串口设置
SCON3 = ExU3M; // 波特率方式1
#ifdef ExU3_SMOD1
TCON3 |= BIT7; // SET SMOD,波特率加倍
#endif
TL31 = ExU3TL;
TH31 = ExU3TH; //
// TL31 = 0xe3;
// TH31 = 0xe3; //
// T1M = 1;
TCON3 |= BIT5;
// 打开定时器1
TCON3 |= BIT1;
}
//=======================================================
//函数名:Init_ExTU4
//函数作用:外扩timer4及uart4模块初始化
//入口参数:无
//出口参数:无
//
//=======================================================
void Init_ExTU4(void)
{
// timer mode control
TMOD4 = ExT4M;
TL40 = ExT4TL;
TH40 = ExT4TH;
#ifdef ExT4_4CLK
// T0M = 1 -> t0clk = system.clk/4
TCON4 |= BIT4;
#endif
// TR0 = 1; <TCON2.0>
TCON4 |= 0x01;
// 以下为串口设置
SCON4 = ExU4M; // 波特率方式1
#ifdef ExU4_SMOD1
TCON4 |= BIT7; // SET SMOD,波特率加倍
#endif
TL41 = ExU4TL;
TH41 = ExU4TH; //
// T1M = 1;
TCON4 |= BIT5;
// 打开定时器1
TCON4 |= BIT1;
}
//=======================================================
//函数名:Init_ExTU5
//函数作用:外扩timer5及uart5模块初始化
//入口参数:无
//出口参数:无
//
//=======================================================
void Init_ExTU5(void)
{
// timer mode control
TMOD5 = ExT5M;
TL50 = ExT5TL;
TH50 = ExT5TH;
#ifdef ExT5_4CLK
// T0M = 1 -> t0clk = system.clk/4
TCON5 |= BIT4;
#endif
// TR0 = 1; <TCON2.0>
TCON5 |= 0x01;
// 以下为串口设置
SCON5 = ExU5M; // 波特率方式1
#ifdef ExU5_SMOD1
TCON5 |= BIT7; // SET SMOD,波特率加倍
#endif
TL51 = ExU5TL;
TH51 = ExU5TH; //
// T1M = 1;
TCON5 |= BIT5;
// 打开定时器1
TCON5 |= BIT1;
}
/* 初始化Timer0 */
void Init_Timer0(void)
{
TMOD = 0x01; // 工作在模式1
CKCON|=0x01; // clk/4
TL0 = 0xff; //10ms
TH0 = 0xdf;
TR0 = 1; // 开定时器0
ET0 = 1; // enable timer0 interrupt
}
void Init_Timer1(void)
{
//
}
void Init_Uart1(void)
{
TMOD = 0x21; // 定时器1方式2
SCON1 = 0xd0; // 波特率方式3
EICON = 0x80; // set smod
TH1 = 0xc7; //
TL1 = 0xc7; // 波特率设置
TR1 = 1; // 开定时器1
}
//=======================================================
//函数名:Init_Timer2
//函数作用:内核Timer2的初始化
//入口参数:无
//出口参数:无
//
//=======================================================
void Init_Timer2(void)
{
RCAP2L = 0x00; // reload data low byte
RCAP2H = 0x50; // reload data high byte
TL2 = 0x00;
TH2 = 0x00;
CP_RL2 = 0; // reload mode
TR2 = 1; // start timer2
}
//=======================================================
//函数名:Init_RTC
//函数作用:RTC模块初始化
//入口参数:无
//出口参数:无
//
//=======================================================
void Init_RTC(void)
{
#ifdef RESET_RTC_MODE
/* 复位RTC操作 */
RTC_PEN = 0x96; //password 1
RTCPWD = 0x57; //password 2
#endif
/* RTC允许写 */
RTC_PEN = 0x96; //password 1
RTCPWD = 0xd7; //password 2
/* 写RTC修正寄存器 */
RTCLC = DPXZ; // 低频修正
RTCHCH = GPXZH; // 高频修正高位
RTCHCL = GPXZL; // 高频修正低位
/* RTC时钟初始化 */
RTCSFTO = TSource; // T-souce选择
/* 休眠唤醒间隔时间初始化 */
INT_RTC = SleepTime;
#ifdef INIT_RTCTIME_MODE
/* 写RTC时间 */
RTCYC = YEAR;
RTCMoC = MONTH;
RTCDC = DATE;
RTCHC = HOUR;
RTCMiC = MINUTE;
RTCSC = SECOND;
RTCWC = WEEK;
#endif
/* RTC禁止写 */
RTC_PEN = 0x96; //
RTCPWD = 0xd6;
}
//=======================================================
//函数名:Init_LCD
//函数作用:LCD模块初始化
//入口参数:无
//出口参数:无
//
//=======================================================
void Init_LCD(void)
{
Ctrl_LCD = LCDON+DRVLCD+FLCD;
}
//=======================================================
//函数名:Fet_Dog
//函数作用:喂狗操作
//入口参数:无
//出口参数:无
//
//=======================================================
void Fet_Dog(void)
{
WDT_EN = 0xa5;
WDT_CLR = 0x5a;
}
//=======================================================
//函数名:Set_PLL
//函数作用:打开PLL,并将系统时钟切换至PLL
//入口参数:无
//出口参数:无
//
//=======================================================
void Set_PLL(void)
{
unsigned char xdata *point;
// 开PLL
point = 0x2894;
*point = 0x3f;
point = 0x2897;
*point = 0x8a;
point = 0x2898;
*point = 0x01;
// 写密码
point = 0x28d4;
*(point++) = 0xd2;
*(point++) = 0x09;
// 切换时钟
point = 0x28d0;
*point = 0x01;
}
//=======================================================
//函数名:Sys_Monitor
//函数作用:系统自检
//入口参数:无
//出口参数:无
//备注:目前实现的功能是在系统有电时时钟全部切换到PLL
//=======================================================
void Sys_Monitor(void)
{
if(Systate & BIT0)
{
Set_PLL();
ALTER_PLL_RTC();
}
}
//====================================================
//函数名:page_erase
//函数作用 页擦除flash
//备注:擦除操作需要20ms,此时程序处于休眠状态,其他中断必须关闭,只开启擦写flash中断
//=====================================================
void page_erase ( unsigned int page)
{
unsigned char xdata *p;
SPC_FUN =0x01;
p = 0x0555;
*p = 0xaa;
p = 0x02aa;
*p = 0x55;
p = 0x0555;
*p = 0x80;
p = 0x0555;
*p = 0xaa;
p = 0x02aa;
*p = 0x55;
p = page;
*p = 0x30;
SPC_FUN = 0x00;
PCON = 0x01;
}
//====================================================
//函数名:iap_wr_byte
//函数作用:写一个字节到flash
//备注:写一个字节需要20us
//=====================================================
void iap_wr_byte( unsigned int addr, unsigned char dat)
{
unsigned char xdata *p;
SPC_FUN = 0x01;
p = 0x0555;
*p = 0xaa;
p = 0x02aa;
*p = 0x55;
p = 0x0555;
*p = 0xa0;
p = addr;
*p = dat;
SPC_FUN = 0x00;
PCON = 0x01;
}
//====================================================
//函数名:Read_flash
//函数作用:从flash读取一个字节数据
//备注
//=====================================================
unsigned char Read_flash( unsigned int addr )
{ unsigned char code *p;
unsigned char idata cdata;
p=addr;
cdata = *p;
return cdata;
}
//====================================================
//函数名:ready_wrflash
//函数作用:flash擦写前准备,主要关闭其他中断
//备注
//====================================================
void ready_wrflash(void)
{ IE = 0x00;
EIE = 0x01; //中断向量8打开
ExInt2IE = 0x40; //开FLASH擦写中断
ExInt3IE = 0x00;
ExInt4IE = 0x00;
EA=1; //总中断打开
}
//====================================================
//函数名:wrnum_flash
//函数作用:写4个字节一下到flash
//备注:根据需要可以改动写缓冲的大小
//====================================================
void wrnum_flash(unsigned char num,unsigned int addr)
{
unsigned char idata i;
SPC_FUN = 0x01;
//if(F_comppereas!=0)
// F_comppereas=0;
ready_wrflash();
if(num<=4)
{ for(i=0;i<num;i++)
{ iap_wr_byte(addr,wr_buff[i]);
addr++;
}
}
SPC_FUN = 0x00;
}
//====================================================
//函数名:rdnum_flash
//函数作用:从flash读4个字节
//备注:根据需要可以改动写缓冲的大小
//====================================================
void rdnum_flash(unsigned char num,unsigned int addr)
{unsigned char idata i;
if(num<=4)
{for(i=0;i<num;i++)
{wr_buff[i]=Read_flash(addr);
addr++;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?