lib_flash.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. /**
  2. ******************************************************************************
  3. * @file lib_flash.c
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  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_ICE_KEY 0xAA5555AA
  21. #define FLASH_MODE_MASK 0x1F3
  22. /**
  23. * @brief Initializes FLASH mode.
  24. * @param CSMode:
  25. FLASH_CSMODE_DISABLE
  26. FLASH_CSMODE_ALWAYSON
  27. FLASH_CSMODE_TMR2OF
  28. FLASH_CSMODE_RTC
  29. * @retval None
  30. */
  31. void FLASH_Init(uint32_t CSMode)
  32. {
  33. uint32_t tmp;
  34. /* Check parameters */
  35. assert_parameters(IS_FLASH_CSMODE(CSMode));
  36. tmp = FLASH->CTRL;
  37. tmp &= ~FLASH_MODE_MASK;
  38. tmp |= CSMode;
  39. FLASH->CTRL = tmp;
  40. }
  41. /**
  42. * @brief Enables or disables FLASH interrupt.
  43. * @param IntMask:
  44. FLASH_INT_CS
  45. NewState:
  46. ENABLE
  47. DISABLE
  48. * @retval None
  49. */
  50. void FLASH_INTConfig(uint32_t IntMask, uint32_t NewState)
  51. {
  52. uint32_t tmp;
  53. /* Check parameters */
  54. assert_parameters(IS_FLASH_INT(IntMask));
  55. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  56. tmp = FLASH->CTRL;
  57. tmp &= ~IntMask;
  58. if (NewState == ENABLE)
  59. {
  60. tmp |= IntMask;
  61. }
  62. FLASH->CTRL = tmp;
  63. }
  64. /**
  65. * @brief Initializes FLASH 1USCYCLE.
  66. * @param None
  67. * @retval None
  68. */
  69. void FLASH_CycleInit(void)
  70. {
  71. uint32_t hclk;
  72. hclk = CLK_GetHCLKFreq();
  73. if (hclk > 1000000)
  74. MISC2->FLASHWC = (hclk/1000000)<<8;
  75. else
  76. MISC2->FLASHWC = 0;
  77. }
  78. /**
  79. * @brief Erases a specified FLASH sector.
  80. * @param SectorAddr: Erase start address.
  81. * @retval None
  82. */
  83. void FLASH_SectorErase(uint32_t SectorAddr)
  84. {
  85. /* Check parameters */
  86. assert_parameters(IS_FLASH_ADDRESS(SectorAddr));
  87. /* Unlock flash */
  88. FLASH->PASS = FLASH_PASS_KEY;
  89. FLASH->PGADDR = SectorAddr;
  90. FLASH->SERASE = FLASH_SERASE_KEY;
  91. while (FLASH->SERASE != 0);
  92. /* Lock flash */
  93. FLASH->PASS = 0;
  94. }
  95. /**
  96. * @brief Erases chip.
  97. * @param None.
  98. * @retval None
  99. */
  100. void FLASH_ChipErase(void)
  101. {
  102. /* Unlock flash */
  103. FLASH->PASS = FLASH_PASS_KEY;
  104. FLASH->PGADDR = 0;
  105. FLASH->CERASE = FLASH_CERASE_KEY;
  106. while (FLASH->CERASE != 0);
  107. /* Lock flash */
  108. FLASH->PASS = 0;
  109. }
  110. /**
  111. * @brief Programs n word at a specified start address.
  112. * @param Addr: program start address
  113. WordBuffer: word's buffer pointer to write
  114. Length: The length of WordBuffer
  115. * @retval None
  116. */
  117. void FLASH_ProgramWord(uint32_t Addr, uint32_t *WordBuffer, uint32_t Length)
  118. {
  119. uint32_t i;
  120. /* Check parameters */
  121. assert_parameters(IS_FLASH_ADRRW(Addr));
  122. FLASH->PGADDR = Addr;
  123. /* Unlock flash */
  124. FLASH->PASS = FLASH_PASS_KEY;
  125. for (i=0; i<Length; i++)
  126. {
  127. FLASH->PGDATA = *(WordBuffer++);
  128. while (FLASH->STS != 1);
  129. }
  130. /* Lock flash */
  131. FLASH->PASS = 0;
  132. }
  133. /**
  134. * @brief Programs n half-word at a specified start address.
  135. * @param Addr: program start address
  136. HWordBuffer: half-word's buffer pointer to write
  137. Length: The length of HWordBuffer
  138. * @retval None
  139. */
  140. void FLASH_ProgramHWord(uint32_t Addr, uint16_t *HWordBuffer, uint32_t Length)
  141. {
  142. uint32_t i;
  143. /* Check parameters */
  144. assert_parameters(IS_FLASH_ADRRHW(Addr));
  145. FLASH->PGADDR = Addr;
  146. /* Unlock flash */
  147. FLASH->PASS = FLASH_PASS_KEY;
  148. for (i=0; i<Length; i++)
  149. {
  150. if (((Addr + 2*i)&0x3) == 0)
  151. *((__IO uint16_t*)(&FLASH->PGDATA)) = *(HWordBuffer++);
  152. else
  153. *((__IO uint16_t*)(&FLASH->PGDATA ) + 1) = *(HWordBuffer++);
  154. while (FLASH->STS != 1);
  155. }
  156. /* Lock flash */
  157. FLASH->PASS = 0;
  158. }
  159. /**
  160. * @brief Programs n byte at a specified start address.
  161. * @param Addr: program start address
  162. ByteBuffer: byte's buffer pointer to write
  163. Length: The length of ByteBuffer
  164. * @retval None
  165. */
  166. void FLASH_ProgramByte(uint32_t Addr, uint8_t *ByteBuffer, uint32_t Length)
  167. {
  168. uint32_t i;
  169. /* Check parameters */
  170. assert_parameters(IS_FLASH_ADDRESS(Addr));
  171. FLASH->PGADDR = Addr;
  172. /* Unlock flash */
  173. FLASH->PASS = FLASH_PASS_KEY;
  174. for (i=0; i<Length; i++)
  175. {
  176. if (((Addr + i)&0x3) == 0)
  177. *((__IO uint8_t*)(&FLASH->PGDATA)) = *(ByteBuffer++);
  178. else if (((Addr + i)&0x3) == 1)
  179. *((__IO uint8_t*)(&FLASH->PGDATA) + 1) = *(ByteBuffer++);
  180. else if (((Addr + i)&0x3) == 2)
  181. *((__IO uint8_t*)(&FLASH->PGDATA) + 2) = *(ByteBuffer++);
  182. else
  183. *((__IO uint8_t*)(&FLASH->PGDATA) + 3) = *(ByteBuffer++);
  184. while (FLASH->STS != 1);
  185. }
  186. /* Lock flash */
  187. FLASH->PASS = 0;
  188. }
  189. /**
  190. * @brief Enables FLASH read protection.
  191. * @param Block: can use the '|' operator.
  192. FLASH_BLOCK_0 ~ FLASH_BLOCK_31 or FLASH_BLOCK_ALL
  193. * @retval None
  194. */
  195. void FLASH_SetReadProtection(uint32_t Block)
  196. {
  197. uint32_t tmp;
  198. /* Check parameters */
  199. assert_parameters(IS_FLASH_RWBLOCK(Block));
  200. tmp = *(volatile unsigned int *)(0x0007FC00);
  201. tmp &= ~Block;
  202. /* Unlock flash */
  203. FLASH->PASS = FLASH_PASS_KEY;
  204. FLASH->PGADDR = 0x7FC00;
  205. FLASH->PGDATA = tmp;
  206. while (FLASH->STS != 1);
  207. /* Lock flash */
  208. FLASH->PASS = 0;
  209. tmp = *(volatile unsigned int *)(0x0007FC00);
  210. }
  211. /**
  212. * @brief Enables or disables FLASH write protection.
  213. * @param Block: can use the '|' operator.
  214. FLASH_BLOCK_0 ~ FLASH_BLOCK_31 or FLASH_BLOCK_ALL
  215. NewState:
  216. ENABLE
  217. DISABLE
  218. * @retval None
  219. */
  220. void FLASH_WriteProtection(uint32_t Block, uint32_t NewState)
  221. {
  222. uint32_t wrprot;
  223. /* Check parameters */
  224. assert_parameters(IS_FLASH_RWBLOCK(Block));
  225. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  226. wrprot = FLASH->WRPROT;
  227. if (NewState == ENABLE)
  228. {
  229. wrprot |= Block;
  230. }
  231. else
  232. {
  233. wrprot &= ~Block;
  234. }
  235. FLASH->WRPROT = wrprot;
  236. }
  237. /**
  238. * @brief Enables or disables ICE protection.
  239. * @param NewState:
  240. ENABLE(ICE protection is successful when 0x7FC08 is 0xFFFFFFFF )
  241. DISABLE
  242. * @retval None.
  243. */
  244. void FLASH_ICEProtection(uint32_t NewState)
  245. {
  246. /* Check parameters */
  247. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  248. if (NewState == ENABLE)
  249. {
  250. /* Unlock flash */
  251. FLASH->PASS = FLASH_PASS_KEY;
  252. FLASH->PGADDR = 0x7FC08;
  253. FLASH->PGDATA = 0x0A;
  254. while (FLASH->STS != 1);
  255. /* Lock flash */
  256. FLASH->PASS = 0;
  257. }
  258. else
  259. {
  260. FLASH_SectorErase(0x7FFFF);
  261. CORTEX_NVIC_SystemReset();
  262. }
  263. }
  264. /**
  265. * @brief Gets read/write/erase protection status.
  266. * @param Block:
  267. FLASH_BLOCK_0 ~ FLASH_BLOCK_31
  268. Operation:
  269. FLASH_READ
  270. FLASH_WRITE
  271. * @retval
  272. When Operation is FLASH_READ:
  273. 1: Read protection enabled.
  274. 0: Read protection disabled.
  275. When Operation is FLASH_WRITE:
  276. 1: Write/erase protection enabled.
  277. 0: Write/erase protection disabled.
  278. */
  279. uint8_t FLASH_GetProtectionStatus(uint32_t Block, uint32_t Operation)
  280. {
  281. /* Check parameters */
  282. assert_parameters(IS_FLASH_BLOCK(Block));
  283. assert_parameters(IS_FLASH_OPERATION(Operation));
  284. if (Operation == FLASH_READ)
  285. {
  286. if (FLASH->RDPROT & Block)
  287. return 1;
  288. else
  289. return 0;
  290. }
  291. else
  292. {
  293. if (FLASH->WRPROT & Block)
  294. return 1;
  295. else
  296. return 0;
  297. }
  298. }
  299. /**
  300. * @brief Gets read/write/erase protection status.
  301. * @param Operation:
  302. FLASH_READ
  303. FLASH_WRITE
  304. * @retval Read or write/erase protection status.
  305. */
  306. uint32_t FLASH_GetAllProtectionStatus(uint32_t Operation)
  307. {
  308. if (Operation == FLASH_READ)
  309. {
  310. return FLASH->RDPROT;
  311. }
  312. else
  313. {
  314. return FLASH->WRPROT;
  315. }
  316. }
  317. /**
  318. * @brief Sets checksum range.
  319. * @param AddrStart: checksum start address
  320. AddrEnd: checksum end address
  321. * @retval None
  322. */
  323. void FLASH_SetCheckSumRange(uint32_t AddrStart, uint32_t AddrEnd)
  324. {
  325. /* Check parameters */
  326. assert_parameters(IS_FLASH_CHECKSUMADDR(AddrStart,AddrEnd));
  327. FLASH->CSSADDR = AddrStart;
  328. FLASH->CSEADDR = AddrEnd;
  329. }
  330. /**
  331. * @brief Sets checksum compare value.
  332. * @param Checksum: checksum compare value
  333. * @retval None
  334. */
  335. void FLASH_SetCheckSumCompValue(uint32_t Checksum)
  336. {
  337. FLASH->CSCVALUE = Checksum;
  338. }
  339. /**
  340. * @brief Gets FLASH checksum value.
  341. * @param None
  342. * @retval Checksum
  343. */
  344. uint32_t FLASH_GetCheckSum(void)
  345. {
  346. return FLASH->CSVALUE;
  347. }
  348. /**
  349. * @brief Gets FLASH interrupt status.
  350. * @param IntMask:
  351. FLASH_INT_CS
  352. * @retval 1: interrupt status set
  353. 0: interrupt status reset
  354. */
  355. uint8_t FLASH_GetINTStatus(uint32_t IntMask)
  356. {
  357. /* Check parameters */
  358. assert_parameters(IS_FLASH_INT(IntMask));
  359. if (FLASH->INTSTS & FLASH_INTSTS_CSERR)
  360. {
  361. return 1;
  362. }
  363. else
  364. {
  365. return 0;
  366. }
  367. }
  368. /**
  369. * @brief Clears FLASH interrupt status.
  370. * @param IntMask:
  371. FLASH_INT_CS
  372. * @retval None
  373. */
  374. void FLASH_ClearINTStatus(uint32_t IntMask)
  375. {
  376. /* Check parameters */
  377. assert_parameters(IS_FLASH_INT(IntMask));
  378. if (IntMask == FLASH_INT_CS)
  379. {
  380. FLASH->INTSTS = FLASH_INTSTS_CSERR;
  381. }
  382. }
  383. /*********************************** END OF FILE ******************************/