您的位置 首页 系统

Freescale 9S12 系列单片机使用笔记(EETS4K模块) 1

EETS4K模块应用笔记(1)9S12系列单片机的通常包含4KB的EEPROM。Freescale将EEPROM模块称之为EETS4K。实际上,这里所谓的EEPROM其实是FLASH…

EETS4K模块使用笔记(1)

9S12系列单片机的一般包括4KB的EEPROM。Freescale将EEPROM模块称之为EETS4K。实际上,这儿所谓的EEPROM其实是FLASH,只不过Freescale特意将这儿Flash的sector做的很小(4Bytes),使得用户用起来像是在用EEPROM。

EEPROM是直接映射到9S12单片机的地址空间的,假如程序中仅仅读取EEPROM中的内容,而不涉及到对EEPROM中数据的修正。那就不需求特别的编程。就像读取RAM数据那样直接拜访就能够了。

只有当需求在程序中更新EEPROM中内容时,才需求学习下面的内容。

初始化EETS4K

在向EETS4K写入数据或擦除数据前要先装备EETS4K的时钟。EETS4K的时钟频率必须在150KHz——200KHz之间,为此需求装备ECLKDIV寄存器。

ECLKDIV寄存器(EEPROMClockDividerRegister)

图1ECLKDIV寄存器

PRDIV8是预分频位:当PRDIV8=1时输入时钟被预分频为1/8。

EDIV5——EDIV8为分频除数寄存器,最多能够发生1/64的分频比。简略的核算可知,当输入时钟大于12.8MHz时需求将PRDIV8置位。

通过PRDIV8和EDIV两级分频最多可将时钟频率分为1/512。

擦除和写入和读取

这儿不详细介绍每一个寄存器的用法。只对需求留意的当地加以阐明。

EETS4K模块的最小擦除单位是4Bytes,EETS4K模块供给了两条相关指令,一条是擦除一个sector,也便是4字节,而且要求是字节对其的双字。另一条指令擦除悉数EEPROM空间。

每次编程(写入)单位为两个字节。而且这两个字节要是对其字。

当EETS4K模块正在进行擦除或编程操作时是不能一起读取EEPROM中内容的。

有了这些介绍就够了。下面给出一个详细的比如。

  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. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/264177.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部