167 lines
3.8 KiB
C
167 lines
3.8 KiB
C
/*——————————————————————————
|
||
* 文 件 名: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;
|
||
|
||
}
|
||
|