/*—————————————————————————— * 文 件 名:Flash.c * 作 者:于涛 * 日 期:2014-01-15 * 文件说明:内部FLASH源文件 *——————————————————————————*/ #include "Flash.h" #include "General.h" #include "Mem.h" /*—————————————————————————— * 函 数 名:STM32_FlashPageErase * 输入参数:pageAddr 页地址 * 输出参数:None * 返 回 值:0 成功 1 失败 * 功能说明:内部FLASH页擦除 *——————————————————————————*/ u8 STM32_FlashPageErase(u32 pageAddr) { FLASH_Status status = FLASH_COMPLETE; FEED_WDG; FLASH_Unlock(); /* Clear All pending flags */ FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); //FLHDBG(printf("STM32_FlashPageErase pageAddr = %08x\r\n",pageAddr);); status = FLASH_ErasePage(pageAddr); if(status != FLASH_COMPLETE) { printf("STM32_FlashPageErase Err pageAddr = %08x status = %d\r\n",pageAddr,status); return FLH_ERASE_ERR; } FLASH_Lock(); return FLH_SUCCESS; } /*—————————————————————————— * 函 数 名:STM32_FlashWrite * 输入参数:programAddr 写地址 pBuffer 写缓冲区 size 写缓冲区大小 * 输出参数:None * 返 回 值:0 成功 >0 失败 * 功能说明:内部FLASH写操作 *——————————————————————————*/ u8 STM32_FlashWrite(u32 programAddr, u8* pBuffer, u16 size) { u8 sflag; u16 offset = 0,len = size; FLASH_Status status = FLASH_COMPLETE; FLASH_Unlock(); /* Clear All pending flags */ FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); sflag = len%2; if(sflag) { len --; } for(offset = 0; offset < len; offset += 2) { status = FLASH_ProgramHalfWord(programAddr + offset, ((u16)(pBuffer[offset + 1]) << 8) | (pBuffer[offset])); if(status != FLASH_COMPLETE) { printf("STM32_FlashWrite Err programAddr = %08x size = %d offset = %d status = %d\r\n",programAddr,size,offset,status); return FLH_WRITE_ERR; } } if(sflag && size>=1) { u16 val; val = pBuffer[size - 1]|0xFF00; status = FLASH_ProgramHalfWord(programAddr + offset, val); if(status != FLASH_COMPLETE) { printf("STM32_FlashWrite Err programAddr = %08x size = %d offset = %d status = %d\r\n",programAddr,size,offset,status); return FLH_WRITE_ERR; } } FLASH_Lock(); return FLH_SUCCESS; } /*—————————————————————————— * 函 数 名:STM32_FlashWriteZero * 输入参数:None * 输出参数:None * 返 回 值:见错误代码表 * 功能说明:对某一地址写0 *——————————————————————————*/ u8 STM32_FlashWriteZero(u32 programAddr, u16 size) { u16 offset = 0; FLASH_Status status = FLASH_COMPLETE; FLASH_Unlock(); /* Clear All pending flags */ FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); if (size%2==1) { size +=1; } for(offset = 0; offset < size; offset += 2) { status = FLASH_ProgramHalfWord(programAddr + offset, 0); if(status != FLASH_COMPLETE) { //FLHDBG(printf("STM32FLASH: Write zero error.");); return FLH_WRITE_ERR; } } FLASH_Lock(); return FLH_SUCCESS; } /***************************************************************************** * Function : read_unique_id * Description : none * Input : u8 * id * Output : None * Return : * Others : * Record * 1.Date : 20170314 * Author : barry * Modification: Created function *****************************************************************************/ bool read_unique_id(u8 * id) { for (u8 i = 0; i < 12; i++) { id[i] = *((u8*)(FLASH_ID_IDDR + i)); } for (u8 i = 0; i < 12; i++) { if (id[i] != 0xFF) { return TRUE; } } return FALSE; }