#include "flash.h" #include "stm32f10x.h" #if FLASH_SIZE<256 #define SECTOR_SIZE 1024 //字节 #else #define SECTOR_SIZE 2048 #endif uint16_t FLASH_BUF[SECTOR_SIZE/2];//最多是2K字节 //读取指定地址的半字(16位数据) //faddr:读地址(此地址必须为2的倍数!!) //返回值:对应数据. uint16_t FLASH_ReadHalfWord(uint32_t faddr) { return *(uint16_t*)faddr; } //不检查的写入 //WriteAddr:起始地址 //pBuffer:数据指针 //NumToWrite:半字(16位)数 void FLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite) { uint16_t i; for(i=0;i=(FLASH_BASE+1024*FLASH_SIZE))) return; //非法地址 FLASH_Unlock(); //解锁 offaddr=WriteAddr-FLASH_BASE; //实际偏移地址. secpos=offaddr/SECTOR_SIZE; //扇区地址 0~512 secoff=(offaddr%SECTOR_SIZE)/2; //在扇区内的偏移(2个字节为基本单位.) secremain=SECTOR_SIZE/2-secoff; //扇区剩余空间大小 if(NumToWrite<=secremain) secremain=NumToWrite;//不大于该扇区范围 while(1) { FLASH_Read(secpos*SECTOR_SIZE+FLASH_BASE,FLASH_BUF,SECTOR_SIZE/2);//读出整个扇区的内容 for(i=0;i(SECTOR_SIZE/2)) secremain=SECTOR_SIZE/2;//下一个扇区还是写不完 else secremain=NumToWrite;//下一个扇区可以写完了 } } FLASH_Lock();//上锁 } //从指定地址开始读出指定长度的数据 //ReadAddr:起始地址 //pBuffer:数据指针 //NumToWrite:半字(16位)数 void FLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead) { uint16_t i; for(i=0;i