河北水利局项目
This commit is contained in:
166
APP/Flash.c
Normal file
166
APP/Flash.c
Normal file
@@ -0,0 +1,166 @@
|
||||
/*——————————————————————————
|
||||
* 文 件 名: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;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user