/******************************************************************************* 函 数 名: Program_Write 功能说明: 写入编程 参 数: addr: 写入数据的首地址 size: 要写入数据的大小 data: 写入数据内容 返 回 值: 写入结果TRUE/FALSE *******************************************************************************/ BF_BOOLEAN Program_Write(BF_INT32U addr, BF_INT32U len, BF_INT08U *data) { BF_INT08U flag; if (len & 0x01) //内部为半字节写入 { len++; } Flash_Unlock(); flag = Flash_Write(addr, len, data); Flash_lock(); return flag; }
BOOL STM32_Flash_Save( uint16_t VirtualAddress, void const * Buffer, uint16_t Count ) { if ( ! Flash_Page_Check( EBASE_PAGE0 )) { Flash_Unlock(); Flash_Page_Write( EBASE_PAGE0, VirtualAddress, Buffer, Count ); if ( Flash_Page_Check( EBASE_PAGE0 )) { Flash_Page_Erase( EBASE_PAGE1 ); Flash_Lock(); return TRUE; } else { ; // 校验失败,保留当前数据 Flash_Lock(); return FALSE; } } else { Flash_Unlock(); Flash_Page_Write( EBASE_PAGE1, VirtualAddress, Buffer, Count ); if ( Flash_Page_Check( EBASE_PAGE1 )) { Flash_Page_Erase( EBASE_PAGE0 ); Flash_Lock(); return TRUE; } else { ; // 校验失败,保留当前数据 Flash_Lock(); return FALSE; } } }
/******************************************************************************* 函 数 名: Flash_WriteOptionByte 功能说明: 写入Flash选项字节 参 数: addr: 选项字节地址 data: 内容 返 回 值: TRUE/FALSE (操作结果) *******************************************************************************/ u8 Flash_WriteOptionByte(u32 addr, u8 data) { u8 flag = FALSE; if (!Flash_Status(ProgramTime)) { Flash_Unlock(); FLASH->CR |= FLASH_CR_OPTPG; FLASH->CR |= FLASH_CR_STRT; *(vu8*)addr = data; if (!Flash_Status(ProgramTime)) { if (Flash_EOP()) { flag = TRUE; } } FLASH->CR &= ~FLASH_CR_OPTER; } return flag; }
/******************************************************************************* 函 数 名: Flash_eraseOptionByte 功能说明: 擦除整个Flash选项字节 参 数: 无 返 回 值: TRUE/FALSE (操作结果) *******************************************************************************/ u8 Flash_EraseOptionByte(void) { u8 flag = FALSE; if (!Flash_Status(ProgramTime)) { Flash_Unlock(); FLASH->CR |= FLASH_CR_OPTER; FLASH->CR |= FLASH_CR_STRT; if (!Flash_Status(ProgramTime)) { if (Flash_EOP()) { flag = TRUE; } } FLASH->CR &= ~FLASH_CR_OPTER; } return flag; }