久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> STM32 >> 瀏覽文章

STM8S單片機的內部eeprom編程

作者:羊村長   來源:羊村長   點擊數:  更新時間:2014年08月03日   【字體:

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

當然如果有外部EEPROM,自然是不會使用到內部的EEPROM的。但小東西也有大用途,例如做無線應用時,減少成本的情況下,還能保存一些特定設置,如:休眠時間,工作頻率,輸出功率,密碼等。
EEPROM3種編程模式:
 字節編程 (沒有擦除操作)
可對 EEPROM的數據區域進行逐字地編程。應用程序直接向目標地址寫入數據。
 字編程
 EEPROM允許字編程(一次編程4個字節),從而縮短EEPROM的編程時間。
 塊編程 (沒有擦除操作)
   EEPROM塊編程操作允許一次對整個塊(64個字節)進行編程,整個塊在編程前被自動擦除。但塊編程操作一定要在RAM中運行。
下面以字節編程進行講解:
實驗平臺:stm8s103k3 + stlink
在stm8s_flash.h中:
#if defined (STM8S103) || defined(STM8S903)
 #define FLASH_PROG_END_PHYSICAL_ADDRESS   ((uint32_t)0x9FFF)  
 #define FLASH_PROG_BLOCKS_NUMBER          ((uint16_t)128)     
 #define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000)
 #define FLASH_DATA_END_PHYSICAL_ADDRESS   ((uint32_t)0x00427F)
 #define FLASH_DATA_BLOCKS_NUMBER          ((uint16_t)10)      
 #define FLASH_BLOCK_SIZE                  ((uint8_t)64)       
#endif
從這里可以看出,eeprom的地址為0x004000~0x00427F,這段地址分為10個Block,每個Block有64個Byte,總容量為640Byte.
關于2個秘鑰在stm8s_flash.h中已經定義:
#define FLASH_RASS_KEY1 ((uint8_t)0x56)
#define FLASH_RASS_KEY2 ((uint8_t)0xAE)
      中文數據手冊上KEY1和KEY2的定義與代碼一致,但是英文數據手冊上KEY1為0x56和KEY1為)0XAE.暫且不討論誰搞反了,以代碼為準吧!
首先要初始化EEPROM:
我們在eeprom.h中定義:
typedef enum{
  #if defined(STM8S103) || defined(STM8S003) ||  defined(STM8S903)
  Block_0=0x4000,
  Block_1=0x4040,
  Block_2=0x4080,
  Block_3=0x40C0,
  Block_4=0x4100,
  Block_5=0x4140,
  Block_6=0x4180,
  Block_7=0x41C0,
  Block_8=0x4200,
  Block_9=0x4240
  #endif
}BlockStartAddress_TypeDef; //分塊存數,方便讀寫操作!
在eeprom.c中初始化:
初始化操作步驟:
1. 設定編程時間。FIX=1為標準編程時間(一般一次編程時間為6ms)。如果EEPROM被擦除過并且FIX=0,那么變成時間為標準編程時間的一半(一般為3ms)。
2. 向FLASH_DUKR寄存器連續寫入兩個MASS密鑰值來解除DATA區域的寫保護。
第一個硬件密鑰:0b0101 0110 (0x56)
第二個硬件密鑰:0b1010 1110 (0xAE)
如果第二個秘鑰匹配正確,FLASH_IAPSR的DUL位自動置位。
3. 等待DATA EEPROM區解鎖。
void EEPROM_Init()
{
  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_TPROG);
  // 注意順序: FLASH_DUKR = 0xAE為Key2 ,FLASH_DUKR = 0x56;為Key1
   FLASH_Unlock( FLASH_MEMTYPE_DATA);
   //如果第二個秘鑰正確,FLASH_IAPSR_DUL=1;
   //直到FLASH_IAPSR_DUL由硬件置位,才跳出while循環
  while((FLASH->IAPSR & FLASH_IAPSR_DUL) == 0);//等待DATA EEPROM區解鎖
}
 
FLASH_Unlock函數原型在stm8s_flash.c中:
void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType)
{
    assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType));
    if (FLASH_MemType == FLASH_MEMTYPE_PROG)
    {
        FLASH->PUKR = FLASH_RASS_KEY1;
        FLASH->PUKR = FLASH_RASS_KEY2;
    }
    else
    {
        FLASH->DUKR = FLASH_RASS_KEY2;
        FLASH->DUKR = FLASH_RASS_KEY1;
    }
}
在main.c中,你就可以進行擦除,讀,寫操作了!
  FLASH_EraseByte(uint32_t Address);  // 擦除某地址的一個字節
  FLASH_ProgramByte(0x4001,0x08); //寫入一個字節
  while((FLASH_IAPSR & 0x04) != 0x00);   //直到EOP=1,EEPROM編程結束
  Rdat= FLASH_ReadByte(0x4000);   // 讀出某地址的一個字節
關閉窗口

相關文章

主站蜘蛛池模板: 成人精品高清 | 国产精品99视频 | 久久www免费人成看片高清 | 国产一伦一伦一伦 | 一区二区三区精品视频 | 91精品国产91久久久久久最新 | 国产综合精品一区二区三区 | 欧美一区二区三区大片 | 久久在线 | 欧美日韩亚洲视频 | 七七婷婷婷婷精品国产 | 日韩在线免费电影 | 在线成人免费观看 | 91.com视频 | 视频在线一区 | 51ⅴ精品国产91久久久久久 | 免费人成激情视频在线观看冫 | 精品国产乱码久久久久久闺蜜 | 99精品欧美一区二区三区 | 成人午夜免费在线视频 | 一级片在线观看 | 亚洲五码久久 | 日本手机看片 | 成人免费一区二区三区牛牛 | 国产精品久久久久久久久久免费 | 久久精品免费 | 日韩在线h | 中文字幕av网 | 久久精品久久精品久久精品 | 午夜视频在线免费观看 | av免费网站在线观看 | 久久国产精品久久久久久 | 亚洲成av人片在线观看 | 五月天婷婷狠狠 | 欧美国产日韩一区 | 久久51 | 四虎伊人 | 国产视频二区在线观看 | 久久国产精品免费一区二区三区 | 国产成人免费视频 | 99精品网|