#define FLASH_BASE 0x08000000 //读取一个ID unsigned short ReadID() { unsigned short *BaseAdd = (unsigned short *)FLASH_BASE; *(BaseAdd + 0x555) = 0xaa; *(BaseAdd + 0x2aa) = 0x55; *(BaseAdd + 0x555) = 0x90; return (*(BaseAdd + 1)); } //开启快写功能 int Unlock_Bypass(void) { unsigned short *BaseAdd = (unsigned short *)FLASH_BASE; *(BaseAdd + 0x555) = 0xaa; *(BaseAdd + 0x2aa) = 0x55; *(BaseAdd + 0x555) = 0x20; return 1; } //开启快写功能复位 int Unlock_Bypass_ReSet() { unsigned short *BaseAdd = (unsigned short *)FLASH_BASE; *(BaseAdd + 0x555) = 0x90; *(BaseAdd + 0x555) = 0x20; return 1; } //擦除全部 int Chip_Erase(void) { unsigned short *BaseAdd = (unsigned short *)FLASH_BASE; *(BaseAdd + 0x555) = 0xaa; *(BaseAdd + 0x2aa) = 0x55; *(BaseAdd + 0x555) = 0x80; *(BaseAdd + 0x555) = 0xaa; *(BaseAdd + 0x2aa) = 0x55; *(BaseAdd + 0x555) = 0x10; int i = 0; do { i ++; if(i > 0x100000)//超时 return 0; }while((*BaseAdd & 0x0020) == 0); if (*BaseAdd != 0xffff) { return 0; } return 1; } //擦除一段 int Sector_Erase(int addr) { int i = 0; unsigned short * BaseAdd = (unsigned short *)FLASH_BASE; unsigned short tmpData; *(BaseAdd + 0x555) = 0xaa; *(BaseAdd + 0x2aa) = 0x55; *(BaseAdd + 0x555) = 0x80; *(BaseAdd + 0x555) = 0xaa; *(BaseAdd + 0x2aa) = 0x55; *(BaseAdd + 0x555) = 0x30; do { tmpData = *(BaseAdd + addr); i ++; if(i > 0x100000) { return 0; } }while((tmpData & 0x0020) == 0); if (tmpData != 0xffff) { return 0; } return 1; } //写操作 int WriteInfo(int address, unsigned short mydata) { unsigned short *BaseAdd = (unsigned short *)FLASH_BASE; unsigned short tmpData; *(BaseAdd + 0x555) = 0xaa; *(BaseAdd + 0x2aa) = 0x55; *(BaseAdd + 0x555) = 0xa0; *(BaseAdd + address) = mydata; int i = 0; do { tmpData = *(BaseAdd + address); if (((tmpData^mydata) & 0x0080)== 0) { return 1; } i ++; if (i > 0x100000) { return 0; } }while ((tmpData & 0x0020) == 0); tmpData = *(BaseAdd + address); if ((tmpData^mydata) & 0x0080 != 0) { return 0; } return 1; } //快速写操作 int FastWrite(int addr, unsigned short myData) { int i = 0; unsigned short *BaseAdd = (unsigned short *)FLASH_BASE; unsigned short tmpData; *(BaseAdd + 0xaaa) = 0xa0; *(BaseAdd + addr) = myData; do { tmpData = *(BaseAdd + addr); if (((tmpData^myData) & 0x0080) == 0) { return 1; } i ++; if (i > 0x100000) { return 0; } }while(tmpData & 0x0020 == 0); tmpData = *(BaseAdd + addr); if ((tmpData^myData) & 0x0080 != 0) { return 0; } return 1; }