写操作
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; //testuint8_t GBuffer[FLASH_BLOCK_SIZE * BLOCK_NUM]; //read/write bufferu8 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;}}
