STM32F103RCT6的FLASH写入
1.
#define STM32_FLASH_BASE 0x08000000
#define FLASH_APP_ADDR 0x08005000
#define FLASH_PARA_ADDR 0x0803C000
#define FLASH_INFO_ADDR 0x0803F000
#define STM_SECTOR_SIZE 2048
#define STM32_FLASH_SIZE 128 u16 stm32_flash_buf[STM_SECTOR_SIZE/2]={0x00};
u8 STMFLASH_Read_Byte(u32 faddr)
{return *(u8*)faddr;
}
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 num_byte)
{ u16 i;for(i=0;i<num_byte;i++){FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);WriteAddr+=2;}
}
void STMFLASH_Write(u32 WriteAddr,u8 *pBuffer,u16 num_byte)
{u16 i;u16 sec_num; u16 sec_off; if((WriteAddr!=FLASH_INFO_ADDR)&&(WriteAddr!=FLASH_APP_ADDR)&&(WriteAddr!=FLASH_PARA_ADDR))return;sec_num=(num_byte/STM_SECTOR_SIZE);sec_off=(num_byte%STM_SECTOR_SIZE);FLASH_Unlock(); if(WriteAddr==FLASH_APP_ADDR){for(i=0;i<116;i++){FLASH_ErasePage((i+10)*STM_SECTOR_SIZE+STM32_FLASH_BASE);}for(i=0;i<sec_num;i++){memset((u8*)stm32_flash_buf,0xFF,sizeof(stm32_flash_buf));Mem_Copy((u8*)stm32_flash_buf,&pBuffer[i*STM_SECTOR_SIZE],STM_SECTOR_SIZE);STMFLASH_Write_NoCheck((FLASH_APP_ADDR+i*STM_SECTOR_SIZE),stm32_flash_buf,STM_SECTOR_SIZE/2);} if(sec_off){memset((u8*)stm32_flash_buf,0xFF,sizeof(stm32_flash_buf));Mem_Copy((u8*)stm32_flash_buf,&pBuffer[sec_num*STM_SECTOR_SIZE],sec_off);STMFLASH_Write_NoCheck((FLASH_APP_ADDR+i*STM_SECTOR_SIZE),stm32_flash_buf,STM_SECTOR_SIZE/2);}}else if(WriteAddr==FLASH_INFO_ADDR){FLASH_ErasePage(FLASH_INFO_ADDR);memset((u8*)stm32_flash_buf,0xFF,sizeof(stm32_flash_buf));Mem_Copy((u8*)stm32_flash_buf,pBuffer,sec_off);STMFLASH_Write_NoCheck(FLASH_INFO_ADDR,stm32_flash_buf,STM_SECTOR_SIZE/2);}else if(WriteAddr==FLASH_PARA_ADDR){FLASH_ErasePage(FLASH_PARA_ADDR);memset((u8*)stm32_flash_buf,0xFF,sizeof(stm32_flash_buf));Mem_Copy((u8*)stm32_flash_buf,pBuffer,sec_off);STMFLASH_Write_NoCheck(FLASH_PARA_ADDR,stm32_flash_buf,STM_SECTOR_SIZE/2);}FLASH_Lock();
}
void STMFLASH_Read(u32 ReadAddr,u8 *pBuffer,u16 num_byte)
{u16 i;for(i=0;i<num_byte;i++){pBuffer[i]=STMFLASH_Read_Byte(ReadAddr);ReadAddr+=1;}
}
void Mem_Copy(u8 * date1,u8 * date2,u16 len)
{u16 i;for(i=0;i<len;i++){date1[i]=date2[i];}
}