📄 lowlevel.c
字号:
}
/******************************************************************************
* 函数原型: int UART0GetRx(void *buf, int len); *
* 功能: 将UART0接收缓冲区的前len个字节放到buf中 *
* 说明: 返回值为放置到buf中的字节数 *
******************************************************************************/
int UART0GetRx (void *buf, int len)
{
int i;
// DisableInterrupts;
for(i = 0; i < len; i++)
{
if(cUART0RxHead == cUART0RxEnd)
break;
((char *)buf)[i] = cUART0RxBuf[cUART0RxHead];
cUART0RxHead ++;
if(cUART0RxHead >= CMUART0RxBufLenMax)
cUART0RxHead = 0;
}
// EnableInterrupts;
return i;
}
/******************************************************************************
* 函数原型: void UART0Echo(void); *
* 功能: 将接收到的数据通过UART0口发回 *
* 说明: 1次最多接收60个字节 *
******************************************************************************/
void UART0Echo (void)
{
int n;
char buf[64];
n = UART0GetRx(buf,60);
if(n == 0)
return;
UART0Send(buf,n);
}
/******************************************************************************
* 函数原型: void UART1Send(void *buf, int len); *
* 功能: 将buf中的头len个字节放到UART1的发送缓冲区中 *
* 说明: buf为要发送的数组,len为要发送的字节数 *
******************************************************************************/
void UART1Send (void *buf, int len)
{
int i;
if(len < 1)
return;
// DisableInterrupts;
for(i = 0; i < len; i++)
{
cUART1TxBuf[cUART1TxEnd] = ((char *)buf)[i];
cUART1TxEnd ++;
if(cUART1TxEnd >= CMUART1TxBufLenMax)
cUART1TxEnd = 0;
if(cUART1TxEnd == cUART1TxHead)
cUART1TxHead ++;
if(cUART1TxHead >= CMUART1TxBufLenMax)
cUART1TxHead = 0;
}
SCI1CR2_SCTIE = 1; // 使能发送数据寄存器空中断
// EnableInterrupts;
}
/******************************************************************************
* 函数原型: int UART1GetRx(void *buf, int len); *
* 功能: 将UART1接收缓冲区的前len个字节放到buf中 *
* 说明: 返回值为放置到buf中的字节数 *
******************************************************************************/
int UART1GetRx (void *buf, int len)
{
int i;
// DisableInterrupts;
for(i = 0; i < len; i++)
{
if(cUART1RxHead == cUART1RxEnd)
break;
((char *)buf)[i] = cUART1RxBuf[cUART1RxHead];
cUART1RxHead ++;
if(cUART1RxHead >= CMUART1RxBufLenMax)
cUART1RxHead = 0;
}
// EnableInterrupts;
return i;
}
/******************************************************************************
* 函数原型: void UART1Echo(void); *
* 功能: 将接收到的数据通过UART1口发回 *
* 说明: 1次最多接收60个字节 *
******************************************************************************/
void UART1Echo (void)
{
int n;
char buf[64];
n = UART1GetRx(buf,60);
if(n == 0)
return;
UART1Send(buf,n);
}
/******************************************************************************
* 函数原型: void UART2Send(void *buf, int len); *
* 功能: 将buf中的头len个字节放到UART2的发送缓冲区中 *
* 说明: buf为要发送的数组,len为要发送的字节数 *
******************************************************************************/
void UART2Send (void *buf, int len)
{
int i;
if(len < 1)
return;
for(i = 0; i < len; i++)
{
cUART2TxBuf[cUART2TxEnd] = ((char *)buf)[i];
cUART2TxEnd ++;
if(cUART2TxEnd >= CMUART2TxBufLenMax)
cUART2TxEnd = 0;
if(cUART2TxEnd == cUART2TxHead)
cUART2TxHead ++;
if(cUART2TxHead >= CMUART2TxBufLenMax)
cUART2TxHead = 0;
}
}
/******************************************************************************
* 函数原型: int UART2GetRx(void *buf, int len); *
* 功能: 将UART2接收缓冲区的前len个字节放到buf中 *
* 说明: 返回值为放置到buf中的字节数 *
******************************************************************************/
int UART2GetRx (void *buf, int len)
{
int i;
for(i = 0; i < len; i++)
{
if(cUART2RxHead == cUART2RxEnd)
break;
((char *)buf)[i] = cUART2RxBuf[cUART2RxHead];
cUART2RxHead ++;
if(cUART2RxHead >= CMUART2RxBufLenMax)
cUART2RxHead = 0;
}
return i;
}
/******************************************************************************
* 函数原型: void UART2Echo(void); *
* 功能: 将接收到的数据通过UART2口发回 *
* 说明: 1次最多接收15个字节 *
******************************************************************************/
void UART2Echo (void)
{
int n;
char buf[16];
n = UART2GetRx(buf,15);
if(n == 0)
return;
UART2Send(buf,n);
}
/******************************************************************************
* 函数原型: void InitEEPROM(void); *
* 功能: EEPROM相关寄存器的初始化 *
* 说明: 无 *
******************************************************************************/
void InitEEPROM (void)
{
// 0 1 001100
ECLKDIV = 0x4C; // 1.osc时钟经过8分频进入EEPROM分频器
// 2.EEPROM的输入时钟约为189Hz
INITEE = (EEPROMAddrStart >> 8) | 0x01; // 注意这里的设定方法(S12CoreUserGuide)
MISC |= 0x01; // 使能EEPROM
ECNFG = 0x00; // EEPROM配置寄存器
}
/******************************************************************************
* 函数原型: char EEPROMReadyCheck(void); *
* 功能: 检查对EEPROM的操作是否准备就绪 *
* 说明: 准备就绪,返回0;未准备就绪,返回-1 *
******************************************************************************/
char EEPROMReadyCheck (void)
{
if(!ECLKDIV_EDIVLD) // ECLKDIV寄存器已经被设置
return -1;
if(ESTAT_ACCERR) // 非法进入选定的EEPROM序列
return -1;
if(ESTAT_PVIOL) // 试图编程或擦除1个受保护的EEPROM存储区
// 域地址
return -1;
return 0;
}
/******************************************************************************
* 函数原型: void EEPROMWaitForCmdEmpty(void); *
* 功能: 等待"可以进行下一次操作"的状态 *
* 说明: 无 *
******************************************************************************/
void EEPROMWaitForCmdEmpty (void)
{
while(!ESTAT_CBEIF); // 等待进入"接收新命令"的状态
}
/******************************************************************************
* 函数原型: void EEPROMWaitForCmdComplete(void); *
* 功能: 等待所有命令执行完毕 *
* 说明: 无 *
******************************************************************************/
void EEPROMWaitForCmdComplete (void)
{
ESTAT_CBEIF = 1; // "等待接收新命令"标志清0
while(!ESTAT_CCIF); // 等待所有命令执行完毕
}
/******************************************************************************
* 函数原型: void EEPROMEraseSectData(void *addr, int data); *
* 功能: EEPROM扇区擦除具体步骤 *
* 说明: 扇区擦除的具体步骤须严格遵守(详见EETS2K Block User Guide V01.03 P28) *
******************************************************************************/
void EEPROMEraseSectData (void *addr, int data)
{
EEPROMWaitForCmdEmpty();
*(int *)((int)addr & 0xFFFC) = data; // 扇区擦除时忽略地址的低2位
ECMD = EEPROMCmdEraseSect; // 发出扇区擦除命令
EEPROMWaitForCmdComplete();
}
/******************************************************************************
* 函数原型: void EEPROMEraseSect(void *addr); *
* 功能: EEPROM扇区擦除 *
* 说明: 扇区擦除时,数据字节的值无关紧要,这里使用0xFFFF *
******************************************************************************/
void EEPROMEraseSect (void *addr)
{
EEPROMEraseSectData(addr,0xFFFF);
}
/******************************************************************************
* 函数原型: long EEPROMRead4BAligned(void *addr); *
* 功能: 从指定的地址读取1个长字 *
* 说明: 无 *
******************************************************************************/
long EEPROMRead4BAligned (void *addr)
{
return *(long *)((int)addr & 0xFFFC);
}
/******************************************************************************
* 函数原型: void EEPROMWrite4BAligned(void *addr, long data); *
* 功能: 向指定的地址写入1个长字 *
* 说明: 无 *
******************************************************************************/
void EEPROMWrite4BAligned (void *addr, long data)
{
EEPROMDataUnion sav;
sav.longint = data;
((int *)((int)addr & 0xFFFC))[0] = sav.shortint[0];
ECMD = EEPROMCmdProgram;
EEPROMWaitForCmdComplete();
((int *)((int)addr & 0xFFFC))[1] = sav.shortint[1];
ECMD = EEPROMCmdProgram;
EEPROMWaitForCmdComplete();
}
/******************************************************************************
* 函数原型: void EEPROMEraseWrite4BAligned(void *addr, long data); *
* 功能: 擦除指定地址的扇区并向其中写入1个长字 *
* 说明: 无 *
******************************************************************************/
void EEPROMEraseWrite4BAligned (void *addr, long data)
{
EEPROMEraseSect(addr);
EEPROMWrite4BAligned(addr,data);
}
/******************************************************************************
* 函数原型: int EEPROMRead2BAligned(void *addr); *
* 功能: 从EEPROM指定地址中读取1个字 *
* 说明: 无 *
******************************************************************************/
int EEPROMRead2BAligned (void *addr)
{
return *(int *)((int)addr & 0xFFFE);
}
/******************************************************************************
* 函数原型: void EEPROMWrite2BAligned(void *addr, int data); *
* 功能: 向EEPROM的指定地址写入1个字 *
* 说明: 无 *
******************************************************************************/
void EEPROMWrite2BAligned (void *addr, int data)
{
*(int *)((int)addr & 0xFFFE) = data;
ECMD = EEPROMCmdProgram;
EEPROMWaitForCmdComplete();
}
/******************************************************************************
* 函数原型: void EEPROMEraseWrite2BAligned(void *addr, int data); *
* 功能: 向指定的地址写入1个字 *
* 说明: 注意本函数的实现方法 *
******************************************************************************/
void EEPROMEraseWrite2BAligned (void *addr, int data)
{
EEPROMDataUnion sav;
sav.longint = EEPROMRead4BAligned(addr);
EEPROMEraseSect(addr);
sav.shortint[((int)addr >> 1) & 0x0001] = data;
EEPROMWrite4BAligned(addr,sav.longint);
}
/******************************************************************************
* 函数原型: void EEPROMEraseWrite1B(void *addr, char data); *
* 功能: 向指定的地址写入1个字节 *
* 说明: 注意本函数的实现方法 *
******************************************************************************/
void EEPROMEraseWrite1B (void *addr, char data)
{
EEPROMDataUnion sav;
sav.longint = EEPROMRead4BAligned(addr);
sav.byte[(int)addr & 0x0003] = data;
EEPROMEraseWrite4BAligned(addr,sav.longint);
}
/******************************************************************************
* 函数原型: void __memmovebufforlittle(void *p, int m, int len); *
* 功能: 数据块移动形式1 *
* 说明: 注意本函数与下一个函数的比较 *
******************************************************************************/
void __memmovebufforlittle (void *p, int m, int len)
{
int i;
for(i = 0; i < len; i++)
((char *)p)[i] = ((char *)p)[i+m];
}
/******************************************************************************
* 函数原型: void __memmovebufforlarge(void *p, int m, int len); *
* 功能: 数据块移动形式2 *
* 说明: 注意本函数与上一函数的比较 *
******************************************************************************/
void __memmovebufforlarge (void *p, int m, int len)
{
int i;
for(i = len-1; i >= 0; i--)
((char *)p)[i+m] = ((char *)p)[i];
}
/******************************************************************************
* 函数原型: void __memmovebuf(void *p, int m, int len); *
* 功能: 数据快移动 *
* 说明: 无 *
******************************************************************************/
void __memmovebuf (void *p, int m, int len)
{
if(m > 0)
__memmovebufforlittle(p,m,len);
if(m < 0)
__memmovebufforlarge(p,-m,len);
}
/******************************************************************************
* 函数原型: void InitLowLevel(void); *
* 功能: 单片机底层操作的初始化 *
* 说明: 无 *
******************************************************************************/
void InitLowLevel (void)
{
DisableInterrupts;
InitTim();
InitRealTime();
InitPortInOut();
InitUART0();
InitUART1();
InitATD();
InitSoftUART2();
InitEEPROM();
EnableInterrupts;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -