FLASH.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. //////////////////////////////////////////////////////////////////////////////////
  2. //文件名:FU6813_FLASH.c //
  3. //说明:FU6812系列芯片的DAM底层驱动 //
  4. //Log //
  5. //Timer Writer Thing Ver //
  6. //2018-06-07 Any 优化、重做 V1.8//
  7. //////////////////////////////////////////////////////////////////////////////////
  8. #include <FLASH.h>
  9. /**
  10. * 预编程一个FLASH扇区
  11. *
  12. * @param FlashAddress 要擦除的扇区内的任一地址
  13. * @return 执行结果:
  14. * FLASH_FAIL_FROZEN FLASH操作被冻结
  15. * FLASH_FAIL_UNLOCK FLASH编程未解锁
  16. * FLASH_FAIL_ERASE FLASH擦除失败
  17. * FLASH_SUCCESS FLASH操作成功
  18. */
  19. uint8 PreProgram_Flash(uint16 FlashAddress)
  20. {
  21. bool bEA;
  22. bEA = EA;
  23. EA = 0; //关闭总中断
  24. if (FlashAddress <= 0x7f00)
  25. {
  26. FLA_CR = FLAEN | FLAPRE; //扇区预编程使能
  27. FLA_KEY = 0x5a;
  28. FLA_KEY = 0x1f; //FLASH解锁
  29. if(ReadBit(RST_SR,RSTFED) == RSTFED)
  30. {
  31. GP10 = 0;
  32. GP11 = 1;
  33. }
  34. if ((FLA_KEY & (FLAKSTA0 | FLAKSTA1)) == FLAKSTA1) //检测FLASH是否被冻结
  35. {
  36. EA = bEA; //恢复总中断
  37. return FLASH_FAIL_FROZEN;
  38. }
  39. *(uint8 xdata *)FlashAddress = 0xff; //写任意数据
  40. FLA_CR = FLAACT; //开始预编程,完成后FLASH再次上锁
  41. }
  42. EA = bEA; //恢复总中断
  43. if(ReadBit(FLA_CR, FLAERR)) return FLASH_FAIL_ERASE; //读取操作结果
  44. return FLASH_SUCCESS;
  45. }
  46. /**
  47. * 擦除一个FLASH扇区
  48. *
  49. * @param FlashAddress 要擦除的扇区内的任一地址
  50. * @return 执行结果:
  51. * FLASH_FAIL_FROZEN FLASH操作被冻结
  52. * FLASH_FAIL_UNLOCK FLASH编程未解锁
  53. * FLASH_FAIL_ERASE FLASH擦除失败
  54. * FLASH_SUCCESS FLASH操作成功
  55. */
  56. uint8 Erase_Flash(uint16 FlashAddress)
  57. {
  58. bool bEA;
  59. bEA = EA;
  60. EA = 0; //关闭总中断
  61. if (FlashAddress <= 0x7f00)
  62. {
  63. FLA_CR = FLAEN | FLAERS; //扇区擦除使能
  64. FLA_KEY = 0x5a;
  65. FLA_KEY = 0x1f; //FLASH解锁
  66. if(ReadBit(RST_SR,RSTFED) == RSTFED)
  67. {
  68. GP10 = 0;
  69. GP11 = 1;
  70. }
  71. if ((FLA_KEY & (FLAKSTA0 | FLAKSTA1)) == FLAKSTA1) //检测FLASH是否被冻结
  72. {
  73. EA = bEA; //恢复总中断
  74. return FLASH_FAIL_FROZEN;
  75. }
  76. *(uint8 xdata *)FlashAddress = 0xff; //写任意数据
  77. FLA_CR = FLAACT; //开始擦除,完成后FLASH再次上锁
  78. }
  79. EA = bEA; //恢复总中断
  80. if(ReadBit(FLA_CR, FLAERR)) return FLASH_FAIL_ERASE; //读取操作结果
  81. return FLASH_SUCCESS;
  82. }
  83. /**
  84. * 单字节写FLASH
  85. *
  86. * @param FlashAddress 要操作的FLASH地址
  87. * @param FlashData 要写入的数据
  88. * @return 执行结果:
  89. * FLASH_FAIL_FROZEN FLASH操作被冻结
  90. * FLASH_FAIL_UNLOCK FLASH编程未解锁
  91. * FLASH_FAIL_WRITE FLASH写入失败
  92. * FLASH_SUCCESS FLASH操作成功
  93. */
  94. uint8 WriteByte_Flash(uint16 FlashAddress, uint8 FlashData)
  95. {
  96. bool bEA;
  97. bEA = EA;
  98. EA = 0; //关闭总中断
  99. if (FlashAddress <= 0x7f00)
  100. {
  101. FLA_CR = FLAEN; //使能写入
  102. FLA_KEY = 0x5a;
  103. FLA_KEY = 0x1f; //FLASH预编程解锁
  104. if ((FLA_KEY & (FLAKSTA0 | FLAKSTA1)) == FLAKSTA1) //检测FLASH是否被冻结
  105. {
  106. EA = bEA; //恢复总中断
  107. return FLASH_FAIL_FROZEN;
  108. }
  109. *(uint8 xdata *)FlashAddress = FlashData; //写任意数据
  110. FLA_CR = FLAACT; //开始预编程,完成后FLASH再次上锁
  111. }
  112. EA = bEA; //恢复总中断
  113. if(ReadBit(FLA_CR, FLAERR)) return FLASH_FAIL_WRITE; //读取操作结果
  114. return FLASH_SUCCESS;
  115. }
  116. /**
  117. * 向FLASH写数据
  118. *
  119. * @param FlashAddress 要操作的FLASH地址
  120. * @param FlashData 要写入的数据
  121. * @return 执行结果:
  122. * FLASH_FAIL_FROZEN FLASH操作被冻结
  123. * FLASH_FAIL_UNLOCK FLASH编程未解锁
  124. * FLASH_FAIL_WRITE FLASH写入失败
  125. * FLASH_SUCCESS FLASH操作成功
  126. */
  127. uint8 Write_Flash(uint16 FlashAddress, uint8* FlashData, uint16 sizes)
  128. {
  129. bool bEA;
  130. uint8 WriteByte;
  131. bEA = EA;
  132. EA = 0; //关闭总中断
  133. while (sizes)
  134. {
  135. if (FlashAddress <= 0x7f00)
  136. {
  137. WriteByte = *FlashData;
  138. FLA_CR = FLAEN;
  139. FLA_KEY = 0x5a;
  140. FLA_KEY = 0x1f;
  141. if ((FLA_KEY & (FLAKSTA0 | FLAKSTA1)) == FLAKSTA1)
  142. {
  143. EA = bEA; //恢复总中断
  144. return FLASH_FAIL_FROZEN;
  145. }
  146. *(uint8 xdata *)FlashAddress = WriteByte;
  147. FLA_CR = FLAACT;
  148. if(ReadBit(FLA_CR, FLAERR))
  149. {
  150. EA = bEA; //恢复总中断
  151. return FLASH_FAIL_WRITE;
  152. }
  153. }
  154. FlashAddress++;
  155. FlashData++;
  156. sizes--;
  157. }
  158. EA = bEA; //恢复总中断
  159. return FLASH_SUCCESS;
  160. }
  161. /**
  162. * 读取指定FLASH地址的内容
  163. *
  164. * @param FlashAddress 要读取的FLASH的地址
  165. * @return 该地址的内容
  166. */
  167. uint8 Read_Flash(uint16 FlashAddress)
  168. {
  169. return *(uint8 code *)FlashAddress;
  170. }