历史上的今天
今天是:2024年10月12日(星期六)
2021年10月12日 | STM8与汇编语言(12)--EEPROM应用
2021-10-12 来源:eefocus
在单片机的应用系统中,经常会用到EEPROM,用来保存一些掉电后仍然需要保存的数据。传统的方法是在单片机外再加一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,许多单片机芯片公司也都推出了集成有小容量EEPROM的单片机,降低了成本,提高了可靠性。
STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为关键的是,在STM8单片机中,访问EEPROM就向访问常规的内存一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。
如果我们要读出EEPROM中的第一个单元的内容,则只要执行LD A,$4000这条指令,就可以将EEPROM中的第一个单元的内容读到累加器A中。
当需要将数据写入EEPROM中时,首先进行解锁操作,当解锁成功后,直接执行LD $4000,A这条指令,就可以将累加器A中的值,写入到EEPROM的第一个单元中。然后通过查询状态,判断写入操作是否成功。
下面的实验程序,就是先给EEPROM中的第一个单元004000H写入34H,然后再读到累加器A中。
同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。
stm8/
#include "mapping.inc"
#include "STM8S207C_S.INC"
; 定义堆栈空间的起始位置和结束位置
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
segment 'rom' ; 下面开始定义一个段,该段位于ROM中
main.l ; 定义复位后的第一条指令的标号(即入口地址)
;
; 首先要初始化堆栈指针
LDW X,#stack_end
LDW SP,X
; 对数据EEPROM进行解锁
WAIT_UNLOCK.L
LD A,#$AE
LD FLASH_DUKR,A ; 写入第一个密钥
LD A,#$56
LD FLASH_DUKR,A ; 写入第二个密钥
LD A,FLASH_IAPSR ; 检查是否解锁成功
AND A,#$08
JREQ WAIT_UNLOCK ; 若不成功,重新再来
LD A,#$34 ; 写入第一个字节
LD $4000,A
WAIT_WRITE_END.L
LD A,FLASH_IAPSR ; 等待写操作结束
AND A,#$04
JREQ WAIT_WRITE_END
LD A,#$00 ; 先将累加器A清0
LD A,$4000 ; 读出刚才写入的单元
MAIN_LOOP.L
JRA MAIN_LOOP ; 进入无限循环
;
interrupt NonHandledInterrupt
NonHandledInterrupt.l
iret
; 下面定义中断向量表
segment 'vectit'
dc.l {$82000000+main} ; reset
dc.l {$82000000+NonHandledInterrupt} ; trap
dc.l {$82000000+NonHandledInterrupt} ; irq0
dc.l {$82000000+NonHandledInterrupt} ; irq1
dc.l {$82000000+NonHandledInterrupt} ; irq2
dc.l {$82000000+NonHandledInterrupt} ; irq3
dc.l {$82000000+NonHandledInterrupt} ; irq4
dc.l {$82000000+NonHandledInterrupt} ; irq5
dc.l {$82000000+NonHandledInterrupt} ; irq6
dc.l {$82000000+NonHandledInterrupt} ; irq7
dc.l {$82000000+NonHandledInterrupt} ; irq8
dc.l {$82000000+NonHandledInterrupt} ; irq9
dc.l {$82000000+NonHandledInterrupt} ; irq10
dc.l {$82000000+NonHandledInterrupt} ; irq11
dc.l {$82000000+NonHandledInterrupt} ; irq12
dc.l {$82000000+NonHandledInterrupt} ; irq13
dc.l {$82000000+NonHandledInterrupt} ; irq14
dc.l {$82000000+NonHandledInterrupt} ; irq15
dc.l {$82000000+NonHandledInterrupt} ; irq16
dc.l {$82000000+NonHandledInterrupt} ; irq17
dc.l {$82000000+NonHandledInterrupt} ; irq18
dc.l {$82000000+NonHandledInterrupt} ; irq19
dc.l {$82000000+NonHandledInterrupt} ; irq20
dc.l {$82000000+NonHandledInterrupt} ; irq21
dc.l {$82000000+NonHandledInterrupt} ; irq22
dc.l {$82000000+NonHandledInterrupt} ; irq23
dc.l {$82000000+NonHandledInterrupt} ; irq24
dc.l {$82000000+NonHandledInterrupt} ; irq25
dc.l {$82000000+NonHandledInterrupt} ; irq26
dc.l {$82000000+NonHandledInterrupt} ; irq27
dc.l {$82000000+NonHandledInterrupt} ; irq28
dc.l {$82000000+NonHandledInterrupt} ; irq29
end
史海拾趣
|
1. 定义地电流:在大地或在接地极中流过的电流。接地导体:指构成地的导体,该导体将设备、电气器件、布线系统、或其他导体(通常指中性线)与接地极连接。接地极:构成地的一种导体。接地连接:用来构成地的连接,系由接地导体、接地极和围绕接地 ...… 查看全部问答> |
|
整理后经济型袖珍示波器V1.1版材料清单及成本估算如下: 电路原理图PCB图请参阅之前在坛子里发的“经济型袖珍示波器V1.1版电路原理图”及“经济型袖珍示波器PCB图” 至于包含已经焊好零件并检测完成的电路板的全套套件,就在上面全套散件价格的 ...… 查看全部问答> |
|
在电子电路中,常可以看到VCC、VDD和VSS三种不同的符号,它们有什么区别呢? 一、解释 VCC:C=circuit 表示电路的意思, 即接入电路的电压; VDD:D=device 表示器件的意思, 即器件内部的工作电压; VSS:S=series 表示公共连接的意 ...… 查看全部问答> |
|
大虾们好,以下是我的UART1中断函数 void UART1 (void) interrupt 20 using 2 { unsigned char xdata tChar=0; EIE2 &= 0xBF; RI1Flag=(SCON1 & 0x01); ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:33 编辑 高效率LED驅動電源設計 作者: 德州儀器Robert Kollman 摘要 本文提供LED特性及驅動電源優缺點的概要說明。文中將介紹數種常見的電源供應應用電路,並且詳細說明其閉迴路設計。本文亦討論LED調 ...… 查看全部问答> |
|
我们公司以前一直用NEC的单片机,现在改为用TI 28335,刚开始用;想问一个问题,就是看资料说TIMER 0是给用户用的,那是否定时器中断,只能有一个了?若想多定时中断咋办?… 查看全部问答> |
|
本系统系统以MSP430G2231位核心控制器,核心控制器通过DC-DC降压电路从12V蓄电池取电。通过对光伏太阳能板输出电压与电流进行采样,可以实现最大功率跟踪。通过对铅酸电池的电压及充电电流进行采样,可以实现蓄电池充电的控制。 … 查看全部问答> |
|
邮箱:chinaymj@gmail.com 官网的软件是8.11的我没有找到8.10的版本的,8.11的试用期过了,现在网上还没的破解的。 希望好心人能给我传一个谢谢!… 查看全部问答> |
|
一直用IO口模拟I2C,这两天做msp430用到I2C却遇到问题,特来请教各位高手 以前用IO口模拟I2C一直都没有出现问题,现在正在做的msp430板子却怎么都调试不出来。现将所遇到的情况向各位汇报:1、一开始是向24C04写地址,但是始终没有应答信号,用示波器观察,SDA信号电平在中间位置,所以判断信号为高,无应答 2、于是我怀 ...… 查看全部问答> |




