UART烧写FLASH

/************************************************************
  Copyright (C), 20XX-20XX, SZREC Tech. Co., Ltd.
  FileName: LedArray.c
  Author:        Version :          Date:
  Description:     // 接收并存储来自通讯设备下发的串口信息,根据相应的信息设置相应的标志位,
                        并将这些数据送入点阵屏显示模块进行处理  
  Version:         // 1.0
  Function List:   // 主要函数及其功能
    1. -------
  History:         // 历史修改记录
      <author>  <time>   <version >   <desc>
      David    1/22/14     1.0       
***********************************************************/
#include "uart.h"
#include "string.h"
#include "flash.h" 
#include <stdio.h>
#include "main.h"
unsigned char UartBuf[256]={0};//串口数据缓存数组
unsigned char CopyBuf[256]={0};
//unsigned char code DownLoad_Complete[]={"SPI Flash DownLoad CompLete"};
unsigned char UartWaitTime=0,UartStart=FALSE,UartComp=FALSE;
unsigned int UartCount=0;
unsigned int FlashAddrCount=5152;
unsigned long Count=1;
bit FullFlag=0;
bit CountFlag=0;
bit PerFlag=0;
unsigned long Capacity;
unsigned int  Sector;
unsigned int Per=0;
unsigned char Temp1[5];
void Receive_Process();
/********************************************************************/
/*  函数名称:void Uart_Send_Byte(unsigned char SendData)*/                              
/*  函数功能:串口发送一字节数据*/
/*  输入参数:SenData:要发送的数据*/
/*  输出参数:*/
/*  全局变量:*/
/*  返 回 值:*/
/*  调用前提:*/
/*  副 作 用:*/
/*  修改记录:*/
/*  说    明:*/
/********************************************************************/
void Uart_Send_Byte(unsigned char SendData)
{
 ES=0;
 TI=0;
 SBUF=SendData;
 while(TI==0);
 TI=0;
 ES=1;
}
/********************************************************************/
/*  函数名称:void Uart_Send_Bytes(unsigned char *Buf,unsigned char Len)*/                              
/*  函数功能:串口发送多字节数据*/
/*  输入参数:Buf:指向发送数据的指针,Len:发送的数据长度*/
/*  输出参数:*/
/*  全局变量:*/
/*  返 回 值:*/
/*  调用前提:*/
/*  副 作 用:*/
/*  修改记录:*/
/*  说    明:*/
/********************************************************************/
void Uart_Send_Bytes(unsigned char *Buf)
{
 while(*Buf!='\0')
 {
     Uart_Send_Byte(*Buf++);
 }
}
//void uart_over()
//{
//  UartCount = 0;
//  UartComp = FALSE;
//}
///********************************************************************/
///*  函数名称:void uart_interrput_receive() interrupt 4*/                              
///*  函数功能:串口接收函数(中断接收),接收完成之后进入串口数据处理*/
///*  输入参数:*/
///*  输出参数:UartBuf[]:串口数据缓存*/
///*  全局变量:UartBuf[]*/
///*  返 回 值:*/
///*  调用前提:有串口中断产生*/
///*  副 作 用:*/
///*  修改记录:*/
///*  说    明:*/
///********************************************************************/
void uart_interrput_receive() interrupt 4
{
 unsigned char ReByte;
 unsigned int i;
 unsigned char n=0;
 unsigned char Temp[60];
 //unsigned char Temp1[5];

 PDownConfig UartDownConfig;
      RI=0;
      ReByte=SBUF;
    UartBuf[UartCount]=ReByte;
      if(ConfigFlag)
        {
            if(UartCount>=5)//首先接收配置参数
            {
                ConfigFlag=0;
              UartCount=0;
                RevFlag=1;
                UartDownConfig=(PDownConfig)UartBuf;
                Capacity=UartDownConfig->Capacity;
                Sector=UartDownConfig->Sector*16;
                sprintf(Temp,"The total capacity is %6ld,The starting Sector is %4d \n\n",Capacity,Sector/16);
                Uart_Send_Bytes(Temp);

            }
            else UartCount++;
    }
         else if(RevFlag)
        {
        CountFlag=1;
     // Uart_Send_Byte(UartCount);
       if((UartCount>=255)&&(Count<=Capacity-Capacity%256))
         {
             UartCount = 0;
             UartComp=TRUE;
             for(i=0;i<=255;i++)
        {
            CopyBuf[i]=UartBuf[i];
      }
        // Uart_Send_Byte(UartBuf[0]);
            //FlashAddrCount+=2;//一次写俩页

     }
         else if((UartCount>=Capacity%256-1)&&(Count>Capacity-Capacity%256))
         {
              Uart_Send_Bytes("SPI Flash DownLoad CompLete \n \n");
                Count=0;
                FullFlag=1;
                UartCount=0;
                UartComp=TRUE;

//              for(i=128;i<=255;i++)
//              CopyBuf[i]=0;
                  for(n=0;n<=127;n++)
               {
                   CopyBuf[n]=UartBuf[n];
                    //Uart_Send_Byte(UartCount);
               }
     }
         else
         {
           UartCount++;

         }
        if(Count-1==(Capacity/100)*Per)
        {
          PerFlag=1;
            //Uart_Send_Bytes("\n");

                        Per++;

    }
//      if(Count-1==0)
//              Uart_Send_Bytes("Has been completed:\n0%\n");
    Count++;

     }

 }


