lib_flash.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. /**
  2. ******************************************************************************
  3. * @file lib_flash.c
  4. * @author Application Team
  5. * @version V4.3.0
  6. * @date 2018-09-27
  7. * @brief FLASH library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_flash.h"
  14. #include "lib_clk.h"
  15. /* FLASH Keys */
  16. #define FLASH_PASS_KEY 0x55AAAA55
  17. #define FLASH_SERASE_KEY 0xAA5555AA
  18. #define FLASH_CERASE_KEY 0xAA5555AA
  19. #define FLASH_DSTB_KEY 0xAA5555AA
  20. #define FLASH_MODE_MASK 0x1F3
  21. /**
  22. * @brief FLASH mode initialization.
  23. * @param CSMode:
  24. FLASH_CSMODE_DISABLE
  25. FLASH_CSMODE_ALWAYSON
  26. FLASH_CSMODE_TIM2OF
  27. FLASH_CSMODE_RTC
  28. * @retval None
  29. */
  30. void FLASH_Init(uint32_t CSMode)
  31. {
  32. uint32_t tmp;
  33. /* Check parameters */
  34. assert_parameters(IS_FLASH_CSMODE(CSMode));
  35. tmp = FLASH->CTRL;
  36. tmp &= ~FLASH_MODE_MASK;
  37. tmp |= CSMode;
  38. FLASH->CTRL = tmp;
  39. }
  40. /**
  41. * @brief Configure FLASH interrupt.
  42. * @param IntMask:
  43. FLASH_INT_CS
  44. NewState:
  45. ENABLE
  46. DISABLE
  47. * @retval None
  48. */
  49. void FLASH_INTConfig(uint32_t IntMask, uint32_t NewState)
  50. {
  51. uint32_t tmp;
  52. /* Check parameters */
  53. assert_parameters(IS_FLASH_INT(IntMask));
  54. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  55. tmp = FLASH->CTRL;
  56. tmp &= ~IntMask;
  57. if (NewState == ENABLE)
  58. {
  59. tmp |= IntMask;
  60. }
  61. FLASH->CTRL = tmp;
  62. }
  63. /**
  64. * @brief Init FLASH 1USCYCLE.
  65. * @param None
  66. * @retval None
  67. */
  68. void FLASH_CycleInit(void)
  69. {
  70. uint32_t hclk;
  71. hclk = CLK_GetHCLKFreq();
  72. if (hclk > 1000000)
  73. MISC2->FLASHWC = (hclk/1000000)<<8;
  74. else
  75. MISC2->FLASHWC = 0;
  76. }
  77. /**
  78. * @brief Erase FLASH sector.
  79. * @param SectorAddr: sector address.
  80. * @retval None
  81. */
  82. void FLASH_SectorErase(uint32_t SectorAddr)
  83. {
  84. /* Check parameters */
  85. assert_parameters(IS_FLASH_ADDRESS(SectorAddr));
  86. /* Unlock flash */
  87. FLASH->PASS = FLASH_PASS_KEY;
  88. FLASH->PGADDR = SectorAddr;
  89. FLASH->SERASE = FLASH_SERASE_KEY;
  90. while (FLASH->SERASE != 0);
  91. /* Lock flash */
  92. FLASH->PASS = 0;
  93. }
  94. /**
  95. * @brief FLASH word program.
  96. * @param Addr: program start address
  97. WordBuffer: word's buffer pointer to write
  98. Length: The length of WordBuffer
  99. * @retval None
  100. */
  101. void FLASH_ProgramWord(uint32_t Addr, uint32_t *WordBuffer, uint32_t Length)
  102. {
  103. uint32_t i;
  104. /* Check parameters */
  105. assert_parameters(IS_FLASH_ADRRW(Addr));
  106. /* Unlock flash */
  107. FLASH->PASS = FLASH_PASS_KEY;
  108. FLASH->PGADDR = Addr;
  109. for (i=0; i<Length; i++)
  110. {
  111. FLASH->PGDATA = *(WordBuffer++);
  112. }
  113. while (FLASH->STS != 1);
  114. /* Lock flash */
  115. FLASH->PASS = 0;
  116. }
  117. /**
  118. * @brief FLASH half-word progarm.
  119. * @param Addr: program start address
  120. HWordBuffer: half-word's buffer pointer to write
  121. Length: The length of HWordBuffer
  122. * @retval None
  123. */
  124. void FLASH_ProgramHWord(uint32_t Addr, uint16_t *HWordBuffer, uint32_t Length)
  125. {
  126. uint32_t i;
  127. /* Check parameters */
  128. assert_parameters(IS_FLASH_ADRRHW(Addr));
  129. /* Unlock flash */
  130. FLASH->PASS = FLASH_PASS_KEY;
  131. FLASH->PGADDR = Addr;
  132. for (i=0; i<Length; i++)
  133. {
  134. if (((Addr + 2*i)&0x3) == 0)
  135. *((__IO uint16_t*)(&FLASH->PGDATA)) = *(HWordBuffer++);
  136. else
  137. *((__IO uint16_t*)(&FLASH->PGDATA ) + 1) = *(HWordBuffer++);
  138. }
  139. while (FLASH->STS != 1);
  140. /* Lock flash */
  141. FLASH->PASS = 0;
  142. }
  143. /**
  144. * @brief FLASH byte progarm.
  145. * @param Addr: program start address
  146. ByteBuffer: byte's buffer pointer to write
  147. Length: The length of ByteBuffer
  148. * @retval None
  149. */
  150. void FLASH_ProgramByte(uint32_t Addr, uint8_t *ByteBuffer, uint32_t Length)
  151. {
  152. uint32_t i;
  153. /* Check parameters */
  154. assert_parameters(IS_FLASH_ADDRESS(Addr));
  155. /* Unlock flash */
  156. FLASH->PASS = FLASH_PASS_KEY;
  157. FLASH->PGADDR = Addr;
  158. for (i=0; i<Length; i++)
  159. {
  160. if (((Addr + i)&0x3) == 0)
  161. *((__IO uint8_t*)(&FLASH->PGDATA)) = *(ByteBuffer++);
  162. else if (((Addr + i)&0x3) == 1)
  163. *((__IO uint8_t*)(&FLASH->PGDATA) + 1) = *(ByteBuffer++);
  164. else if (((Addr + i)&0x3) == 2)
  165. *((__IO uint8_t*)(&FLASH->PGDATA) + 2) = *(ByteBuffer++);
  166. else
  167. *((__IO uint8_t*)(&FLASH->PGDATA) + 3) = *(ByteBuffer++);
  168. }
  169. while (FLASH->STS != 1);
  170. /* Lock flash */
  171. FLASH->PASS = 0;
  172. }
  173. /**
  174. * @brief Get Write status.
  175. * @param None.
  176. * @retval FLASH_WSTA_BUSY
  177. FLASH_WSTA_FINISH
  178. */
  179. uint32_t FLASH_GetWriteStatus(void)
  180. {
  181. if (FLASH->STS == 1)
  182. {
  183. return FLASH_WSTA_FINISH;
  184. }
  185. else
  186. {
  187. return FLASH_WSTA_BUSY;
  188. }
  189. }
  190. /**
  191. * @brief Set checksum range.
  192. * @param AddrStart: checksum start address
  193. AddrEnd: checksum end address
  194. * @retval None
  195. */
  196. void FLASH_SetCheckSumRange(uint32_t AddrStart, uint32_t AddrEnd)
  197. {
  198. /* Check parameters */
  199. assert_parameters(IS_FLASH_CHECKSUMADDR(AddrStart,AddrEnd));
  200. FLASH->CSSADDR = AddrStart;
  201. FLASH->CSEADDR = AddrEnd;
  202. }
  203. /**
  204. * @brief Set checksum compare value.
  205. * @param Checksum: checksum compare value
  206. * @retval None
  207. */
  208. void FLASH_SetCheckSumCompValue(uint32_t Checksum)
  209. {
  210. FLASH->CSCVALUE = Checksum;
  211. }
  212. /**
  213. * @brief Get FLASH checksum value.
  214. * @param None
  215. * @retval Checksum
  216. */
  217. uint32_t FLASH_GetCheckSum(void)
  218. {
  219. return FLASH->CSVALUE;
  220. }
  221. /**
  222. * @brief Get FLASH interrupt status.
  223. * @param IntMask:
  224. FLASH_INT_CS
  225. * @retval 1: interrupt status set
  226. 0: interrupt status reset
  227. */
  228. uint8_t FLASH_GetINTStatus(uint32_t IntMask)
  229. {
  230. /* Check parameters */
  231. assert_parameters(IS_FLASH_INT(IntMask));
  232. if (FLASH->INT&FLASH_INT_CSERR)
  233. {
  234. return 1;
  235. }
  236. else
  237. {
  238. return 0;
  239. }
  240. }
  241. /**
  242. * @brief Clear FLASH interrupt status.
  243. * @param IntMask:
  244. FLASH_INT_CS
  245. * @retval None
  246. */
  247. void FLASH_ClearINTStatus(uint32_t IntMask)
  248. {
  249. /* Check parameters */
  250. assert_parameters(IS_FLASH_INT(IntMask));
  251. if (IntMask == FLASH_INT_CS)
  252. {
  253. FLASH->INT = FLASH_INT_CSERR;
  254. }
  255. }
  256. /*********************************** END OF FILE ******************************/