#include "stmflash.h" //读取指定地址的字(32位数据) //faddr:读地址 //返回值:对应数据. uint32_t STMFLASH_ReadWord(uint32_t faddr) { return *(volatile uint32_t*)faddr; } //获取某个地址所在的flash扇区 //addr:flash地址 //返回值:0~11,即addr所在的扇区 uint8_t STMFLASH_GetFlashSector(uint32_t addr) { if(addr=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址 // HAL_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;iCR, FLASH_CR_PER); //清除CR寄存器的PER位,此操作应该在FLASH_PageErase()中完成! // //但是HAL库里面并没有做,应该是HAL库bug! // for(i=0;i(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完 // else secremain=NumToWrite;//下一个扇区可以写完了 // } // }; // HAL_FLASH_Lock(); //上锁 // } // #endif //从指定地址开始读出指定长度的数据 //ReadAddr:起始地址 //pBuffer:数据指针 //NumToRead:字(32位)数 void STMFLASH_Read(uint32_t ReadAddr,uint32_t *pBuffer,uint32_t NumToRead) { uint32_t i; for(i=0;i