📄 osupdata.c
字号:
#include "osupdata.h"
uint16 RxMark;
uint16 RxSerial;
uint8 RxType;
uint8 RxIdSerial;
uint16 RxLen;
uint32 RxCRC;
uint32 CntCRC;
uint16 PackLength; //读取的包长
uint16 BytesCount; //未读取的字节数
uint8 RxLoMark;
uint8 RxHiMark;
uint8 RxLoSerial;
uint8 RxHiSerial;
uint8 RxLoLen;
uint8 RxHiLen;
uint8 RxStatus;
uint32 WriAddr; //当前nor flash写到的地址
volatile uint16 PackLen;
uint8 Buffer[1024];
uint8 WorkArea[512];
#define BaudRate 115200
#define FLASH_ADDR 0x80000000
#define FLASH_BOOT_ADDR (32768>>1) //BOOTLOADER 所占空间科学十进制表示须右移一位 32768:32K
#define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr<<1))
/************************************************************************
** 函数名称:UartExfDataInit()
** 函数功能: 串口通信变量初始化
**
**
***************************************************************************/
int Osup(void)
{
uint8 CodeReq;
UART0_Init();
UartExfDataInit();
while(1)
{
/*请求类型*/
CodeReq = GetCltReq();
if( CodeReq == 1)
{
if( UpdateOsVersion())
SendReqAck(82); //'R'
else
SendReqAck(69); //'E'
}
}
}
void UartExfDataInit()
{
RxMark = 0;
RxSerial = 0;
RxType = 0;
RxIdSerial = 0;
RxLen = 0;
RxCRC = 0;
CntCRC = 0; //计算包的CRC
PackLength=0;
BytesCount=0;
RxStatus = 0;
WriAddr = 0; //当前nor flash写的地址
}
/**********************************************************************
** 函数名称: IrqUart0
** 函数功能: UART0中断例程
**
** 输入:
** 输出:
**
** 调用模块:
**
************************************************************************/
void __irq IRQ_UART0(void)
{
switch(U0IIR & 0x0f)
{
case 0x06: //RLS中断
break;
case 0x04:
DealPack(); //RDA中断
break;
case 0x0C:
DealPack(); //CTI中断
break;
case 0x02: //THRE中断
break;
}
VICVectAddr=0x00;
}
uint8 UART0_Init(void)
{
uint16 Fdiv;
PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05;
U0LCR = 0x80;
//8位字符长度,1个停止位,无奇偶校验,使能访问锁存
U0LCR = 0x83;
Fdiv = (Fpclk / 16) / BaudRate; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
//禁止锁存访问
U0LCR = 0x03;
U0FCR = 0x81;
U0IER = 0x01;
VICIntSelect = 0x00000000;
VICVectCntl0 = 0x26;
VICVectAddr0 = (int)IRQ_UART0;
VICIntEnable = 0x00000040;
return(1);
}
/***************************************************************************
** 函数名称: DealPack
** 函数功能: 处理串口中的数据包
**
** 输入:
** 输出:
**
** 调用模块:
**
******************************************************************************/
void DealPack()
{
RxStatus = 0;
CntCRC = 0;
//根据接收状态来处理进行包的处理
do{
switch(RxStatus)
{
case 0:
PackHead();
break;
case 1:
PackData();
break;
case 2:
PackCRC();
break;
}
}while(RxStatus!=0);
}
/**********************************************************************
** 函数名称: PackHead
** 函数功能: 处理包头
**
** 输入:
** 输出:
**
** 调用模块:
**
************************************************************************/
void PackHead()
{
RxLoMark = U0RBR; //Mark:包标记
SumCRC(RxLoMark);
RxHiMark = U0RBR;
SumCRC(RxHiMark);
if( RxLoMark != 1 || RxHiMark != 1 )
{
RxStatus = 0;
SendReqAck(69); //'E'
return;
}
RxLoSerial = U0RBR; //RxSerial:接收序列号:0000
SumCRC(RxLoSerial);
RxHiSerial = U0RBR;
SumCRC(RxHiSerial);
RxType = U0RBR; //RxType:包类型
SumCRC(RxType);
if(RxType == 2)
{
RxStatus = 0;
SendReqAck(83);//'S'
return;
}
RxIdSerial = U0RBR; //RxIdSerial:包的序号
SumCRC(RxIdSerial);
RxLoLen = U0RBR; //RxLen:数据包长
SumCRC(RxLoLen);
RxHiLen = U0RBR;
SumCRC(RxHiLen);
RxLen = (uint16)(RxHiLen<<8) + RxLoLen;
RxStatus++;
if( RxLen == 0)
RxStatus++;
else
{
PackLength = RxLen; //包长
BytesCount = RxLen; //剩余包字节
}
}
/**********************************************************************
** 函数名称: PackData
** 函数功能: 处理包数据
**
** 输入:
** 输出:
**
** 调用模块:
**
************************************************************************/
void PackData()
{
uint16 i;
uint8 temp;
i=0;
while(BytesCount)
{
/*收取数据包*/
while( (U0LSR & 0x01) == 0);
temp = U0RBR;
WorkArea[i++] = temp;
SumCRC(temp);
BytesCount--;
}
if( BytesCount == 0)
RxStatus++;
}
/**********************************************************************
** 函数名称: PackCRC
** 函数功能: 处理校验和
**
** 输入:
** 输出:
**
** 调用模块:
**
************************************************************************/
void PackCRC()
{
/*判断CRC是否正确*/
uint8 temp[4];
while( (U0LSR & 0x01) == 0);
temp[0] = U0RBR;
while( (U0LSR & 0x01) == 0);
temp[1] = U0RBR;
while( (U0LSR & 0x01) == 0);
temp[2] = U0RBR;
while( (U0LSR & 0x01) == 0);
temp[3] = U0RBR;
RxCRC = (uint32)(temp[3]<<24) + (uint32)(temp[2]<<16) +(uint32)(temp[1]<<8) + (uint32)temp[0];
/*校验和错误则发错误回应*/
if( RxCRC != CntCRC)
SendReqAck(69); //'E'
RxStatus = 0;
}
/**********************************************************************
** 函数名称: SendReqAck
** 函数功能: 向PC端发送命令回复包
**
** 输入:
** 输出:ch ASCII码
**
** 调用模块:
**
************************************************************************/
void SendReqAck(uint8 ch)
{
uint8 TxAckPack = ch;
U0THR = TxAckPack;
while( (U0LSR & 0x40)==0);
}
/************************************************************************
** 函数名称:SumCRC
** 函数功能:计算检验和
**
**
***************************************************************************/
uint32 SumCRC(uint8 temp)
{
CntCRC += (uint32)temp;
return CntCRC;
}
/************************************************************************
** 函数名称:GetCltReq()
** 函数功能: 获得请求代码
**
**
**
**
***************************************************************************/
uint8 GetCltReq(void)
{
uint8 CodeReq;
//系统升级
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -