原创 STM8与汇编语言(12)--EEPROM应用

2010-6-8 13:48 4369 8 8 分类: MCU/ 嵌入式

                 STM8与汇编语言(12)--EEPROM应用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


在单片机的应用系统中,经常会用到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 "STM8S<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />207C_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                  ; 先将累加器A0


        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


 


编译通过后,下载到开发板。运行前先看一下EEPROM内存空间的值,如下图所示,004000H单元的值为00H


 



65d9763f-c144-411d-8bff-2d3df9cf3435.JPG


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


 


然后运行程序,断点设置在JRA  MAIN_LOOP这条指令上,这时再看EEPROM中的内容如下图所示:


9e402f8e-311b-4195-9408-5ec1228a0346.JPG


 


 


可见我们已经将34H这个值,写入到EEPROM空间中的第一个单元004000H中。


 


与其它公司单片机中的EEPROM相比,对STM8EEPROM访问,确实要简单得多。


 


               2010-6-8

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条