flash.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "Flash.h"
  2. #include "Uart.h"
  3. /********************************
  4. * @brief OTA参数初始化
  5. * @retval FLASH_COMPLETE初始成功
  6. ********************************/
  7. uint8_t Flash_RangeErase(uint32_t FlashAddress, uint32_t Size)
  8. {
  9. uint8_t flag = 1;
  10. uint32_t msize=0;
  11. fmc_state_enum FlashStatus = FMC_READY;
  12. while(Size > msize) {
  13. fmc_unlock();/* 解锁flash */
  14. fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
  15. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
  16. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
  17. FlashStatus = fmc_page_erase(FlashAddress+msize);//擦除指定的页,参数页地址
  18. fmc_lock();/* flash加锁,禁止编程 */
  19. /* If erase operation was failed, a Flash error code is returned */
  20. if (FlashStatus != FMC_READY) {
  21. flag = 0;
  22. break;
  23. }
  24. msize += FLASH_PAGE_SIZE;
  25. }
  26. return flag;
  27. }
  28. uint8_t Flash_PageErase(uint8_t _PageNumber)
  29. {
  30. uint8_t flag = 0;
  31. if(_PageNumber > 127)
  32. return 0;
  33. fmc_unlock();/* 解锁flash */
  34. fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
  35. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
  36. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
  37. if( fmc_page_erase(FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber)) == FMC_READY )
  38. {
  39. flag = 1;
  40. }
  41. fmc_lock();/* flash加锁,禁止编程 */ // Lock the Flash to disable the flash control register access
  42. return flag;
  43. }
  44. uint8_t Flash_BufferWrite(uint32_t address, uint32_t *p_buffer, uint32_t len)
  45. {
  46. uint8_t flag = 1;
  47. uint32_t EndAddr = 0;
  48. //uint32_t *p_buffer = (uint32_t *)buffer;
  49. if(address%4||len%4) {
  50. return 0;
  51. }
  52. fmc_unlock();/* 解锁flash */
  53. fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
  54. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
  55. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
  56. EndAddr = address + len;
  57. while (address < EndAddr) {
  58. if (fmc_word_program(address, *p_buffer) == FMC_READY) {
  59. p_buffer++;
  60. address += 4;
  61. } else {
  62. flag = 0;// Error occurred while writing data in Flash memory.
  63. break;
  64. }
  65. }
  66. fmc_lock();/* flash加锁,禁止编程 */
  67. return flag;
  68. }
  69. uint8_t Flash_BufferWrite_uint16(uint32_t address, uint16_t *p_buffer, uint32_t len)
  70. {
  71. uint8_t flag = 1;
  72. uint32_t EndAddr = 0;
  73. fmc_unlock();/* 解锁flash */
  74. fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
  75. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
  76. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
  77. EndAddr = address + len;
  78. while (address < EndAddr) {
  79. if (fmc_halfword_program(address, *p_buffer) == FMC_READY) {
  80. p_buffer++;
  81. address += 2;
  82. } else {
  83. flag = 0;// Error occurred while writing data in Flash memory.
  84. break;
  85. }
  86. }
  87. fmc_lock();/* flash加锁,禁止编程 */
  88. return flag;
  89. }
  90. void Flash_BufferRead(uint32_t address, uint8_t *buffer, uint32_t len)
  91. {
  92. uint32_t EndAddr = 0;
  93. uint8_t *p_buffer = (uint8_t *)buffer;
  94. // if(address%4||len%4) {
  95. // return ;
  96. // }
  97. fmc_unlock();/* 解锁flash */
  98. fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
  99. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
  100. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
  101. EndAddr = address + len;
  102. while (address < EndAddr) {
  103. *p_buffer++ = *(__IO uint8_t *)address;
  104. address += 1;
  105. }
  106. fmc_lock();/* flash加锁,禁止编程 */
  107. }
  108. void Flash_BufferRead_btye4(uint32_t address, uint8_t *buffer, uint32_t len)
  109. {
  110. uint32_t EndAddr = 0;
  111. uint32_t *p_buffer = (uint32_t *)buffer;
  112. if(address%4||len%4) {
  113. return ;
  114. }
  115. fmc_unlock();/* 解锁flash */
  116. fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
  117. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
  118. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
  119. EndAddr = address + len;
  120. while (address < EndAddr) {
  121. *p_buffer++ = *(__IO uint32_t *)address;
  122. address += 4;
  123. }
  124. fmc_lock();/* flash加锁,禁止编程 */
  125. }
  126. //读取flash中有效数据的长度
  127. uint32_t Flash_DatalenRead(uint32_t address,uint32_t len)
  128. {
  129. uint32_t BeginAddr = 0;
  130. uint32_t addrlen = 0;
  131. uint32_t data;
  132. if(address%4||len%4) {
  133. return addrlen;
  134. }
  135. fmc_unlock();/* 解锁flash */
  136. fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
  137. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
  138. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
  139. BeginAddr = address + len - 4;
  140. while(address < BeginAddr)
  141. {
  142. data = *(__IO uint32_t *)BeginAddr;
  143. if(data != 0xFFFFFFFF)
  144. break;
  145. BeginAddr -= 4;
  146. }
  147. fmc_lock();/* flash加锁,禁止编程 */
  148. if(address <= BeginAddr)
  149. {
  150. addrlen = (BeginAddr+4) - address;
  151. }
  152. return addrlen;
  153. }
  154. void flash_test(void)
  155. {
  156. uint8_t data[8] = {11,22,33,45,100,23,67,89};
  157. uint8_t i = 0,outda[8] = {0};
  158. printf("eraser flash one page 0x8018000\r\n");
  159. Flash_RangeErase(0x8018000,2048);
  160. printf("write flash 0x8018000\r\n");
  161. Flash_BufferWrite(0x8018000,(uint32_t*)data,8);//正常的flash 写入
  162. printf("read flash 0x8018000\r\n");
  163. Flash_BufferRead(0x8018000,outda,8);//数据存入到outda中
  164. for(i=0;i<8;i++){
  165. printf("%d, ",outda[i]);
  166. }
  167. printf("\r\n");
  168. Flash_RangeErase(0x8018000,2048);
  169. printf("eraser flash and test finish\r\n");
  170. }