FLASH.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /* --------------------------- (C) COPYRIGHT 2021 Fortiortech ShenZhen -----------------------------
  2. File Name : FLASH.c
  3. Author : Fortiortech Appliction Team
  4. Version : V1.0
  5. Date : 2021-07-24
  6. Description : This file contains FLASH function used for Motor Control.
  7. ----------------------------------------------------------------------------------------------------
  8. All Rights Reserved
  9. ------------------------------------------------------------------------------------------------- */
  10. /******************************************************************************///Including Header Files
  11. #include <Flash.h>
  12. /* -------------------------------------------------------------------------------------------------
  13. Function Name : Flash_Sector_Erase
  14. Description : 扇区自擦除: 指定将要擦除的Flash扇区,每个扇区128Byte,共128个扇区,扇区0~127对应Flash地址0x0000~0x3fff,
  15. 通过指定Flash地址来指定要擦除的Flash地址所在扇区。
  16. 一次只能擦除一个扇区,自擦除数据为任意值,一定要在解锁后才给DPTR赋值。
  17. Date : 2021-07-23
  18. Parameter : FlashAddress: [输入/出]
  19. ------------------------------------------------------------------------------------------------- */
  20. void Flash_Sector_Erase(uint8 xdata *FlashAddress)
  21. {
  22. EA = 0; //Flash自擦除前先关总中断
  23. FLA_CR = 0x03; //使能自擦除
  24. FLA_KEY = 0x5a;
  25. FLA_KEY = 0x1f; //flash预编程解锁
  26. *FlashAddress = 0xff; //写任意数据
  27. FLA_CR = 0x08; //开始预编程,完成后Flash再次上锁
  28. }
  29. /* -------------------------------------------------------------------------------------------------
  30. Function Name : Flash_Sector_Write
  31. Description : Flash自烧写: 对扇区预编程和自擦除后,可以对扇区内的地址进行Flash烧写,
  32. 一次烧写一个byte,一定要在解锁后才给DPTR赋值
  33. Date : 2021-07-23
  34. Parameter : FlashAddress: [输入/出]
  35. ------------------------------------------------------------------------------------------------- */
  36. void Flash_Sector_Write(uint8 xdata *FlashAddress, uint8 FlashData)
  37. {
  38. EA = 0; //Flash自烧写前先关总中断
  39. FLA_CR = 0x01; // 使能Flash编程
  40. FLA_KEY = 0x5a;
  41. FLA_KEY = 0x1f; // flash预编程解锁
  42. *FlashAddress =FlashData; // 写编程数据
  43. FLA_CR = 0x08; // 开始预编程,完成后Flash再次上锁
  44. }
  45. MCUFlash xdata FlashTest; //flash测试
  46. /* -------------------------------------------------------------------------------------------------
  47. Function Name : void WriteData2Flash(uint8 xdata *BlockStartAddr,uint16 NewData2Flash)
  48. Description : 从目标FLASH扇区读取2字节最新写入的数据。Input: uint8 xdata *BlockStartAddr:目标FLASH扇区
  49. Output: 读出的数据
  50. Date : 2021-07-23
  51. Parameter : None
  52. ------------------------------------------------------------------------------------------------- */
  53. uint16 Get2ByteFromFlash(uint8 xdata *BlockStartAddr)
  54. {
  55. uint8 xdata *FlashStartAddr = BlockStartAddr;
  56. uint8 i;
  57. uint16 tempofFlashData;
  58. for(i=0;i<64;i++)
  59. {
  60. tempofFlashData = *(uint16 code *)(FlashStartAddr+2*i);
  61. if(tempofFlashData==0)
  62. {
  63. if(i!=0)
  64. {
  65. tempofFlashData = *(uint16 code *)(FlashStartAddr+2*(i-1));
  66. return tempofFlashData;
  67. }
  68. else
  69. {
  70. return 0;
  71. }
  72. }
  73. else
  74. {
  75. if(i==63)
  76. {
  77. return tempofFlashData;
  78. }
  79. }
  80. }
  81. return 1;
  82. }
  83. /* -------------------------------------------------------------------------------------------------
  84. Function Name : void WriteData2Flash(uint8 xdata *BlockStartAddr,uint16 NewData2Flash)
  85. Description : 写入2个字节到FLASH。其中Input:uint8 xdata *BlockStartAddr:目标FLASH地址 NewData2Flash:被写入数据
  86. Output:1:扇区未满,写入完成 0:扇区已满,写入失败
  87. Date : 2021-07-23
  88. Parameter : None
  89. ------------------------------------------------------------------------------------------------- */
  90. uint8 Write2Byte2Flash(uint8 xdata *BlockStartAddr,uint16 NewData2Flash)
  91. {
  92. uint8 xdata *FlashStartAddr = BlockStartAddr;
  93. uint16 tempofFlashData=0;
  94. uint16 tempofNewFlashData=0;
  95. uint8 i;
  96. tempofNewFlashData = NewData2Flash;
  97. for(i=0;i<64;i++)
  98. {
  99. tempofFlashData = *(uint16 code *)(FlashStartAddr+2*i);
  100. if(tempofFlashData==0)
  101. {
  102. tempofFlashData = tempofNewFlashData>>8; //待写入数据首字节
  103. Flash_Sector_Write((FlashStartAddr+2*i),(uint8)tempofFlashData);
  104. tempofFlashData = tempofNewFlashData&0x00ff; //待写入数据末字节
  105. Flash_Sector_Write((FlashStartAddr+2*i+1),(uint8)tempofFlashData);
  106. return 1;
  107. }
  108. else
  109. {
  110. if(i==63)
  111. {
  112. return 0;
  113. }
  114. }
  115. }
  116. return 0;
  117. }
  118. /* -------------------------------------------------------------------------------------------------
  119. Function Name : void WriteOrReadFlashTest(uint8 xdata *BlockStartAddr,uint16 NewData2Flash)
  120. Description :FLASH读写数据测试,先把NewData2Flash写入到目标FLASH地址BlockStartAddr后,再将其FLASH值读出来。
  121. uint8 xdata *BlockStartAddr:目标FLASH地址 NewData2Flash:被写入数据
  122. Date : 2021-07-23
  123. Parameter : None
  124. ------------------------------------------------------------------------------------------------- */
  125. uint8 FlashWriteStatus=0;
  126. void WriteOrReadFlashTest(uint8 xdata *BlockStartAddr,uint16 NewData2Flash)
  127. {
  128. // if(FlashTest.FlashWrite)
  129. // {
  130. // FlashWriteStatus = Write2Byte2Flash(BlockStartAddr,NewData2Flash);
  131. //
  132. // if(!FlashWriteStatus)
  133. // {
  134. // Flash_Sector_Erase(BlockStartAddr);
  135. // FlashWriteStatus = Write2Byte2Flash(BlockStartAddr,NewData2Flash);
  136. // }
  137. //
  138. // FlashTest.FlashWrite = 0;
  139. FlashTest.FlashRead = 1;
  140. // }
  141. if(FlashTest.FlashRead)
  142. {
  143. FlashTest.FlashRead2Byte = Get2ByteFromFlash(BlockStartAddr);
  144. FlashTest.FlashRead = 0;
  145. }
  146. }