历史上的今天
今天是:2024年09月23日(星期一)
2020年09月23日 | STM8S103F3--EEPROM
2020-09-23 来源:eefocus
本文介绍stm8s103f3这款单片机的eeprom的用法。
EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。
1.介绍STM8S103F3的首地址及容量。
STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。
stm8s103f3的EEPROM存储结构如下:

由上图可知,EEPROM的大小为0x00427f-0x004000+1=0x280=640bytes。
2.介绍EEPROM的解保护寄存器。
![clipboard[1] clipboard[1]](https://8.eewimg.cn/news/uploadfile/2020/0923/1600829335485202.png?imageView2/2/w/550)
向该寄存器先写入0XAE,然后写入0X56就可以解除解保护。想该寄存器读操作时,会返回0;
3.FLASH状态寄存器
![clipboard[2] clipboard[2]](https://8.eewimg.cn/news/uploadfile/2020/0923/1600829336227109.png?imageView2/2/w/550)
![clipboard[3] clipboard[3]](https://8.eewimg.cn/news/uploadfile/2020/0923/1600829336355033.png?imageView2/2/w/550)
需要注意的是bit3,bit3为EEPROM区域解锁标记,0表示保护使能,1表示保护失效。向FLASH_DUKR中写入解锁数据后通过查看FLASH_IAPSR寄存器的bit3来确定EEPROM区域已经解锁。
bit2表示编程结束标志。对EEPROM区域进行写操作后需要判断该位来确定已经写操作成功。
下面设计两个程序程序,第一个程序给EEPROM中的004000H位置写入一个值01H,少写入Flash中。第二个程序先读出004000H位置的值,然后给该值加1,再写入到004000H位置,也即是说每次上电时,004000H位置的值会加1。同时为了观察现象,在第二个程序中设置了一个LED灯,通过灯的亮灭次数来表示当前004000H位置的值。
第一个程序:
1 #include "iostm8s103f3.h"
2
3 void main()
4
5 {
6
7 unsigned char *p;
8
9 unsigned int i;
10
11 p = (unsigned char *)0x4000; // 指针p指向芯片内部的EEPROM第一个单元
12
13 // 对数据EEPROM进行解锁
14
15 do
16
17 {
18
19 FLASH_DUKR = 0xae; // 写入第一个密钥
20
21 FLASH_DUKR = 0x56; // 写入第二个密钥
22
23 } while((FLASH_IAPSR & 0x08) == 0); // 若解锁未成功,则重新再来
24
25 *p=1; // 写入第一个字节
26
27 while((FLASH_IAPSR & 0x04) == 0); // 等待写操作成功
28
29 }
第二个程序:
1 #include "iostm8s103f3.h"
2 unsigned char ch;
3 void delay (unsigned int times)
4 {
5 unsigned int i,j;
6 for(j=0;j 8 } 9 void main() 10 { 11 unsigned char *p; 12 unsigned int i; 13 p = (unsigned char *)0x4000; // 指针p指向芯片内部的EEPROM第一个单元 14 // 对数据EEPROM进行解锁 15 ch=0; 16 PD_DDR = 0x10; 17 PD_CR1 = 0x10; 18 PD_CR2 = 0x00; 19 do 20 { 21 FLASH_DUKR = 0xae; // 写入第一个密钥 22 FLASH_DUKR = 0x56; // 写入第二个密钥 23 } while((FLASH_IAPSR & 0x08) == 0); // 若解锁未成功,则重新再来 24 *p = *p+1; // 写入第一个字节 25 while((FLASH_IAPSR & 0x04) == 0); // 等待写操作成功 26 ch=*p; // 将写入的内容读到变量ch中 27 for(i=0;i 29 delay(4); 30 PD_ODR=0X10; 31 delay(4); 32 } 33 } 第二个程序下载完成之后,对开发版进行断电和上电操作,上电后PD4所对应的LED灯就会闪烁,闪烁次数代表*p位置的值的大小。
下一篇:IAR配置ICF到项目的实现方法
史海拾趣
|
.............................. [ 本帖最后由 pr8800 于 2009-3-24 17:04 编辑 ]… 查看全部问答> |
|
MCF52233_PIT—Programmable Interrupt Timers MCF52233有两路的PIT,可以产生精确的定时、延时,用操作系统时用来产生时钟节拍。就三个寄存器PCSR、PMR、PCNTR。很简洁! PCSR(PIT Control and Status Register),中断标志及控制位、分 ...… 查看全部问答> |
|
泰克的THS720P, 网上资料说是rs232接口,可示波器上的接口是一个网线类型的(LAN? or LXI?),随机附送的线也是两头都是网线类型的接头,不知该如何与电脑想连?插那里? 谢谢了,… 查看全部问答> |
|
经常在这看帖,看到有人说求购LED电源要隔离型的,或是有人问,也总是问隔离型的,他们的言下之意基本都是,不管什么LED样的LED驱动,更不管用于何种厂合,反正就是隔离的比不隔离的好,反正隔离的贵一些,就是好,实际这是一种误区. &n ...… 查看全部问答> |
|
这里要求程序在窗口最小化的方式下启动,这里在OnInitDlg()中用ShowWindow(SW_MINIMIZE);窗口会闪一下,至少上面的标题栏会改变,是否有什么办法可以解决,我看了一下CDialog::OnInitDialog()的原文件,里面是用::SetForegroundWindow(m_hWnd);来显示窗 ...… 查看全部问答> |
|
我用74LS373和74LS138扩展了一片6264 6264的地址是0x6000 用#define XPORT XBYTE[0x6000]定义 要怎样访问6264呢? 用unsinged char xdata temp行吗? 我初学C51,请各位大侠指点一下啊,万分感谢!… 查看全部问答> |




