flash.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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. 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. #else
  155. uint8_t Flash_PageErase(uint8_t _PageNumber)
  156. {
  157. uint8_t flag = 0;
  158. if(_PageNumber > 127)
  159. return 0;
  160. fmc_unlock();/* 썩傑flash */
  161. fmc_flag_clear(FMC_FLAG_BANK0_END);//헌뇜꾸鱗써監깃羚
  162. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//헌뇜꼰뇜/댄轎깃羚
  163. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//헌뇝女긍넋댄轎깃羚
  164. if( fmc_page_erase(FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber)) == FMC_READY )
  165. {
  166. flag = 1;
  167. }
  168. fmc_lock();/* flash속傑,쐐岺긍넋 */
  169. return flag;
  170. }
  171. uint8_t Flash_BufferWrite(uint8_t _PageNumber,uint32_t *pBuffer,uint16_t Num)
  172. {
  173. uint8_t flag = 1;
  174. uint32_t Address = 0,EndAddr = 0;
  175. fmc_unlock();/* 썩傑flash */
  176. fmc_flag_clear(FMC_FLAG_BANK0_END);//헌뇜꾸鱗써監깃羚
  177. fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//헌뇜꼰뇜/댄轎깃羚
  178. fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//헌뇝女긍넋댄轎깃羚
  179. Address = FLASH_USER_START_ADDR + FLASH_PAGE_SIZE * _PageNumber;
  180. EndAddr = Address + Num;
  181. while (Address < EndAddr) {
  182. if (fmc_word_program(Address, *pBuffer++) == FMC_READY) {
  183. Address += 4;
  184. } else {
  185. flag = 0;// Error occurred while writing data in Flash memory.
  186. }
  187. }
  188. fmc_lock();/* flash속傑,쐐岺긍넋 */
  189. return flag;
  190. }
  191. /*
  192. void Flash_BufferRead(uint8_t _PageNumber,uint32_t *pBuffer,uint16_t Num)
  193. {
  194. uint8_t i;
  195. uint32_t Address = 0;
  196. Address = FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber );
  197. for( i=0; i<Num/4; i++ )
  198. {
  199. *pBuffer++ = *(__IO uint32_t *)Address;
  200. Address += 4;
  201. }
  202. for( i=0; i<Num%4; i++ )
  203. {
  204. *(uint8_t *)pBuffer = *(__IO uint8_t *)Address;
  205. ( (uint8_t *)pBuffer )++;//뒈囹속1
  206. Address += 1;
  207. }
  208. }*/
  209. void Flash_BufferRead(uint8_t _PageNumber,uint8_t *pBuffer,uint16_t Num)
  210. {
  211. uint8_t i;
  212. uint32_t Address = 0;
  213. Address = FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber );
  214. for( i=0; i< Num; i++)
  215. {
  216. *pBuffer++ = *(__IO uint8_t *)Address++;
  217. }
  218. }
  219. #endif