jcky001 发表于 2021-2-4 10:31

stm32f107 使用内部FLASH

小弟从网上找的例程是F103的 我用的是F107VCT6,看了半天代码,自己又找了一个103做实验,103调通了,可是107失败了,程序没变,请问还有哪些地方需要更改一下,下面附上flash.c,二楼放MAIN.c


    //从指定地址开始读取多个数据
    void FLASH_ReadMoreData(uint32_t startAddress,uint16_t *readData,uint16_t countToRead)
    {
      uint16_t dataIndex;
   for(dataIndex=0;dataIndex<countToRead;dataIndex++)
      {
       readData=FLASH_ReadHalfWord(startAddress+dataIndex*2);
      }
    }
   
    //读取指定地址的半字(16位数据)
    uint16_t FLASH_ReadHalfWord(uint32_t address)
    {
      return*(__IO uint16_t*)address;
    }
   
    //读取指定地址的全字(32位数据)
    uint32_t FLASH_ReadWord(uint32_t address)
    {
      uint32_t temp1,temp2;
   temp1=*(__IO uint16_t*)address;
   temp2=*(__IO uint16_t*)(address+2);
      return(temp2<<16)+temp1;
    }
   
   
   
    //从指定地址开始写入多个数据
void FLASH_WriteMoreData(uint32_t startAddress,uint16_t *writeData,uint16_t countToWrite)
{
if(startAddress<FLASH_BASE||((startAddress+countToWrite*2)>=(FLASH_BASE+1024*FLASH_SIZE)))
{
   return;//非法地址
}
FLASH_Unlock();         //解锁写保护
uint32_t offsetAddress=startAddress-FLASH_BASE;               //计算去掉0X08000000后的实际偏移地址
uint32_t sectorPosition=offsetAddress/SECTOR_SIZE;            //计算扇区地址,对于STM32F103VET6为0~255

uint32_t sectorStartAddress=sectorPosition*SECTOR_SIZE+FLASH_BASE;    //对应扇区的首地址

FLASH_ErasePage(sectorStartAddress);//擦除这个扇区

uint16_t dataIndex;
for(dataIndex=0;dataIndex<countToWrite;dataIndex++)
{
   FLASH_ProgramHalfWord(startAddress+dataIndex*2,writeData);
}

FLASH_Lock();//上锁写保护
}

页: [1]
查看完整版本: stm32f107 使用内部FLASH