1. 程式人生 > >Flash program memory and data EEPROM

Flash program memory and data EEPROM

corrupted check stat blog 編程 其中 per pri param

1、簡介

  STM8S內部的FLASH程序存儲器和數據EEPROM是由一組通用寄存器來控制的;所以我們可以通過這些通用寄存器來編程或擦除存儲器的內容、設置寫保護、或者配置特定的低功耗模式。我們也可以自己對器件的 option byte 進行編程。在這裏我們只簡單的講解如何對STM8S內部的數據存儲區域(data memory)進行寫操作、讀操作、擦除操作。

2、存儲架構圖

STM8S內部存儲包括:FLASH程序存儲器(FLASH program memory)和數據EEPROM(DATA EEPROM);

(1)數據EEPROM又包括:

    • 數據存儲區域(DATA MEMORY):指定從地址0x00 4000開始,其中包括 [1 block] 的option byte,數據存儲區域用於存儲應用數據;

(2)FLASH程序存儲器又包括:

    • 用戶啟動區域(USER BOOT CODE):指定從地址0x00 8000開始,其中包括UBC option bytes和 [128 byte] 的中斷矢量(interrupt vectors);
    • 程序存儲區域(MAIN PROGRAM):用於存儲應用程序代碼;

技術分享

  所以我們的操作是在DATA MEMORY裏面,在該區域的指定地址進行讀取內容、寫入內容、擦除內容。

3、操作方法

(1)FLASH_ReadByte( ADDRESS ):讀取地址ADDRESS處的1字節內容

(2)FLASH_ProgramByte( ADDRESS , DATA ):寫1字節的內容到地址ADDRESS處

(3)FLASH_EraseByte( ADDRESS ):在地址ADDRESS處刪除1字節的內容

4、操作步驟

使用操作前的配置

(1)配置選擇編程時間,選擇標準模式;

(2)解除數據存儲區域的寫保護;

說明:UBC和DATA MEMORY都有寫保護,其中UBC的寫保護是永遠無法解鎖的,而DATA MEMORY的寫保護是可以通過連續寫入兩個MASS密鑰值來解除該區域的寫保護的;第一個密鑰為0x56,第二個密鑰為0xAE;只有當兩個密鑰輸入正確(輸入到寄存器FLASH_DUKR中)且輸入密鑰的先後順序正確時,才會解除寫保護;否則該區域在下一次系統復位之前都將一直保持寫保護狀態。

(3)讀取、寫入、擦除等操作;

5、代碼實現

技術分享
 1 /* Includes ------------------------------------------------------------------*/
 2 #include "stm8s.h"
 3 
 4 /* Private typedef -----------------------------------------------------------*/
 5 typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;
 6 
 7 /* Private variables ---------------------------------------------------------*/
 8 __IO TestStatus OperationStatus;
 9 
10 
11 /**
12   * @brief How to Read / Write / Erase one Byte on FLASH memory.
13   * @par   Examples description
14   *        - Read one byte at address 0x40A5
15   *        - Write its complement value at address + 1
16   *        - Check programed value
17   *        - Erase 2 byte (address 40A5 & 40A6)
18   *        - Check the 2 bytes value is 0x00.
19   * @param  None
20   * @retval None
21   */
22 void main(void)
23 {
24 
25     uint8_t val = 0x00, val_comp = 0x00;
26     uint32_t add = 0x00;
27 
28     /* Define FLASH programming time */
29         //Standard programming time fixed at 1/2 tprog
30     FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
31 
32     /* Unlock Data memory */
33         //compare to two hardware key value: 0x56 and 0xAE
34     FLASH_Unlock(FLASH_MEMTYPE_DATA); 
35 
36     /* Read a byte at a specified address */
37     add = 0x40A5;
38         //read one byte from the address
39     val = FLASH_ReadByte(add); 
40 
41     /* Program complement value (of previous read byte) at previous address + 1 */
42     val_comp = (uint8_t)(~val);
43         //modify one byte at the address
44     FLASH_ProgramByte((add + 1), val_comp); 
45 
46     /* Check program action */
47     val = FLASH_ReadByte((add + 1));
48     if (val != val_comp)
49     {
50         /* Error */
51         OperationStatus = FAILED;
52         /* OperationStatus = PASSED, if the data written/read to/from DATA EEPROM memory is correct */
53         /* OperationStatus = FAILED, if the data written/read to/from DATA EEPROM memory is corrupted */
54         while (1)
55         {
56         }
57     }
58 
59     /* Erase byte at a specified address & address + 1 */
60         //erase one byte at the address
61     FLASH_EraseByte(add);
62     FLASH_EraseByte((add + 1));
63     /* Erase action */
64     val = FLASH_ReadByte(add);
65     val_comp = FLASH_ReadByte((add + 1));
66     if ((val != 0x00) & (val_comp != 0x00))
67     {
68         /* Error */
69         OperationStatus = FAILED;
70         /* OperationStatus = PASSED, if the data written/read to/from DATA EEPROM memory is correct */
71         /* OperationStatus = FAILED, if the data written/read to/from DATA EEPROM memory is corrupted */
72         while (1)
73         {
74         }
75     }
76 
77     /* Pass */
78     OperationStatus = PASSED;
79     /* OperationStatus = PASSED, if the data written/read to/from DATA EEPROM memory is correct */
80     /* OperationStatus = FAILED, if the data written/read to/from DATA EEPROM memory is corrupted */
81     while (1)
82     {
83     }
84 }
FLASH

Flash program memory and data EEPROM