以下为FLASH操作:
#include "flash.h"
#include "stm8s_flash.h"
void Flash_Write_bytes(uint32_t Address , uint8_t * DataBuff,uint16_t length)
{
uint16_t Count=0;
for( Count=0 ; Count<length ; Count++ )
{
FLASH_ProgramByte_User(Address+Count,DataBuff[Count]);
}
}
void FLASH_ProgramByte_User(uint32_t Address, uint8_t Data)
//将库函数中u16改为u32,否则当地址超过10000H时出错
{
/* Check parameters */
assert_param(IS_FLASH_ADDRESS_OK(Address));
*(PointerAttr uint8_t*) (uint32_t)Address = Data;
}
注:写FLASH前需要解锁
FLASH_Unlock(FLASH_MEMTYPE_PROG); //FLASH解锁
以下为EEPROM操作:
#include "EEPROM.h"
#include "stm8s_flash.h"
/*******************************************************************************
* ==EEPROM初始化函数==
* FLASH_DeInit(); --> 复位EEPROM的寄存器值
* FLASH_Unlock(FLASH_MEMTYPE_DATA); --> 解锁 对 Data EEPROM memory 进行操作
* FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD); --> 标准编程时间
*******************************************************************************/
void EEPROM_INIT(void)
{
FLASH_DeInit();
FLASH_Unlock(FLASH_MEMTYPE_DATA);
FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
}
/****************************************************************************************
* Function: Derive_EPWrite
* Object: 写EEPROM
* 输入: 头地址(0~2048) 数据指针 数据长
* 输出: 无
* 备注: 2K EEPROM 不能超过
****************************************************************************************/
void Derive_EPWrite(u16 Adr, u8 *pData, u16 Len)
{
u8 *p;
//p指针指向EEPROM 对应的单元
p = (u8*)0x4000 + Adr;
//解锁
FLASH_Unlock(FLASH_MEMTYPE_DATA);
//写数据
for( ; Len > 0; Len--)
{
Refresh_WWDG_Window(); //喂狗
*p++ = *pData++;
//等待写完成
while(!(FLASH_GetFlagStatus(FLASH_FLAG_EOP)));
}
//加锁
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
/****************************************************************************************
* Function: Derive_EPRead
* Object: 读EEPROM
* 输入: 头地址(0~2048) 数据存放指针 数据长
* 输出: 无
* 备注: 2K EEPROM
****************************************************************************************/
void Derive_EPRead(u16 Adr, u8 *pData, u16 Len)
{
u8 *p;
//p指针指向EEPROM 对应的单元
p = (u8*)0x4000 + Adr;
//解锁
FLASH_Unlock(FLASH_MEMTYPE_DATA);
//读数据
for( ; Len > 0; Len--)
{
*pData++ = *p++;
Refresh_WWDG_Window(); //喂狗
}
//加锁EEPROM
FLASH_Lock(FLASH_MEMTYPE_DATA);
}