分享

STM8内部EEPROM的使用

 hi_monkey 2020-06-22

EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。

示例程序

/* MAIN.C file * * Copyright (c) 2002-2005 STMicroelectronics */ #include 'stm8s207R8.h' #include 'prohead.h' /*************************************************************** *********************************/ /******************************************************************************************************** * Function: Derive_FlashUNLock * Object: 解锁ROM * 输入: 无 * 输出: 无 * 备注: 无 ********************************************************************************************************/ void Derive_FlashUNLock(void) { do { FLASH_DUKR = 0xae; // 写入第一个密钥 FLASH_DUKR = 0x56; // 写入第二个密钥 } while(!(FLASH_IAPSR&CHSBIT3)); // 等待解锁 } /******************************************************************************************************** * Function: Derive_EPWrite * Object: 写EEPROM * 输入: 头地址(0~1535) 数据指针 数据长 * 输出: 无 * 备注: 1.5K EEPROM 不能超过 ********************************************************************************************************/ void Derive_EPWrite(u16 Adr, u8 *pData, u16 Len) { u8 *p; //p指针指向EEPROM 对应的单元 p = (u8*)0x4000 Adr; //解锁 Derive_FlashUNLock(); //写数据 for( ; Len > ZERO; Len--) { *p = *pData ; //等待写完成 while(!(FLASH_IAPSR&CHSBIT2)); } //加锁 FLASH_IAPSR &= CLRBIT1; } /******************************************************************************************************** * Function: Derive_EPRead * Object: 读EEPROM * 输入: 头地址(0~1535) 数据存放指针 数据长 * 输出: 无 * 备注: 1.5K EEPROM ********************************************************************************************************/ void Derive_EPRead(u16 Adr, u8 *pData, u16 Len) { u8 *p; //p指针指向EEPROM 对应的单元 p = (u8*)0x4000 Adr; //解锁 Derive_FlashUNLock(); //读数据 for( ; Len > ZERO; Len--) *pData = *p ; //加锁EEPROM FLASH_IAPSR &= CLRBIT1; } main() { //STM8S 207R8 共有1.5K字节EEPROM u8 num[]={0,1,2,3,4,5,6,7,8,9}; //从EERPOM首地址开始 写入0~9 Derive_EPWrite(0, num, sizeof(num)); //从EERPOM首地址开始 读入10个数进num数组 Derive_EPRead(0, num, sizeof(num)); //OK while (1); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多