写操作

stm8芯片以block的方式写flash操作需要在RAM中执行(以Byte和Word的方式不需要),所以要将写操作放到RAM中执行。

开启IN_RAM功能

在固件库中的头文件处,如stm8l10x.h头文件中,使能IN_RAM功能,即直接去除头文件中#define RAM_EXECUTION (1)的注释(直接Ctrl+F搜索)。

定义写入的Block的数量及buffer的大小

  1. //写入的Block的数量
  2. #define BLOCK_NUM 2 /* block 0 in data eeprom memory: address is 0x1000 */
  3. uint8_t newval = 0xBB; //test
  4. uint8_t GBuffer[FLASH_BLOCK_SIZE * BLOCK_NUM]; //read/write buffer
  5. u8 ch1;

直接调用官方接口进行写入操作

  1. /*******************************************************************************
  2. **函数名称:void EEPROM_Block_Write(u8 block_Num)
  3. **功能描述:向EEPROM中固定地址写入一个或多个block数据
  4. **入口参数:block_Num,写入的block数量,起始位置为0
  5. **输出:无
  6. *******************************************************************************/
  7. void EEPROM_Block_Write(u8 block_Num)
  8. {
  9. for (u8 i = 0; i < block_Num; i++)
  10. {
  11. /* Define flash programming Time*/
  12. FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
  13. FLASH_Unlock(FLASH_MemType_Program);
  14. /* Wait until Flash Program area unlocked flag is set*/
  15. while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET)
  16. {}
  17. /* Unlock flash data eeprom memory */
  18. FLASH_Unlock(FLASH_MemType_Data);
  19. /* Wait until Data EEPROM area unlocked flag is set*/
  20. while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET)
  21. {}
  22. /* Fill the buffer in RAM */
  23. for (u16 i = 0; i < (FLASH_BLOCK_SIZE * block_Num); i++)
  24. {
  25. GBuffer[i] = newval;
  26. }
  27. /* This function is executed from RAM */
  28. FLASH_ProgramBlock(i, FLASH_MemType_Data, FLASH_ProgramMode_Standard, GBuffer); //i为指定的某一个block序号
  29. /* Wait until End of high voltage flag is set*/
  30. while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
  31. {}
  32. /* lock flash data eeprom memory */
  33. FLASH_Lock(FLASH_MemType_Data);
  34. delay(10); //delay 10ms
  35. }
  36. }

读操作

由于读操作不需要在RAM中执行,所以可直接按地址进行读取:

  1. /*******************************************************************************
  2. **函数名称:void EEPROM_Block_Read(u16 start_address, u8 block_Num, u8 *data)
  3. **功能描述:向EEPROM中固定地址读出一块64个字节数据
  4. **入口参数:
  5. start_address : EEPROM块首地址
  6. block_Num : 读取的block数量
  7. *data : 存储数组的首地址
  8. **输出:无
  9. *******************************************************************************/
  10. void EEPROM_Block_Read(u16 start_address, u8 block_Num, u8 *data)
  11. {
  12. u8 ch;
  13. for (u16 count = 0; count < (FLASH_BLOCK_SIZE * block_Num); count++)
  14. {
  15. ch = *((unsigned char *)(start_address + count));
  16. /* if (ch == 0x0d) //读到结束字符,则停止再读取数据
  17. {
  18. break;
  19. } */
  20. data[count] = ch;
  21. }
  22. }