打印
[其他ST产品]

STM8与汇编语言(9)--EEPROM应用

[复制链接]
2079|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2023-5-16 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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)
  {
     ;
  }  
}

使用特权

评论回复
沙发
cr315|  楼主 | 2023-5-16 15:54 | 只看该作者
这里要注意的是,2个密钥的顺序,与STM8的用户手册上是相反的,如果按照手册上的顺序,就会停留在do…while循环中。具体原因,也不是很清楚,也可能是我拿到的手册(中文和英文的都一样)太旧了,或者是理解有误。
  另外,上面的实验程序中,ch不能为局部变量,否则的话,在调试环境中跟踪ch变量时,显示的结果就不对,通过反汇编,我觉得是编译有问题,当定义成局部变量时,ch = *p的汇编代码如下:
 
main.c:23         ch = *p;                                 // 将写入的内容读到变量ch中
0x80f0 <main+34>   0x7B01          LD    A,(0x01,SP)         LD    A,(0x01,SP)
0x80f2 <main+36>   0x97            LD    XL,A                LD    XL,A
0x80f3 <main+37>   0x1E02          LDW   X,(0x02,SP)         LDW   X,(0x02,SP)
0x80f5 <main+39>   0xF6            LD    A,(X)               LD    A,(X)
0x80f6 <main+40>   0x97            LD    XL,A                LD    XL,A
 
如果将ch定义成全局变量,则汇编代码为:
main.c:22         ch = *p;                                 // 将写入的内容读到变量ch中
0x80ef <main+33>   0x1E01          LDW   X,(0x01,SP)         LDW   X,(0x01,SP)
0x80f1 <main+35>   0xF6            LD    A,(X)               LD    A,(X)
0x80f2 <main+36>   0xB700          LD    0x00,A              LD    0x00,A
  这一段代码的分析仅供参考,本人使用的开发环境为STVD4.1.0,编译器版本号为:COSMIC的CxSTM84.2.4。

使用特权

评论回复
板凳
万图| | 2024-5-21 07:28 | 只看该作者

电流若是偏大就会直接导致器件烧毁

使用特权

评论回复
地板
Uriah| | 2024-5-21 08:31 | 只看该作者

人体具有300PF的等效电容

使用特权

评论回复
5
帛灿灿| | 2024-5-21 10:27 | 只看该作者

从而达到对电子设备进行静电保护

使用特权

评论回复
6
Bblythe| | 2024-5-21 11:30 | 只看该作者

齐纳二极管的缺点是不如TVS快

使用特权

评论回复
7
周半梅| | 2024-5-21 13:26 | 只看该作者

就是因为它的作用就是在电子产品设备受到雷击浪涌与ESD静电放电或者其他瞬态电压时

使用特权

评论回复
8
Pulitzer| | 2024-5-21 14:29 | 只看该作者

这方便一般可以使用底涂的方式来改善

使用特权

评论回复
9
童雨竹| | 2024-5-21 16:25 | 只看该作者

正常信号一般达不到导通电压

使用特权

评论回复
10
Wordsworth| | 2024-5-21 17:28 | 只看该作者

在电子电路中电容一端接电阻

使用特权

评论回复
11
公羊子丹| | 2024-5-21 19:24 | 只看该作者

明确出电源的性能和稳定性是否符合预期和要求

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1340

主题

3907

帖子

0

粉丝