STM8内部EEPROM的使用
@eeprom u8 save[10]={5,4,3};//大括号内为初始值,初始值只在仿真器仿真时才会起作用
u8 *pSave = (u8 *)&save[0];//对EEPROM数据区进行写操作时必须使用指针访问
void main()
{
do
{
FLASH_Unlock(FLASH_MEMTYPE_DATA);
}while((FLASH->IAPSR & FLASH_IAPSR_DUL) == 0);//等待DATA EEPROM区解锁
EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。
STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。
下面的实验程序,就是先给EEPROM中的第一个单元004000H写入55H,然后再读到全局变量ch中。
同样还是利用ST的开发工具,生成一个C语言程序的框架,然后修改其中的main.c,修改后的代码如下。
// 程序描述:对芯片内部的EEPROM存储单元进行实验
#include "STM8S207C_S.h"
unsigned char ch;
main()
{
unsigned char *p;
p = (unsigned char *)0x4000; // 指针p指向芯片内部的EEPROM第一个单元
// 对数据EEPROM进行解锁
do
{
FLASH_DUKR = 0xae; // 写入第一个密钥
FLASH_DUKR = 0x56; // 写入第二个密钥
} while((FLASH_IAPSR & 0x08) == 0); // 若解锁未成功,则重新再来
*p = 0xaa; // 写入第一个字节
while((FLASH_IAPSR & 0x04) == 0); // 等待写操作成功
ch = *p; // 将写入的内容读到变量ch中
while(1)
{
;
}
}
这里要注意的是,2个密钥的顺序,与STM8的用户手册上是相反的,如果按照手册上的顺序,就会停留在do…while循环中。具体原因,也不是很清楚,也可能是我拿到的手册(中文和英文的都一样)太旧了,或者是理解有误。
注:
参考资料说的解锁顺序的问题:
我们来看看官方给的库函数stm8s_flash.c文件中
void FLASH_Unlock(FLASH_MemType_TypeDef MemType)
{
/* Check parameter */
assert_param(IS_MEMORY_TYPE_OK(MemType));
/* Unlock program memory */
if (MemType == FLASH_MEMTYPE_PROG)
{
FLASH->PUKR = FLASH_RASS_KEY1;//KEY1:0x56
FLASH->PUKR = FLASH_RASS_KEY2;//KEY2:0xAE
}
/* Unlock data memory */
else
{
FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */
FLASH->DUKR = FLASH_RASS_KEY1;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