<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Freescale 9S12 系列單片機應用筆記(EETS4K模塊) 1

Freescale 9S12 系列單片機應用筆記(EETS4K模塊) 1

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏

EETS4K模塊應用筆記(1)

9S12系列單片機的通常包含4KB的EEPROM。Freescale將EEPROM模塊稱(chēng)之為EETS4K。實(shí)際上,這里所謂的EEPROM其實(shí)是FLASH,只不過(guò)Freescale特意將這里Flash的sector做的很?。?Bytes),使得用戶(hù)用起來(lái)像是在用EEPROM。

本文引用地址:http://dyxdggzs.com/article/201611/318821.htm

EEPROM是直接映射到9S12單片機的地址空間的,如果程序中只是讀取EEPROM中的內容,而不涉及到對EEPROM中數據的修改。那就不需要特殊的編程。就像讀取RAM數據那樣直接訪(fǎng)問(wèn)就可以了。

只有當需要在程序中更新EEPROM中內容時(shí),才需要學(xué)習下面的內容。

初始化EETS4K

在向EETS4K寫(xiě)入數據或擦除數據前要先配置EETS4K的時(shí)鐘。EETS4K的時(shí)鐘頻率必須在150KHz——200KHz之間,為此需要配置ECLKDIV寄存器。

ECLKDIV寄存器(EEPROMClockDividerRegister)

圖1ECLKDIV寄存器

PRDIV8是預分頻位:當PRDIV8=1時(shí)輸入時(shí)鐘被預分頻為1/8。

EDIV5——EDIV8為分頻除數寄存器,最多可以產(chǎn)生1/64的分頻比。簡(jiǎn)單的計算可知,當輸入時(shí)鐘大于12.8MHz時(shí)需要將PRDIV8置位。

經(jīng)過(guò)PRDIV8和EDIV兩級分頻最多可將時(shí)鐘頻率分為1/512。

擦除和寫(xiě)入和讀取

這里不詳細介紹每一個(gè)寄存器的用法。只對需要注意的地方加以說(shuō)明。

EETS4K模塊的最小擦除單位是4Bytes,EETS4K模塊提供了兩條相關(guān)命令,一條是擦除一個(gè)sector,也就是4字節,并且要求是字節對其的雙字。另一條命令擦除全部EEPROM空間。

每次編程(寫(xiě)入)單位為兩個(gè)字節。并且這兩個(gè)字節要是對其字。

當EETS4K模塊正在進(jìn)行擦除或編程操作時(shí)是不能同時(shí)讀取EEPROM中內容的。

