📄 flashburn.c
字号:
#include "flashburn.h"
#include "stdio.h"
typedef unsigned char BYTE;
void ResetFlash() //FLASH复位子程序
{BYTE *pa;
pa=(BYTE *)0x8000;
*pa=0x0F0;
}
void EraseFlash() //FLASH片擦除子程序
{
BYTE *pa;
pa=(BYTE *)0x8555;
*pa=0x0AA;
pa=(BYTE *)0x82AA;
*pa=0x055;
pa=(BYTE *)0x8555;
*pa=0x080;
pa=(BYTE *)0x8555;
*pa=0x0AA;
pa=(BYTE *)0x82AA;
*pa=0x055;
pa=(BYTE *)0x8555;
*pa=0x010;
delay_10s(); //延时10s
}
void WriteFlash(BYTE *pa,int pd)//写FLASH某个单元的子程序
{
BYTE *tmp;
tmp=(BYTE *) 0x8555;
*tmp=0x0AA;
tmp=(BYTE *)0x82AA;
*tmp=0x055;
tmp=(BYTE *)0x8555;
*tmp=0x0A0;
*pa=pd;
delay_200ms(); //延时200ms
}
//延时子程序可用简单的加法计数实现,例如延时10s的子程序示例如下:
delay_10s()
{
int i;
int j;
for(i=0;i<0x100;i++)
{
for(j=0;j<0x01000;j++);
}
}
void main()
{
BYTE *FlashPtr; //指向FLASH的指针
int FlashData; //写往FLASH的数据
int i;
BYTE *OriMem; //代码在片内RAM的源地址
int iDatalen; //代码段长度
ResetFlash(); //复位FLASH
EesetFlash(); //整片擦除FLASH
//开始烧写FLASH,下面为Boot表引导信息
FlashPtr=(BYTE *)0x8000;
FlashData=0x10AA; //置16位存储器格式
WriteFlash(FlashPtr++,FlashData);
FlashData=0x7FFF; //置SWWSR初始化值
WriteFlash(FlashPtr++,FlashData);
FlashData=0x0F800; //置BSCR初始化值
WriteFlash(FlashPtr++,FlashData);
FlashData=0x0000; //程序执行入口偏移地址XPC
WriteFlash(FlashPtr++,FlashData);
FlashData=0x1000; //程序执行入口地址PC
WriteFlash(FlashPtr++,FlashData);
FlashData=0x002e; //第一个程序段的长度
WriteFlash(FlashPtr++,FlashData);
FlashData=0x0000; //第一个程序要装入的内部RAM区偏移地址
WriteFlash(FlashPtr++,FlashData);
FlashData=0x1000; //第一个程序段要装入的内部RAM区地址
WriteFlash(FlashPtr++,FlashData); //开始烧写第一段程序
OriMem=(BYTE *)0x1000; //第一段程序首地址
iDatalen=0x002e; //第一段程序长度
for(i=0;i<iDatalen;i++)
{
FlashData=*OriMem++;
WriteFlash(FlashPtr++,FlashData);
}
//第二段程序(中断向量表)Boot引导信息
FlashData=0x0078; //第二个程序段的长度
WriteFlash(FlashPtr++,FlashData);
FlashData=0x0000; //第二个程序段要装入的内部RAM区偏移地址
WtireFlash(FlashPtr++,FlashData);
FlashData=0x0080; //第二个程序段要装入的内部RAM区地址
WriteFlash(FlashPtr++,FlashData); //开始烧写第二段程序(中断向量表)
OriMem=(BYTE *)0x080; //第二段程序首地址
iDatalen=0x0078; //第二段程序长度
for(i=0;i<iDatalen;i++)
{FlashData=*OriMem++;
WriteFlash(FlashPtr++,FlashData);
}
//程序烧写结束,写入Boot表结束标志
FlashData=0x0000; //引导表结束标志
WriteFlash(FlashPtr,FlashData); //在数据空间0xFFFF写入引导表起始地址
FlashPtr=(BYTE *)0x0FFFF;
FlashData=0x8000;
WriteFlash(FlashPtr,FlashData);
for(;;); //FLASH烧写完毕
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -