#include "flash.h" ////读取指定地址的半字(16位数据) ////faddr:读地址(此地址必须为2的倍数!!) ////返回值:对应数据. u16 STMFLASH_ReadHalfWord(u32 faddr) { return *(vu16*)faddr; } // // //#if STM32_FLASH_WREN //如果使能了写 ////不检查的写入 ////WriteAddr:起始地址 ////pBuffer:数据指针 ////NumToWrite:半字(16位)数 //void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) //{ // u16 i; // for(i=0;i=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址 // FLASH_Unlock(); //解锁 // offaddr=WriteAddr-STM32_FLASH_BASE; //实际偏移地址. // secpos=offaddr/STM_SECTOR_SIZE; //扇区地址 0~127 for STM32F103RBT6 // secoff=(offaddr%STM_SECTOR_SIZE)/2; //在扇区内的偏移(2个字节为基本单位.) // secremain=STM_SECTOR_SIZE/2-secoff; //扇区剩余空间大小 // if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围 // while(1) // { // STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容 // for(i=0;i(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完 // else secremain=NumToWrite;//下一个扇区可以写完了 // } // }; // FLASH_Lock();//上锁 //} //#endif // // // ////从指定地址开始读出指定长度的数据 ////ReadAddr:起始地址 ////pBuffer:数据指针 ////NumToWrite:半字(16位)数 void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead) { u16 i; for(i=0;i=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址 if(WriteAddr&0x0000003ff)return;//非页首地址 FLASH_Unlock(); //解锁 status=FLASH_ErasePage(WriteAddr);//擦除这个扇区 if(status!=FLASH_COMPLETE){ return; } //写入 for(i = 0; i < DataLen; i+=2) { //数据8位融合为16位 temp = (((unsigned short)pData[i+1])<<8) + ((unsigned short)pData[i]); FLASH_ProgramHalfWord((WriteAddr+i),temp); } FLASH_Lock();//上锁 } /********************************************************************************************************** ************************************************************************************************************/ void ReadFlashData(unsigned long ReadAddr,unsigned char *pData,unsigned short DataLen) { int i,j; unsigned short temp; j=0; for(i=0;i>8)&0xff; } }