// 
//  /********************************************************************/
///*  函数名称:void Receive_Process()*/                              
///*  函数功能:串口数据处理*/
///*  输入参数:*/
///*  输出参数:
///*  全局变量:*/
///*  返 回 值:*/
///*  调用前提:必须等串口数据接收完毕*/
///*  副 作 用:*/
///*  修改记录:*/
///*  说    明:每次写入256个字节及一页内容,最后在写入剩余不足一页的内容*/
///********************************************************************/
// 
void Receive_Process()
{
 if(UartComp==TRUE)
 {
     UartComp=0;
     if(!FullFlag)
     {
     SPI_Flash_Write_Page(&CopyBuf[0],(unsigned long)(Sector++)*256,256);
     }
     else
     {
        //FullFlag=0;
      SPI_Flash_Write_Page(&CopyBuf[0],(unsigned long)(Sector++)*256,Capacity%256);//最后写不足一页的
     }
     if(PerFlag==1)//每写完1%输出下,不能输出太多内容以免和串口中断冲突
        {
            PerFlag=0;
            Temp1[0]=Per/100+0x30;
            Temp1[1]=Per/10+0x30;
            Temp1[2]=Per%10+0x30;
            Temp1[3]='%';
            Temp1[4]='\0';
            if(Temp1[0]==0X30)Temp1[0]=' ';
            if(Temp1[1]==0X30)Temp1[1]=' ';
            if(Per<=99)
            Uart_Send_Bytes(Temp1);

            Uart_Send_Byte('\n');

    }
 }
}
/********************************************************************/
/*  函数名称:void uart_init()*/                              
/*  函数功能:串口初始化,频率22.1184M波特率19200*/
/*  输入参数:*/
/*  输出参数:*/
/*  全局变量:*/
/*  返 回 值:*/
/*  调用前提:*/
/*  副 作 用:*/
/*  修改记录:*/
/*  说    明:*/
/********************************************************************/
void uart_init()
{
  SCON=0x50;
 AUXR|=0x40;
 AUXR &= 0xFE;
 TMOD&=0x0f;
 TL1=(65535-(FOSC/4/BAUD));
 TH1=(65535-(FOSC/4/BAUD))>>8;
 TR1=1;
 ET1 = 0;
 ES=1;

}
/********************************************************************/
/*  函数名称:void init_timer0()*/                              
/*  函数功能:定时器0初始化*/
/*  输入参数:*/
/*  输出参数:*/
/*  全局变量:*/
/*  返 回 值:*/
/*  调用前提:*/
/*  副 作 用:*/
/*  修改记录:*/
/*  说    明:*/
/********************************************************************/
//void init_timer0()
//{
// TMOD|=0x01;
// 
// TH0=(65535-20000)/256;
// TH1=(65535-20000)%256;
// ET0=1;
// TR0=1;
//  
// 
//  
//}
/********************************************************************/
/*  函数名称:void init_timer2(void)*/                              
/*  函数功能:定时器2初始化25毫秒*/
/*  输入参数:*/
/*  输出参数:*/
/*  全局变量:*/
/*  返 回 值:*/
/*  调用前提:*/
/*  副 作 用:*/
/*  修改记录:*/
/*  说    明:*/
/********************************************************************/
void init_timer2(void)      //25毫秒@22.1184MHz
{
       //AUXR |= 0x04;                   //定时器2为1T模式
     AUXR &= ~0x04;                  //定时器2为12T模式
     T2L = T1MS%256;        //设置定时初值
       T2H = T1MS/256;
    AUXR |= 0x10;                   //定时器2开始计时

    IE2 |= 0x04;                    //开定时器2中断
}
/********************************************************************/
/*  函数名称:void time2() interrupt 12*/                              
/*  函数功能:定时器2中断,计时下载字库时间*/
/*  输入参数:*/
/*  输出参数:
/*  全局变量:Count:中断计时*/
/*  返 回 值:*/
/*  调用前提:*/
/*  副 作 用:*/
/*  修改记录:*/
/*  说    明:*/
/********************************************************************/
void time2() interrupt 12
{
    static unsigned char Minute=0,Second=0,MS=0;
    unsigned char Time[20];
  if(CountFlag)
    {
        //Uart_Send_Bytes("Using Time:",11);
        //Uart_Send_Byte(Minute);
        if((MS++)>=40)
        {
            MS=0;
            if((Second++)>=60)
            {
                Second=0;
                Minute++;
      }
    }
  }
    if(FullFlag)
    {
        FullFlag=0;
        CountFlag=0;
        sprintf(Time,"%2d Minute %2d Second",(int)Minute,(int)Second);
        Uart_Send_Bytes("Using Time:");
        Uart_Send_Bytes(Time);
        Minute=0;
        Second=0;
        MS=0;
        //Uart_Send_Bytes(Minute)

  }

}
/********************************************************************/
/*  函数名称:void time0() interrupt 1*/                              
/*  函数功能:定时器0中断,判断串口是否接收超时*/
/*  输入参数:*/
/*  输出参数:UartWaitTime:串口接收计时,UartStart:串口是否开始接受数据标志*/
/*  全局变量:*/
/*  返 回 值:*/
/*  调用前提:*/
/*  副 作 用:*/
/*  修改记录:*/
/*  说    明:*/
/********************************************************************/
//void time0() interrupt 1
//{
// TH0=(65535-20000)/256;
// TL0=(65535-20000)%256;
//  //Uart_Send_Byte(DispStayFlag);
// if(((UartWaitTime++)>=4)&&(UartStart==TRUE))
// {
//   UartWaitTime=0;
//   uart_over();
// }
// 
//}

前段时间买的一个开发板,有个例程是将SD卡里的GBK点阵字库写入SPI FLASH中的,速度很快,半分钟就能搞定,字库文件766080字节的,但是我正好有个项目需要用到[size=14.3999996185303px]GBK点阵字库又没SD接口,研究了下用串口发送的形式,38400的波特率,3分12秒写完

[size=14.3999996185303px]烧写SPI FLASH步骤如下
1首先烧写玩程序之后需要等待几十秒擦除完整片FLASH

2发送烧写配置,主要是发送文件总字节数(4字节)和写入的起始扇区(2字节)16进制的,如00 0B B0 80 01 42,就是文件总大小766080,从322扇区开始写起
3发送GBK字库的二进制文件,发送过程中有提示写入百分比进度的,写完之后会显示总共用时的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值