写操作
stm8芯片以block的方式写flash操作需要在RAM中执行(以Byte和Word的方式不需要),所以要将写操作放到RAM中执行。
开启IN_RAM功能
在固件库中的头文件处,如stm8l10x.h头文件中,使能IN_RAM功能,即直接去除头文件中#define RAM_EXECUTION (1)的注释(直接Ctrl+F搜索)。
定义写入的Block的数量及buffer的大小
//写入的Block的数量
#define BLOCK_NUM 2 /* block 0 in data eeprom memory: address is 0x1000 */
uint8_t newval = 0xBB; //test
uint8_t GBuffer[FLASH_BLOCK_SIZE * BLOCK_NUM]; //read/write buffer
u8 ch1;
直接调用官方接口进行写入操作
/*******************************************************************************
**函数名称:void EEPROM_Block_Write(u8 block_Num)
**功能描述:向EEPROM中固定地址写入一个或多个block数据
**入口参数:block_Num,写入的block数量,起始位置为0
**输出:无
*******************************************************************************/
void EEPROM_Block_Write(u8 block_Num)
{
for (u8 i = 0; i < block_Num; i++)
{
/* Define flash programming Time*/
FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
FLASH_Unlock(FLASH_MemType_Program);
/* Wait until Flash Program area unlocked flag is set*/
while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET)
{}
/* Unlock flash data eeprom memory */
FLASH_Unlock(FLASH_MemType_Data);
/* Wait until Data EEPROM area unlocked flag is set*/
while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET)
{}
/* Fill the buffer in RAM */
for (u16 i = 0; i < (FLASH_BLOCK_SIZE * block_Num); i++)
{
GBuffer[i] = newval;
}
/* This function is executed from RAM */
FLASH_ProgramBlock(i, FLASH_MemType_Data, FLASH_ProgramMode_Standard, GBuffer); //i为指定的某一个block序号
/* Wait until End of high voltage flag is set*/
while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
{}
/* lock flash data eeprom memory */
FLASH_Lock(FLASH_MemType_Data);
delay(10); //delay 10ms
}
}
读操作
由于读操作不需要在RAM中执行,所以可直接按地址进行读取:
/*******************************************************************************
**函数名称:void EEPROM_Block_Read(u16 start_address, u8 block_Num, u8 *data)
**功能描述:向EEPROM中固定地址读出一块64个字节数据
**入口参数:
start_address : EEPROM块首地址
block_Num : 读取的block数量
*data : 存储数组的首地址
**输出:无
*******************************************************************************/
void EEPROM_Block_Read(u16 start_address, u8 block_Num, u8 *data)
{
u8 ch;
for (u16 count = 0; count < (FLASH_BLOCK_SIZE * block_Num); count++)
{
ch = *((unsigned char *)(start_address + count));
/* if (ch == 0x0d) //读到结束字符,则停止再读取数据
{
break;
} */
data[count] = ch;
}
}