欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM8S單片機(jī)的內(nèi)部eeprom編程

作者:羊村長(zhǎng)   來(lái)源:羊村長(zhǎng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月03日   【字體:

    STM8S單片機(jī)芯片內(nèi)部也集成有EEPROM,容量從640字節(jié)到2K字節(jié)。最為特色的是,在STM8單片機(jī)中,對(duì)EEPROM的訪問(wèn)就象常規(guī)的RAM一樣,非常方便。EEPROM的地址空間與內(nèi)存是統(tǒng)一編址的,地址從004000H開(kāi)始,大小根據(jù)不同的芯片型號(hào)而定。

當(dāng)然如果有外部EEPROM,自然是不會(huì)使用到內(nèi)部的EEPROM的。但小東西也有大用途,例如做無(wú)線應(yīng)用時(shí),減少成本的情況下,還能保存一些特定設(shè)置,如:休眠時(shí)間,工作頻率,輸出功率,密碼等。
EEPROM3種編程模式:
 字節(jié)編程 (沒(méi)有擦除操作)
可對(duì) EEPROM的數(shù)據(jù)區(qū)域進(jìn)行逐字地編程。應(yīng)用程序直接向目標(biāo)地址寫(xiě)入數(shù)據(jù)。
 字編程
 EEPROM允許字編程(一次編程4個(gè)字節(jié)),從而縮短EEPROM的編程時(shí)間。
 塊編程 (沒(méi)有擦除操作)
   EEPROM塊編程操作允許一次對(duì)整個(gè)塊(64個(gè)字節(jié))進(jìn)行編程,整個(gè)塊在編程前被自動(dòng)擦除。但塊編程操作一定要在RAM中運(yùn)行。
下面以字節(jié)編程進(jìn)行講解:
實(shí)驗(yàn)平臺(tái):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個(gè)Block,每個(gè)Block有64個(gè)Byte,總?cè)萘繛?40Byte.
關(guān)于2個(gè)秘鑰在stm8s_flash.h中已經(jīng)定義:
#define FLASH_RASS_KEY1 ((uint8_t)0x56)
#define FLASH_RASS_KEY2 ((uint8_t)0xAE)
      中文數(shù)據(jù)手冊(cè)上KEY1和KEY2的定義與代碼一致,但是英文數(shù)據(jù)手冊(cè)上KEY1為0x56和KEY1為)0XAE.暫且不討論誰(shuí)搞反了,以代碼為準(zhǔn)吧!
首先要初始化EEPROM:
我們?cè)趀eprom.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; //分塊存數(shù),方便讀寫(xiě)操作!
在eeprom.c中初始化:
初始化操作步驟:
1. 設(shè)定編程時(shí)間。FIX=1為標(biāo)準(zhǔn)編程時(shí)間(一般一次編程時(shí)間為6ms)。如果EEPROM被擦除過(guò)并且FIX=0,那么變成時(shí)間為標(biāo)準(zhǔn)編程時(shí)間的一半(一般為3ms)。
2. 向FLASH_DUKR寄存器連續(xù)寫(xiě)入兩個(gè)MASS密鑰值來(lái)解除DATA區(qū)域的寫(xiě)保護(hù)。
第一個(gè)硬件密鑰:0b0101 0110 (0x56)
第二個(gè)硬件密鑰:0b1010 1110 (0xAE)
如果第二個(gè)秘鑰匹配正確,F(xiàn)LASH_IAPSR的DUL位自動(dòng)置位。
3. 等待DATA EEPROM區(qū)解鎖。
void EEPROM_Init()
{
  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_TPROG);
  // 注意順序: FLASH_DUKR = 0xAE為Key2 ,F(xiàn)LASH_DUKR = 0x56;為Key1
   FLASH_Unlock( FLASH_MEMTYPE_DATA);
   //如果第二個(gè)秘鑰正確,F(xiàn)LASH_IAPSR_DUL=1;
   //直到FLASH_IAPSR_DUL由硬件置位,才跳出while循環(huán)
  while((FLASH->IAPSR & FLASH_IAPSR_DUL) == 0);//等待DATA EEPROM區(qū)解鎖
}
 
FLASH_Unlock函數(shù)原型在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中,你就可以進(jìn)行擦除,讀,寫(xiě)操作了!
  FLASH_EraseByte(uint32_t Address);  // 擦除某地址的一個(gè)字節(jié)
  FLASH_ProgramByte(0x4001,0x08); //寫(xiě)入一個(gè)字節(jié)
  while((FLASH_IAPSR & 0x04) != 0x00);   //直到EOP=1,EEPROM編程結(jié)束
  Rdat= FLASH_ReadByte(0x4000);   // 讀出某地址的一個(gè)字節(jié)
關(guān)閉窗口

相關(guān)文章