📄 flashburn.c
字号:
//#include "type.h"
#include <stdio.h>
#include <csl.h>
#include <csl_emif.h>
#include <csl_pll.h>
#define EMIF_CE1 0x01800004 /* Address of EMIF CE1 control */
#define FLASH_SIZE 0x4000 /* 1M X 16bit */
#define FLASH_START 0x90000000
#define FLASH_END (FLASH_START + FLASH_SIZE)
#define FLASH_ADR1 *(volatile char *)(0x90000000 +(0x0555<<1))
#define FLASH_ADR2 *(volatile char *)(0x90000000 +(0x02AA<<1))
#define FLASH_KEY1 0xAA
#define FLASH_KEY2 0x55
#define FLASH_KEY3 0xA0
#define FLASH_KEY4 0x80
#define FLASH_KEY5 0x10
#define CE1_16 0x02208812
unsigned short *flashstart = (unsigned short *)FLASH_START;
unsigned short *flashnext = (unsigned short *)FLASH_START;
/* 函数声明 */
void DEC6713_init(void);
void InitFlash(void);
void EraseFlash(unsigned int nBytes);
void BurnFlash(unsigned char *addr, unsigned int nBytes);
void FlashDelay(unsigned short count);
unsigned int nBytes = 0;
char flag = 0;
main()
{
CSL_init();
DEC6713_init();
InitFlash();
EraseFlash(nBytes);
printf("Erase successed!");
//BurnFlash((unsigned char *)0x0000,0x0200); //烧写vectors
//printf(" \nBurn vectors successed!");
flashnext = (unsigned short *)(0x90000000);
BurnFlash((unsigned char *)0x0000,0x0400); //烧写bootload
printf(" \nBurn bootload successed!");
flashnext = (unsigned short *)(0x90000400);
BurnFlash((unsigned char *)0x0400,0x3200); //烧写.text
printf(" \nBurn text successed!");
}
void FlashDelay(unsigned short count)
{
unsigned short i = count;
while(i--);
}
void InitFlash(void)
{
*(unsigned int *)EMIF_CE1 = CE1_16;
flashstart = (unsigned short *)FLASH_START; /* flashstart = 0x90000000 */
flashnext = flashstart;
}
void EraseFlash(unsigned int nBytes)
{
/* 16MBit (2M X 8) Flash Memory */
/* 擦除指令 555:AA /2AA:55/ 555:80 /555:AA/ 2AA:55/ 555:10 */
FLASH_ADR1 = (char)FLASH_KEY1; //AAH
FlashDelay(10);
FLASH_ADR2 = (char)FLASH_KEY2; //55H
FlashDelay(10);
FLASH_ADR1 = (char)FLASH_KEY4; //80H
FlashDelay(10);
FLASH_ADR1 = (char)FLASH_KEY1; //AAH
FlashDelay(10);
FLASH_ADR2 = (char)FLASH_KEY2; //55H
FlashDelay(10);
FLASH_ADR1 = (char)FLASH_KEY5; //10H
FlashDelay(2000);
/* Spin here 'til erasing completes
*/
while(*flashstart != 0xFFFF);
flag = 1;
return;
}
void BurnFlash(unsigned char *addr, unsigned int nBytes)
{
unsigned short timeout;
unsigned short c;
unsigned int nWords = nBytes/2;
if(flag == 1)
{
while(nWords--)
{
/* 16MBit (2M X 8) Flash Memory */
/* 编程指令 555:AA /2AA:55/ 555:A0 */
FLASH_ADR1 = (char)FLASH_KEY1; //AAH
FlashDelay(20);
FLASH_ADR2 = (char)FLASH_KEY2; //55H
FlashDelay(20);
FLASH_ADR1 = (char)FLASH_KEY3; //A0H
FlashDelay(20);
*flashnext = ((unsigned short)*addr++) | (((unsigned short)*addr)<<8);
FlashDelay(200);
/* Spin here 'til programming completes
*/
c = (((unsigned short)*addr--)<<8) | ((unsigned short)*addr++);
addr++;
timeout = 0;
do timeout += 1;
while(*flashnext != c && timeout < (unsigned short)0xffff);
flashnext++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -