Flash.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #include "Flash.h"
  2. /********************************
  3. * @brief OTA꽝鑒놓迦뺏
  4. * @retval FLASH_COMPLETE놓迦냥묘
  5. ********************************/
  6. uint8_t Flash_RangeErase(uint32_t FlashAddress, uint32_t Size)
  7. {
  8. uint8_t flag = 1;
  9. uint32_t msize=0;
  10. fmc_state_enum FlashStatus = FMC_READY;
  11. while(Size > msize) {
  12. fmc_unlock();/* 썩傑flash */
  13. fmc_flag_clear(FMC_FLAG_BANK0_END);//헌뇜꾸鱗써監깃羚
  14. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//헌뇜꼰뇜/댄轎깃羚
  15. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//헌뇝女긍넋댄轎깃羚
  16. FlashStatus = fmc_page_erase(FlashAddress+msize);//꼰뇜寧땍돨女,꽝鑒女뒈囹
  17. fmc_lock();/* flash속傑,쐐岺긍넋 */
  18. /* If erase operation was failed, a Flash error code is returned */
  19. if (FlashStatus != FMC_READY) {
  20. flag = 0;
  21. break;
  22. }
  23. msize += FLASH_PAGE_SIZE;
  24. }
  25. return flag;
  26. }
  27. #if 1
  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. }
  64. }
  65. fmc_lock();/* flash속傑,쐐岺긍넋 */
  66. return flag;
  67. }
  68. void Flash_BufferRead(uint32_t address, uint8_t *buffer, uint32_t len)
  69. {
  70. uint32_t EndAddr = 0;
  71. uint32_t *p_buffer = (uint32_t *)buffer;
  72. if(address%4||len%4) {
  73. return ;
  74. }
  75. fmc_unlock();/* 썩傑flash */
  76. fmc_flag_clear(FMC_FLAG_BANK0_END);//헌뇜꾸鱗써監깃羚
  77. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//헌뇜꼰뇜/댄轎깃羚
  78. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//헌뇝女긍넋댄轎깃羚
  79. EndAddr = address + len;
  80. while (address < EndAddr) {
  81. *p_buffer++ = *(__IO uint32_t *)address;
  82. address += 4;
  83. }
  84. fmc_lock();/* flash속傑,쐐岺긍넋 */
  85. }
  86. //뗍혤flash櫓唐槻鑒앴돨낀똑
  87. uint32_t Flash_DatalenRead(uint32_t address,uint32_t len)
  88. {
  89. uint32_t BeginAddr = 0;
  90. uint32_t addrlen = 0;
  91. uint32_t data;
  92. if(address%4||len%4) {
  93. return addrlen;
  94. }
  95. fmc_unlock();/* 썩傑flash */
  96. fmc_flag_clear(FMC_FLAG_BANK0_END);//헌뇜꾸鱗써監깃羚
  97. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//헌뇜꼰뇜/댄轎깃羚
  98. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//헌뇝女긍넋댄轎깃羚
  99. BeginAddr = address + len - 4;
  100. while(address < BeginAddr)
  101. {
  102. data = *(__IO uint32_t *)BeginAddr;
  103. if(data != 0xFFFFFFFF)
  104. break;
  105. BeginAddr -= 4;
  106. }
  107. fmc_lock();/* flash속傑,쐐岺긍넋 */
  108. if(address <= BeginAddr)
  109. {
  110. addrlen = (BeginAddr+4) - address;
  111. }
  112. return addrlen;
  113. }
  114. #else
  115. uint8_t Flash_PageErase(uint8_t _PageNumber)
  116. {
  117. uint8_t flag = 0;
  118. if(_PageNumber > 127)
  119. return 0;
  120. fmc_unlock();/* 썩傑flash */
  121. fmc_flag_clear(FMC_FLAG_BANK0_END);//헌뇜꾸鱗써監깃羚
  122. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//헌뇜꼰뇜/댄轎깃羚
  123. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//헌뇝女긍넋댄轎깃羚
  124. if( fmc_page_erase(FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber)) == FMC_READY )
  125. {
  126. flag = 1;
  127. }
  128. fmc_lock();/* flash속傑,쐐岺긍넋 */
  129. return flag;
  130. }
  131. uint8_t Flash_BufferWrite(uint8_t _PageNumber,uint32_t *pBuffer,uint16_t Num)
  132. {
  133. uint8_t flag = 1;
  134. uint32_t Address = 0,EndAddr = 0;
  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. Address = FLASH_USER_START_ADDR + FLASH_PAGE_SIZE * _PageNumber;
  140. EndAddr = Address + Num;
  141. while (Address < EndAddr) {
  142. if (fmc_word_program(Address, *pBuffer++) == FMC_READY) {
  143. Address += 4;
  144. } else {
  145. flag = 0;// Error occurred while writing data in Flash memory.
  146. }
  147. }
  148. fmc_lock();/* flash속傑,쐐岺긍넋 */
  149. return flag;
  150. }
  151. /*
  152. void Flash_BufferRead(uint8_t _PageNumber,uint32_t *pBuffer,uint16_t Num)
  153. {
  154. uint8_t i;
  155. uint32_t Address = 0;
  156. Address = FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber );
  157. for( i=0; i<Num/4; i++ )
  158. {
  159. *pBuffer++ = *(__IO uint32_t *)Address;
  160. Address += 4;
  161. }
  162. for( i=0; i<Num%4; i++ )
  163. {
  164. *(uint8_t *)pBuffer = *(__IO uint8_t *)Address;
  165. ( (uint8_t *)pBuffer )++;//뒈囹속1
  166. Address += 1;
  167. }
  168. }*/
  169. void Flash_BufferRead(uint8_t _PageNumber,uint8_t *pBuffer,uint16_t Num)
  170. {
  171. uint8_t i;
  172. uint32_t Address = 0;
  173. Address = FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber );
  174. for( i=0; i< Num; i++)
  175. {
  176. *pBuffer++ = *(__IO uint8_t *)Address++;
  177. }
  178. }
  179. #endif