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] ; }
}