/************************************************************
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字库的二进制文件,发送过程中有提示写入百分比进度的,写完之后会显示总共用时的