Files
2025-12-15 16:07:49 +08:00

167 lines
3.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*——————————————————————————
* 文 件 名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;
}