高中生
最后登录1970-1-1
在线时间 小时
注册时间2019-9-15
|
如题,来分享一个好用的STM8S内部EEPROM读写程序,以字节方式进行读写操作,像真正的EEPROM一样,用起来简单方便。
实验平台:STM8S105K4T6 + IAR For STM8 v1.31,使用库V2.1.0,另外STM8S105是支持RWW的
EEPROM读写操作使用库函数写的,可能有的人要说了还是用寄存器效率高。其实EEPROM操作使用库效率低不了多少,
并且EEPROM又不是经常去读写,故对整体程序效率影响不会太大。(如果实在计较效率,也可以很方便的改成寄存器方式)
不废话,上代码:
- #include "stm8s_eeprom.h"
- void EEPROM_Init(void)
- {
- FLASH_DeInit();
- FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
- //FLASH_Unlock(FLASH_MEMTYPE_DATA); // 解锁EEPROM(由写操作自己完成!!!)
- }
- uint8_t EEPROM_Write(uint16_t addr, uint8_t *buff, uint16_t len)
- {
- uint16_t eeprom_addr;
- uint16_t i;
-
- eeprom_addr = EEPROM_ADDR_BASE + addr; // EEPROM地址
- if ((eeprom_addr + len) > (EEPROM_ADDR_BASE + EEPROM_BYTES_SIZE)) return 0; // 地址范围错误
-
- do {
- FLASH_Unlock(FLASH_MEMTYPE_DATA); // 解锁EEPROM
- } while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET); // 等待EEPROM解锁成功
-
- for (i=0; i<len; i++) {
- FLASH_ProgramByte(eeprom_addr, buff[i]); // 写入一字节数据
- eeprom_addr++;
- FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA); // 等待操作完成
- }
-
- FLASH_Lock(FLASH_MEMTYPE_DATA); //加锁EEPROM
-
- return 1;
- }
- uint8_t EEPROM_Read(uint16_t addr, uint8_t *buff, uint16_t len)
- {
- uint16_t eeprom_addr;
- uint16_t i;
-
- eeprom_addr = EEPROM_ADDR_BASE + addr; // EEPROM地址
- if ((eeprom_addr + len) > (EEPROM_ADDR_BASE + EEPROM_BYTES_SIZE)) return 0; // 地址范围错误
-
- for (i=0; i<len; i++) {
- buff[i] = FLASH_ReadByte(eeprom_addr); // 读取一字节数据
- eeprom_addr++;
- FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA); // 等待操作完成
- }
-
- return 1;
- }
复制代码
实际测试 STM8S105K4T6:
测试对比图.png
工程代码包:
STM8_EEPROM_V2.rar
(270.19 KB, 下载次数: 49)
|
|