STM8S103F3--EEPROM


  本文介紹stm8s103f3這款單片機的eeprom的用法。

      EEPROM是單片機應用系統中經常會用到的存儲器,它主要用來保存一些掉電后需要保持不變的數據。在以前的單片機系統中,通常都是在單片機外面再擴充一個EEPROM芯片,這種方法除了增加成本外,也降低了可靠性。現在,很多單片機的公司都推出了集成有小容量EEPROM的單片機,這樣就方便了使用,降低了成本,提高了可靠性。

        1.介紹STM8S103F3的首地址及容量。

        STM8單片機芯片內部也集成有EEPROM,容量從640字節到2K字節。最為特色的是,在STM8單片機中,對EEPROM的訪問就象常規的RAM一樣,非常方便。EEPROM的地址空間與內存是統一編址的,地址從004000H開始,大小根據不同的芯片型號而定。

        stm8s103f3的EEPROM存儲結構如下:

clipboard

        由上圖可知,EEPROM的大小為0x00427f-0x004000+1=0x280=640bytes。

        2.介紹EEPROM的解保護寄存器。

clipboard[1]

        向該寄存器先寫入0XAE,然后寫入0X56就可以解除解保護。想該寄存器讀操作時,會返回0;

        3.FLASH狀態寄存器

clipboard[2]

clipboard[3]

    需要注意的是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<times;j++)
 7    for(i=0;i<65535;i++);
 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<ch;i++){
28      PD_ODR = 0x00;
29      delay(4);
30      PD_ODR=0X10;
31      delay(4);
32    }
33  }

第二個程序下載完成之后,對開發版進行斷電和上電操作,上電后PD4所對應的LED燈就會閃爍,閃爍次數代表*p位置的值的大小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM