⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osupdata.c

📁 LPC2200 使用定时器1匹配式蜂鸣器发声实验
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -