?? loader.c
字號:
#include "ioregs.h"
#include "net.h"
#include "flash.h"
unsigned long address; //32位地址
unsigned long data; //32位數據
unsigned long length; //32位長度
void init_uart(void) //串口1初始化 @ 115200bps
{
IO_UBRLCR1 = (IO_UBRLCR1 & ~BRDIV) | BR_115200;
IO_UBRLCR1 = IO_UBRLCR1 | FIFOEN;
IO_UBRLCR1 = (IO_UBRLCR1 & ~WRDLEN) | (3<<WRDLEN_SHIFT);
IO_SYSCON1 |= UART1EN;
}
unsigned char get_char(void) //串口1接收
{
while (IO_SYSFLG1 & URXFE1);
return IO_UARTDR1 & 0xff;
}
void put_char(unsigned char data) //串口1發送
{
while (IO_SYSFLG1 & UTXFF1);
IO_UARTDR1 = data;
}
void put_string(char *sp) //串口1字符串發送
{
unsigned int i=0;
while(sp[i]!=0)
put_char(sp[i++]);
}
unsigned int wait(unsigned char i) //延時函數
{
unsigned int sum=0;
for(;i>0;i--)
sum+=i;
return(sum);
}
void flash_erase() //FLASH擦除
{
SYSC_(0x70005555)=0xaa; //寫入擦除命令
wait(1); //延時
SYSC_(0x70002aaa)=0x55; //寫入擦除命令
wait(1); //延時
SYSC_(0x70005555)=0x80; //寫入擦除命令
wait(1); //延時
SYSC_(0x70005555)=0xaa; //寫入擦除命令
wait(1); //延時
SYSC_(0x70002aaa)=0x55; //寫入擦除命令
wait(1); //延時
SYSC_(0x70005555)=0x10; //寫入擦除命令
wait(1); //延時
while((SYSC_(0x70000000)& 0x80)==0); //確認已擦除
}
void flash_prog(unsigned long address,unsigned char data) //FLASH字節編程
{
SYSC_(0x70005555)=0xaa; //寫入編程命令
wait(1); //延時
SYSC_(0x70002aaa)=0x55; //寫入編程命令
wait(1); //延時
SYSC_(0x70005555)=0xa0; //寫入編程命令
wait(1); //延時
SYSC_(address)=data; //寫入編程數據
while(SYSC_(address)!=data); //確認字節已寫入
}
void writein() //塊數據獲取
{
unsigned long i,data;
put_string("Len:\n"); //發送“請輸入長度數據”的提示
length=get_char();
length=(length<<8)+get_char();
length=(length<<8)+get_char();
length=(length<<8)+get_char(); //獲取32位長度數據
for(i=0;i<length;i+=4)
{
data=get_char();
data+=get_char()<<8;
data+=get_char()<<16;
data+=get_char()<<24; //獲取32位數據
SDRAM_(i)=data; //SDRAM賦值
}
put_string("Ok!\n"); //發送塊數據讀取完畢標志
}
void flashload() //塊數據FLASH編程
{
unsigned long i;
writein(); //編程數據先讀入SDRAM
flash_erase(); //FLASH擦除
for(i=0;i<length;i+=4)
{
data=SDRAM_(i);
flash_prog((0x70000000+i),data & 0xff); //FLASH字節編程
flash_prog((0x70000001+i),(data>>8) & 0xff); //FLASH字節編程
flash_prog((0x70000002+i),(data>>16) & 0xff); //FLASH字節編程
flash_prog((0x70000003+i),(data>>24) & 0xff); //FLASH字節編程
}
put_string("Done!\n"); //發送FLASH編程成功標志
}
void mymain(void) //串口調試函數
{
unsigned char scomm,sdata;
unsigned char *addrp;
unsigned char *datap;
addrp=(unsigned char*)&address;
datap=(unsigned char*)&data;
put_string("ok!\n"); //發送串口調試啟動標志
while (1) //主循環
{
scomm=get_char(); //讀串口
if(scomm==0xff) //是否為命令前導字節“0xFF”?
{
scomm=get_char(); //讀調試命令字節
if(scomm!=0xff)
switch(scomm) //根據調試命令散轉
{
case 0xfa:flashload();break; //執行FLASH編程操作
default:put_string("Not Support!\n"); //不支持的命令
}
else sdata=0xff; //數據“0xFF”賦值
}
else sdata=scomm; //非“0xFF”數據直接賦值
}
}
void C_vMain(void) //主程序
{
unsigned char i;
unsigned short j;
init_uart(); //串口1初始化
while(1)
{
i=get_char(); //讀串口
if(i==0x79) //是否讀取到調試開始命令?
mymain(); //進入串口調試
else put_char(i); //測試串口
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -