[STM32L1] STM8L151 在IAR中实现Flash/EEPROM的擦写

[复制链接]
 楼主| gejigeji521 发表于 2017-6-10 21:18 | 显示全部楼层 |阅读模式
在 STM8L151G6U6中可支持字节擦写和块擦写,块擦写可一次擦写很所字节。字节擦写比较简单,需要注意的是块擦写,在块擦写中,需要配置一个地方。
20160516233948255.png
对于IAR来说,
Uncomment the line “#define RAM_EXECUTION (1)” in the stm8l15x.h file to enable the FLASH functions execution from RAM through the specific __ramfunc keyword.
之后可在程序中调用Flash_BlockProgram();来进行块擦写。
 楼主| gejigeji521 发表于 2017-6-10 21:19 | 显示全部楼层
在main函数前要做以下声明:
  1. #ifdef _RAISONANCE_
  2. /* needed by memcpy for raisonance */
  3. #include <string.h>
  4. extern int __address__FLASH_EraseBlock;
  5. extern int __size__FLASH_EraseBlock;
  6. extern int __address__FLASH_ProgramBlock;
  7. extern int __size__FLASH_ProgramBlock;
  8. #endif /*_RAISONANCE_*/

  9. /* Private function prototypes -----------------------------------------------*/
  10. /* Declare _fctcpy function prototype as it is packaged by default in the Cosmic
  11. machine library */
  12. #ifdef _COSMIC_
  13. int _fctcpy(char name);
  14. #endif /*_COSMIC_*/


 楼主| gejigeji521 发表于 2017-6-10 21:19 | 显示全部楼层
之后可使用下面函数来进行擦写到epprom中,
  1. void Flash_WriteDataBlock(uint8_t block_count, uint8_t *Buffer)
  2. {
  3.     FLASH_Unlock(FLASH_MemType_Data);//可以擦写EEPROM或Flash:FLASH_Unlock(FLASH_MemType_Program);
  4.     while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET)
  5.     {}
  6.     FLASH_ProgramBlock(block_count, FLASH_MemType_Data, FLASH_ProgramMode_Standard, Buffer);

  7.     while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
  8.     {}
  9.     //FLASH_WaitForLastOperation();
  10.     FLASH_Lock(FLASH_MemType_Data);
  11. }
之后编译即可,不知道是否要将工程设置为支持C标准库,可能要,测试成功的工程是做了这个设置的,大家也可以自己做一下测试
643757107 发表于 2017-6-10 23:35 | 显示全部楼层
调用相关函数就行看
捉虫天师 发表于 2017-6-11 18:31 | 显示全部楼层
不要动不动就擦,合理安排。
pjzmj2012 发表于 2020-9-6 14:55 | 显示全部楼层
建议字节擦写也列出来,好让我等小白照抄
您需要登录后才可以回帖 登录 | 注册

本版积分规则

195

主题

2460

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部