有了這些介紹就夠了。下面給出一個(gè)具體的例子。


  1. /*EETS4K.h*/
  2. #ifndefNVM_H
  3. #defineNVM_H
  4. /*
  5. *CONSTANTS
  6. */
  7. #defineNVM_NO_ERR(1)
  8. #defineNVM_ODD_ACCESS_ERR(-1)
  9. #defineNVM_ACCESS_ERR(-2)
  10. #defineNVM_PROTECTION_ERR(-3)
  11. /*
  12. *FUNCTIONPROTOTYPES
  13. */
  14. voidEEPROM_Init(unsignedlongsysclk);
  15. charEEPROM_Write_Word(unsignedintaddress,unsignedintdata);
  16. charEEPROM_Erase_Sector(unsignedintaddress);
  17. charEEPROM_Erase_All(void);
  18. unsignedintEEPROM_Read_Word(unsignedintaddress);
  19. #endif/*Endoffile*/
  1. /*EETS4K.C*/
  2. #include/*commondefinesandmacros*/
  3. #include"derivative.h"/*derivative-specificdefinitions*/
  4. #include"eets4k.h"
  5. /**@briefThisfunctioninitializestheNonVolatileEEPROMcontrolregisters
  6. *andmustbecalledbeforeattemptingtowriteoreraseanEEPROMsector.
  7. *
  8. *@parasysclktheCPUclockfrequency(SYSCLK)drivenbytheonboardoscillatororthePLLifenabled.
  9. */
  10. voidEEPROM_Init(unsignedlongsysclk)
  11. {
  12. unsignedchareclk_val;
  13. if(sysclk>=12000){/*IftheSYSCLKis>12MHz,thensetFDIV8bit*/
  14. eclk_val=(sysclk/(8*200))-1;/*Computethecorrectdividervalue*/
  15. ECLKDIV|=ECLKDIV_PRDIV8_MASK|eclk_val;/*WritetheECLKDIVregisterwiththecorrectsettings*/
  16. }else{
  17. eclk_val=(sysclk/200)-1;/*Computethecorrectdividervalue*/
  18. ECLKDIV|=eclk_val;/*WritetheECLKDIVregisterwiththecorrectsettings*/
  19. }
  20. ESTAT|=(ESTAT_PVIOL_MASK|ESTAT_ACCERR_MASK);/*Clearanyerrorflags*/
  21. }
  22. /**@briefThisfunctionwritesa16-bitwordtoEEPROM
  23. *@paramaddress,thedestinationEEPROMaddresstowritethedata
  24. *@paramdata,thedatatowritetoargumentaddress.
  25. *@return
  26. *NVM_NO_ERR-EEPROMWriteSuccess
  27. *NVM_ODD_ACCESS_ERR-EEPROMWriteError,Addressnotonanevenaddressboundry
  28. *NVM_ACCESS_ERR-EEPROMWriteError,AccessViolation
  29. *NVM_PROTECTION_ERR-EEPROMWriteError,Attemptedtowriteaprotectedsector
  30. */
  31. charEEPROM_Write_Word(unsignedintaddress,unsignedintdata)
  32. {
  33. while(!ESTAT_CBEIF){/*WaitforEEPROMaccesscontrollertobecomeready*/
  34. ;
  35. }
  36. ESTAT=(ESTAT_ACCERR_MASK|ESTAT_PVIOL_MASK);/*Clearexistingerrorflags*/
  37. if(address&0x0001){
  38. return(NVM_ODD_ACCESS_ERR);/*AddressisNOTalignedonanevenboundry?*/
  39. }
  40. (*(unsignedint*)address)=data;/*Writethedatatothespecifiedaddress*/
  41. ECMD=ECMD_CMDB5_MASK;/*StoreprogrammingcommandinFCMD*/
  42. ESTAT_CBEIF=1;/*Executethecommand*/
  43. if(ESTAT_ACCERR){/*Checkiftherehasbeenanaccesserror*/
  44. return(NVM_ACCESS_ERR);/*ReturnanAccessErrorcode*/
  45. }
  46. if(ESTAT_PVIOL){/*Checkiftherehasbeenaprotectionerror*/
  47. return(NVM_PROTECTION_ERR);/*ReturnaProtectionErrorcode*/
  48. }
  49. return(NVM_NO_ERR);/*ReturnNoError*/
  50. }
  51. /**@briefThisfunctionerasesa4-bytesectorofEEPROM
  52. *@paramaddress,thestartofthe4-bytesectortoaddress
  53. *@return
  54. *NVM_NO_ERR-EEPROMWriteSuccess
  55. *NVM_ODD_ACCESS_ERR-EEPROMWriteError,Addressnotonanevenaddressboundry
  56. *NVM_ACCESS_ERR-EEPROMWriteError,AccessViolation
  57. *NVM_PROTECTION_ERR-EEPROMWriteError,Attemptedtowriteaprotectedsector
  58. */
  59. charEEPROM_Erase_Sector(unsignedintaddress)
  60. {
  61. while(!ESTAT_CBEIF){/*WaitforEEPROMaccesscontrollertobecomeready*/
  62. ;
  63. }
  64. ESTAT=(ESTAT_ACCERR_MASK|ESTAT_PVIOL_MASK);/*Clearexistingerrorflags*/
  65. if(address&0x0001){
  66. return(NVM_ODD_ACCESS_ERR);/*AddressisNOTalignedonanevenboundry?*/
  67. }
  68. (*(unsignedint*)address)=0xFFFF;/*Writethedatatothespecifiedaddress*/
  69. ECMD=ECMD_CMDB6_MASK;/*StoreprogrammingcommandinFCMD*/
  70. ESTAT_CBEIF=1;/*Executethecommand*/
  71. if(ESTAT_ACCERR){/*Checkiftherehasbeenanaccesserror*/
  72. return(NVM_ACCESS_ERR);/*ReturnanAccessErrorcode*/
  73. }
  74. if(ESTAT_PVIOL){/*Checkiftherehasbeenaprotectionerror*/
  75. return(NVM_PROTECTION_ERR);/*ReturnaProtectionErrorcode*/
  76. }
  77. return(NVM_NO_ERR);/*ReturnNoError*/
  78. }
  79. charEEPROM_Erase_All(void)
  80. {
  81. while(!ESTAT_CBEIF){/*WaitforEEPROMaccesscontrollertobecomeready*/
  82. ;
  83. }
  84. ESTAT=(ESTAT_ACCERR_MASK|ESTAT_PVIOL_MASK);/*Clearexistingerrorflags*/
  85. (*(unsignedint*)0x0400)=0xFFFF;/*Writethedatatothespecifiedaddress*/
  86. ECMD=0x41;/*StoreprogrammingcommandinFCMD*/
  87. ESTAT_CBEIF=1;/*Executethecommand*/
  88. if(ESTAT_ACCERR){/*Checkiftherehasbeenanaccesserror*/
  89. return(NVM_ACCESS_ERR);/*ReturnanAccessErrorcode*/
  90. }
  91. if(ESTAT_PVIOL){/*Checkiftherehasbeenaprotectionerror*/
  92. return(NVM_PROTECTION_ERR);/*ReturnaProtectionErrorcode*/
  93. }
  94. return(NVM_NO_ERR);/*ReturnNoError*/
  95. }
  96. /**@briefThisfunctionreadsa16-bitwordfromthespecifiedaddressinEEPROM
  97. *@paramaddress,thestartofthe16-bitdatatoread
  98. *@returnThe16-bitwordstoredinlocationaddress
  99. */
  100. unsignedintEEPROM_Read_Word(unsignedintaddress)
  101. {
  102. unsignedintdata;
  103. while(!ESTAT_CBEIF){/*WaitforEEPROMaccesscontrollertobecomeready*/
  104. ;
  105. }
  106. data=(*(unsignedint*)address);/*Readthedataatlocationaddress*/
  107. return(data);/*Returnthedata*/
  108. }



  1. #include/*commondefinesandmacros*/
  2. #include"derivative.h"/*derivative-specificdefinitions*/
  3. #include"sci.h"
  4. #include"eets4k.h"
  5. voidmain(void)
  6. {
  7. unsignedintdata;
  8. EEPROM_Init(16384);
  9. EnableInterrupts;
  10. EEPROM_Erase_All();
  11. EEPROM_Write_Word(0x400,1234);
  12. data=EEPROM_Read_Word(0x400);
  13. for(;;)
  14. {
  15. _FEED_COP();/*feedsthedog*/
  16. }/*loopforever*/
  17. }



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>