FlashPrg.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. /* -----------------------------------------------------------------------------
  2. * Copyright (c) 2014 - 2019 ARM Ltd.
  3. *
  4. * This software is provided 'as-is', without any express or implied warranty.
  5. * In no event will the authors be held liable for any damages arising from
  6. * the use of this software. Permission is granted to anyone to use this
  7. * software for any purpose, including commercial applications, and to alter
  8. * it and redistribute it freely, subject to the following restrictions:
  9. *
  10. * 1. The origin of this software must not be misrepresented; you must not
  11. * claim that you wrote the original software. If you use this software in
  12. * a product, an acknowledgment in the product documentation would be
  13. * appreciated but is not required.
  14. *
  15. * 2. Altered source versions must be plainly marked as such, and must not be
  16. * misrepresented as being the original software.
  17. *
  18. * 3. This notice may not be removed or altered from any source distribution.
  19. *
  20. *
  21. * $Date: 2021-7-1
  22. * $Revision: V1.0.0
  23. *
  24. * Project: Flash Programming Functions for Puya PY32F002Cxx Flash
  25. * --------------------------------------------------------------------------- */
  26. /* History:
  27. * Version 1.0.0
  28. * Initial release
  29. */
  30. #include "FlashOS.h" /* FlashOS Structures */
  31. typedef volatile unsigned char vu8;
  32. typedef unsigned char u8;
  33. typedef volatile unsigned short vu16;
  34. typedef unsigned short u16;
  35. typedef volatile unsigned long vu32;
  36. typedef unsigned long u32;
  37. #define M8(adr) (*((vu8 *)(adr)))
  38. #define M16(adr) (*((vu16 *)(adr)))
  39. #define M32(adr) (*((vu32 *)(adr)))
  40. #define SET_BIT(REG, BIT) ((REG) |= (BIT))
  41. #define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT))
  42. #define READ_BIT(REG, BIT) ((REG) & (BIT))
  43. #define CLEAR_REG(REG) ((REG) = (0x0))
  44. #define WRITE_REG(REG, VAL) ((REG) = (VAL))
  45. #define READ_REG(REG) ((REG))
  46. #define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
  47. #define FLASH_BASE (0x08000000UL) /*!< FLASH base address */
  48. #define FLASH_END (0x08007FFFUL) /*!< FLASH end address */
  49. #define FLASH_SIZE (FLASH_END - FLASH_BASE + 1)
  50. #define FLASH_PAGE_SIZE 0x00000080U /*!< FLASH Page Size, 128 Bytes */
  51. #define FLASH_PAGE_NB (FLASH_SIZE / FLASH_PAGE_SIZE)
  52. /* Peripheral Memory Map */
  53. #define OTP_BASE 0x1FFF0280
  54. #define RCC_BASE 0x40021000
  55. #define OB_BASE 0x1FFF0080 /*!< FLASH Option Bytes base address */
  56. #define IWDG_BASE 0x40003000
  57. #define FLASH_R_BASE 0x40022000
  58. #define RCC ((RCC_TypeDef *)RCC_BASE)
  59. #define IWDG ((IWDG_TypeDef *)IWDG_BASE)
  60. #define FLASH ((FLASH_TypeDef *)FLASH_R_BASE)
  61. #define OB ((OB_TypeDef *) OB_BASE)
  62. typedef struct
  63. {
  64. vu32 CR; /*!< RCC Clock Sources Control Register, Address offset: 0x00 */
  65. vu32 ICSCR; /*!< RCC Internal Clock Sources Calibration Register, Address offset: 0x04 */
  66. } RCC_TypeDef;
  67. /* Independent WATCHDOG */
  68. typedef struct
  69. {
  70. vu32 KR; /*!< IWDG Key register, Address offset: 0x00 */
  71. vu32 PR; /*!< IWDG Prescaler register, Address offset: 0x04 */
  72. vu32 RLR; /*!< IWDG Reload register, Address offset: 0x08 */
  73. vu32 SR; /*!< IWDG Status register, Address offset: 0x0C */
  74. } IWDG_TypeDef;
  75. /* Flash Registers */
  76. typedef struct
  77. {
  78. vu32 ACR; /*!< FLASH Access Control register, Address offset: 0x00 */
  79. vu32 RESERVED1; /*!< Reserved1, Address offset: 0x04 */
  80. vu32 KEYR; /*!< FLASH Key register, Address offset: 0x08 */
  81. vu32 OPTKEYR; /*!< FLASH Option Key register, Address offset: 0x0C */
  82. vu32 SR; /*!< FLASH Status register, Address offset: 0x10 */
  83. vu32 CR; /*!< FLASH Control register, Address offset: 0x14 */
  84. vu32 RESERVED2[2]; /*!< Reserved2, Address offset: 0x18-0x1C */
  85. vu32 OPTR; /*!< FLASH Option register, Address offset: 0x20 */
  86. vu32 SDKR; /*!< FLASH SDK address register, Address offset: 0x24 */
  87. vu32 BTCR; /*!< FLASH boot control Address offset: 0x28 */
  88. vu32 WRPR; /*!< FLASH WRP address register, Address offset: 0x2C */
  89. vu32 RESERVED4[(0x90 - 0x2C) / 4 - 1];
  90. vu32 STCR; /*!< FLASH sleep time config register, Address offset: 0x90 */
  91. vu32 RESERVED5[(0x100 - 0x90) / 4 - 1];
  92. vu32 TS0; /*!< FLASH TS0 register, Address offset: 0x100 */
  93. vu32 TS1; /*!< FLASH TS1 register, Address offset: 0x104 */
  94. vu32 TS2P; /*!< FLASH TS2P register, Address offset: 0x108 */
  95. vu32 TPS3; /*!< FLASH TPS3 register, Address offset: 0x10C */
  96. vu32 TS3; /*!< FLASH TS3 register, Address offset: 0x110 */
  97. vu32 PERTPE; /*!< FLASH PERTPE register, Address offset: 0x114 */
  98. vu32 SMERTPE; /*!< FLASH SMERTPE register, Address offset: 0x118 */
  99. vu32 PRGTPE; /*!< FLASH PRGTPE register, Address offset: 0x11C */
  100. vu32 PRETPE; /*!< FLASH PRETPE register, Address offset: 0x120 */
  101. } FLASH_TypeDef;
  102. /******************* Bits definition for FLASH_ACR register *****************/
  103. #define FLASH_ACR_LATENCY_Pos (0U)
  104. #define FLASH_ACR_LATENCY_Msk (0x1UL << FLASH_ACR_LATENCY_Pos) /*!< 0x00000001 */
  105. #define FLASH_ACR_LATENCY FLASH_ACR_LATENCY_Msk
  106. /****************** FLASH Keys **********************************************/
  107. #define FLASH_KEY1_Pos (0U)
  108. #define FLASH_KEY1_Msk (0x45670123UL << FLASH_KEY1_Pos) /*!< 0x45670123 */
  109. #define FLASH_KEY1 FLASH_KEY1_Msk /*!< Flash program erase key1 */
  110. #define FLASH_KEY2_Pos (0U)
  111. #define FLASH_KEY2_Msk (0xCDEF89ABUL << FLASH_KEY2_Pos) /*!< 0xCDEF89AB */
  112. #define FLASH_KEY2 FLASH_KEY2_Msk /*!< Flash program erase key2: used with FLASH_PEKEY1
  113. to unlock the write access to the FPEC. */
  114. #define FLASH_OPTKEY1_Pos (0U)
  115. #define FLASH_OPTKEY1_Msk (0x08192A3BUL << FLASH_OPTKEY1_Pos) /*!< 0x08192A3B */
  116. #define FLASH_OPTKEY1 FLASH_OPTKEY1_Msk /*!< Flash option key1 */
  117. #define FLASH_OPTKEY2_Pos (0U)
  118. #define FLASH_OPTKEY2_Msk (0x4C5D6E7FUL << FLASH_OPTKEY2_Pos) /*!< 0x4C5D6E7F */
  119. #define FLASH_OPTKEY2 FLASH_OPTKEY2_Msk /*!< Flash option key2: used with FLASH_OPTKEY1 to
  120. unlock the write access to the option byte block */
  121. /******************* Bits definition for FLASH_CR register ******************/
  122. #define FLASH_CR_PG_Pos (0U)
  123. #define FLASH_CR_PG_Msk (0x1UL << FLASH_CR_PG_Pos) /*!< 0x00000001 */
  124. #define FLASH_CR_PG FLASH_CR_PG_Msk
  125. #define FLASH_CR_PER_Pos (1U)
  126. #define FLASH_CR_PER_Msk (0x1UL << FLASH_CR_PER_Pos) /*!< 0x00000002 */
  127. #define FLASH_CR_PER FLASH_CR_PER_Msk
  128. #define FLASH_CR_MER_Pos (2U)
  129. #define FLASH_CR_MER_Msk (0x1UL << FLASH_CR_MER_Pos) /*!< 0x00000004 */
  130. #define FLASH_CR_MER FLASH_CR_MER_Msk
  131. #define FLASH_CR_SER_Pos (11U)
  132. #define FLASH_CR_SER_Msk (0x1UL << FLASH_CR_SER_Pos) /*!< 0x00000800 */
  133. #define FLASH_CR_SER FLASH_CR_SER_Msk
  134. #define FLASH_CR_OPTSTRT_Pos (17U)
  135. #define FLASH_CR_OPTSTRT_Msk (0x1UL << FLASH_CR_OPTSTRT_Pos) /*!< 0x00020000 */
  136. #define FLASH_CR_OPTSTRT FLASH_CR_OPTSTRT_Msk
  137. #define FLASH_CR_PGSTRT_Pos (19U)
  138. #define FLASH_CR_PGSTRT_Msk (0x1UL << FLASH_CR_PGSTRT_Pos) /*!< 0x00080000 */
  139. #define FLASH_CR_PGSTRT FLASH_CR_PGSTRT_Msk
  140. #define FLASH_CR_EOPIE_Pos (24U)
  141. #define FLASH_CR_EOPIE_Msk (0x1UL << FLASH_CR_EOPIE_Pos) /*!< 0x01000000 */
  142. #define FLASH_CR_EOPIE FLASH_CR_EOPIE_Msk
  143. #define FLASH_CR_ERRIE_Pos (25U)
  144. #define FLASH_CR_ERRIE_Msk (0x1UL << FLASH_CR_ERRIE_Pos) /*!< 0x02000000 */
  145. #define FLASH_CR_ERRIE FLASH_CR_ERRIE_Msk
  146. #define FLASH_CR_OBL_LAUNCH_Pos (27U)
  147. #define FLASH_CR_OBL_LAUNCH_Msk (0x1UL << FLASH_CR_OBL_LAUNCH_Pos) /*!< 0x08000000 */
  148. #define FLASH_CR_OBL_LAUNCH FLASH_CR_OBL_LAUNCH_Msk
  149. #define FLASH_CR_OPTLOCK_Pos (30U)
  150. #define FLASH_CR_OPTLOCK_Msk (0x1UL << FLASH_CR_OPTLOCK_Pos) /*!< 0x40000000 */
  151. #define FLASH_CR_OPTLOCK FLASH_CR_OPTLOCK_Msk
  152. #define FLASH_CR_LOCK_Pos (31U)
  153. #define FLASH_CR_LOCK_Msk (0x1UL << FLASH_CR_LOCK_Pos) /*!< 0x80000000 */
  154. #define FLASH_CR_LOCK FLASH_CR_LOCK_Msk
  155. /******************* Bits definition for FLASH_SR register ******************/
  156. #define FLASH_SR_EOP_Pos (0U)
  157. #define FLASH_SR_EOP_Msk (0x1UL << FLASH_SR_EOP_Pos) /*!< 0x00000001 */
  158. #define FLASH_SR_EOP FLASH_SR_EOP_Msk
  159. #define FLASH_SR_WRPERR_Pos (4U)
  160. #define FLASH_SR_WRPERR_Msk (0x1UL << FLASH_SR_WRPERR_Pos) /*!< 0x00000010 */
  161. #define FLASH_SR_WRPERR FLASH_SR_WRPERR_Msk
  162. #define FLASH_SR_OPTVERR_Pos (15U)
  163. #define FLASH_SR_OPTVERR_Msk (0x1UL << FLASH_SR_OPTVERR_Pos) /*!< 0x00008000 */
  164. #define FLASH_SR_OPTVERR FLASH_SR_OPTVERR_Msk
  165. #define FLASH_SR_BSY_Pos (16U)
  166. #define FLASH_SR_BSY_Msk (0x1UL << FLASH_SR_BSY_Pos) /*!< 0x00010000 */
  167. #define FLASH_SR_BSY FLASH_SR_BSY_Msk
  168. #define FLASH_OPTR_IWDG_SW_Pos (12U)
  169. #define FLASH_OPTR_IWDG_SW_Msk (0x1UL << FLASH_OPTR_IWDG_SW_Pos) /*!< 0x00001000 */
  170. #define FLASH_OPTR_IWDG_SW FLASH_OPTR_IWDG_SW_Msk
  171. #define FLASH_OPTR_IWDG_STOP_Pos (15U)
  172. #define FLASH_OPTR_IWDG_STOP_Msk (0x1UL << FLASH_OPTR_IWDG_STOP_Pos) /*!< 0x02000000 */
  173. #define FLASH_OPTR_IWDG_STOP FLASH_OPTR_IWDG_STOP_Msk
  174. u32 RCC_ICSCR_HSI_FS_RESTORE;
  175. void InitRccAndFlashParam(void);
  176. void UnInitRccAndFlashParam(void);
  177. int ErasePage(unsigned long adr);
  178. /*
  179. * Initialize Flash Programming Functions
  180. * Parameter: adr: Device Base Address
  181. * clk: Clock Frequency (Hz)
  182. * fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)
  183. * Return Value: 0 - OK, 1 - Failed
  184. */
  185. int Init(unsigned long adr, unsigned long clk, unsigned long fnc)
  186. {
  187. FLASH->KEYR = FLASH_KEY1; /* Unlock Flash */
  188. FLASH->KEYR = FLASH_KEY2;
  189. InitRccAndFlashParam();
  190. #ifdef FLASH_OB
  191. FLASH->OPTKEYR = FLASH_OPTKEY1; /* Unlock Option Bytes */
  192. FLASH->OPTKEYR = FLASH_OPTKEY2;
  193. #endif
  194. FLASH->ACR &= ~FLASH_ACR_LATENCY; /* Zero Wait State, no Prefetch */
  195. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  196. while (FLASH->SR & FLASH_SR_BSY); /* Check FLASH_SR_BSY */
  197. if ((FLASH->OPTR & FLASH_OPTR_IWDG_SW) == 0x00) /* Test if IWDG is running (IWDG in HW mode) */
  198. {
  199. /* Set IWDG time out to ~32.768 second */
  200. IWDG->KR = 0xAAAA; /* Reload IWDG */
  201. IWDG->KR = 0x5555; /* Enable write access to IWDG_PR and IWDG_RLR */
  202. IWDG->PR = 0x06; /* Set prescaler to 256 */
  203. IWDG->RLR = 0xFFF; /* Set reload value to 4095 */
  204. }
  205. return (0);
  206. }
  207. /*
  208. * De-Initialize Flash Programming Functions
  209. * Parameter: fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)
  210. * Return Value: 0 - OK, 1 - Failed
  211. */
  212. int UnInit(unsigned long fnc)
  213. {
  214. UnInitRccAndFlashParam();
  215. FLASH->CR |= FLASH_CR_LOCK; /* Lock Flash */
  216. #ifdef FLASH_OB
  217. FLASH->CR |= FLASH_CR_OPTLOCK; /* Lock Option Bytes */
  218. #endif
  219. return (0);
  220. }
  221. /*
  222. * Erase complete Flash Memory
  223. * Return Value: 0 - OK, 1 - Failed
  224. */
  225. #ifdef FLASH_MEM
  226. int EraseChip(void)
  227. {
  228. #ifdef FLASH_OTP
  229. ErasePage(OTP_BASE);
  230. #else
  231. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  232. FLASH->CR |= FLASH_CR_MER; /* Mass Erase Enabled */
  233. FLASH->CR |= FLASH_CR_EOPIE;
  234. M32(FLASH_BASE) = 0xFF;
  235. __asm("DSB");
  236. while (FLASH->SR & FLASH_SR_BSY)
  237. {
  238. IWDG->KR = 0xAAAA; /* Reload IWDG */
  239. }
  240. if (FLASH_SR_EOP != (FLASH->SR & FLASH_SR_EOP)) /* Check for FLASH_SR_EOP */
  241. {
  242. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  243. return (1); /* Failed */
  244. }
  245. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  246. FLASH->CR &= ~FLASH_CR_MER; /* Mass Erase Disabled */
  247. FLASH->CR &= ~FLASH_CR_EOPIE; /* Reset FLASH_EOPIE */
  248. #endif /* FLASH_OTP */
  249. return (0); /* Done */
  250. }
  251. #endif /* FLASH_MEM */
  252. #ifdef FLASH_OB
  253. int EraseChip(void)
  254. {
  255. /* erase chip is not needed for
  256. - Flash Option bytes
  257. - Flash One Time Programmable bytes
  258. */
  259. return (0); /* Done */
  260. }
  261. #endif
  262. /*
  263. * Erase Sector in Flash Memory
  264. * Parameter: adr: Sector Address
  265. * Return Value: 0 - OK, 1 - Failed
  266. */
  267. #ifdef FLASH_MEM
  268. int EraseSector(unsigned long adr)
  269. {
  270. #ifdef FLASH_OTP
  271. ErasePage(OTP_BASE);
  272. #else
  273. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  274. FLASH->CR |= FLASH_CR_SER; /* Sector Erase Enabled */
  275. FLASH->CR |= FLASH_CR_EOPIE;
  276. M32(adr) = 0xFF; /* Sector Address */
  277. __asm("DSB");
  278. while (FLASH->SR & FLASH_SR_BSY)
  279. {
  280. IWDG->KR = 0xAAAA; /* Reload IWDG */
  281. }
  282. if (FLASH_SR_EOP != (FLASH->SR & FLASH_SR_EOP)) /* Check for FLASH_SR_EOP */
  283. {
  284. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  285. return (1); /* Failed */
  286. }
  287. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  288. FLASH->CR &= ~FLASH_CR_SER; /* Sector Erase Disabled */
  289. FLASH->CR &= ~FLASH_CR_EOPIE; /* Reset FLASH_EOPIE */
  290. #endif /* FLASH_OTP */
  291. return (0); /* Done */
  292. }
  293. #endif /* FLASH_MEM */
  294. #ifdef FLASH_OB
  295. int EraseSector(unsigned long adr)
  296. {
  297. /* erase sector is not needed for
  298. - Flash Option bytes
  299. - Flash One Time Programmable bytes
  300. */
  301. return (0); /* Done */
  302. }
  303. #endif
  304. #ifdef FLASH_MEM
  305. int ErasePage(unsigned long adr)
  306. {
  307. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  308. FLASH->CR |= FLASH_CR_PER; /* Sector Erase Enabled */
  309. FLASH->CR |= FLASH_CR_EOPIE;
  310. M32(adr) = 0xFF; /* Sector Address */
  311. __asm("DSB");
  312. while (FLASH->SR & FLASH_SR_BSY)
  313. {
  314. IWDG->KR = 0xAAAA; /* Reload IWDG */
  315. }
  316. if (FLASH_SR_EOP != (FLASH->SR & FLASH_SR_EOP)) /* Check for FLASH_SR_EOP */
  317. {
  318. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  319. return (1); /* Failed */
  320. }
  321. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  322. FLASH->CR &= ~FLASH_CR_PER; /* Sector Erase Disabled */
  323. FLASH->CR &= ~FLASH_CR_EOPIE; /* Reset FLASH_EOPIE */
  324. return (0); /* Done */
  325. }
  326. #endif /* FLASH_MEM */
  327. /*
  328. * Program Page in Flash Memory
  329. * Parameter: adr: Page Start Address
  330. * sz: Page Size
  331. * buf: Page Data
  332. * Return Value: 0 - OK, 1 - Failed
  333. */
  334. #ifdef FLASH_MEM
  335. int ProgramPage(unsigned long adr, unsigned long sz, unsigned char *buf)
  336. {
  337. sz = (sz + (FLASH_PAGE_SIZE - 1)) & ~(FLASH_PAGE_SIZE - 1); /* Adjust size for 32 Words */
  338. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  339. while (sz)
  340. {
  341. FLASH->CR |= FLASH_CR_PG; /* Programming Enabled */
  342. FLASH->CR |= FLASH_CR_EOPIE;
  343. for (u8 i = 0; i < (FLASH_PAGE_SIZE / 4); i++)
  344. {
  345. M32(adr + i * 4) = *((u32 *)(buf + i * 4)); /* Program the first word of the Double Word */
  346. if (i == (FLASH_PAGE_SIZE / 4) - 2)
  347. {
  348. FLASH->CR |= FLASH_CR_PGSTRT;
  349. }
  350. }
  351. __asm("DSB");
  352. while (FLASH->SR & FLASH_SR_BSY)
  353. {
  354. IWDG->KR = 0xAAAA; /* Reload IWDG */
  355. }
  356. if (FLASH_SR_EOP != (FLASH->SR & FLASH_SR_EOP)) /* Check for FLASH_SR_EOP */
  357. {
  358. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  359. return (1); /* Failed */
  360. }
  361. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  362. FLASH->CR &= ~FLASH_CR_PG; /* Programming Disabled */
  363. FLASH->CR &= ~FLASH_CR_EOPIE; /* Reset FLASH_EOPIE */
  364. adr += FLASH_PAGE_SIZE; /* Go to next Page */
  365. buf += FLASH_PAGE_SIZE;
  366. sz -= FLASH_PAGE_SIZE;
  367. }
  368. return (0); /* Done */
  369. }
  370. #endif /* FLASH_MEM */
  371. #ifdef FLASH_OB
  372. int ProgramPage(unsigned long adr, unsigned long sz, unsigned char *buf)
  373. {
  374. u32 optr;
  375. u32 sdkr;
  376. u32 btcr;
  377. u32 wrpr;
  378. optr = *((u32 *)(buf + 0x00));
  379. sdkr = *((u32 *)(buf + 0x04));
  380. btcr = *((u32 *)(buf + 0x08));
  381. wrpr = *((u32 *)(buf + 0x0C));
  382. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  383. FLASH->OPTR = (optr & 0x0000FFFF); /* Write OPTR values */
  384. FLASH->SDKR = (sdkr & 0x0000FFFF); /* Write SDKR values */
  385. FLASH->BTCR = (btcr & 0x0000FFFF); /* Write BTCR values */
  386. FLASH->WRPR = (wrpr & 0x0000FFFF); /* Write WRPR values */
  387. FLASH->CR |= FLASH_CR_OPTSTRT;
  388. FLASH->CR |= FLASH_CR_EOPIE;
  389. M32(0x40022080) = 0xFF;
  390. __asm("DSB");
  391. while (FLASH->SR & FLASH_SR_BSY)
  392. {
  393. IWDG->KR = 0xAAAA; /* Reload IWDG */
  394. }
  395. if (FLASH_SR_EOP != (FLASH->SR & FLASH_SR_EOP)) /* Check for FLASH_SR_EOP */
  396. {
  397. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  398. return (1); /* Failed */
  399. }
  400. FLASH->SR |= FLASH_SR_EOP; /* Reset FLASH_EOP */
  401. FLASH->CR &= ~FLASH_CR_OPTSTRT; /* Programming Disabled */
  402. FLASH->CR &= ~FLASH_CR_EOPIE; /* Reset FLASH_EOPIE */
  403. return (0); /* Done */
  404. }
  405. #endif /* FLASH_OB */
  406. #ifdef FLASH_OB
  407. unsigned long Verify(unsigned long adr, unsigned long sz, unsigned char *buf)
  408. {
  409. u32 optr;
  410. u32 sdkr;
  411. u32 btcr;
  412. u32 wrpr;
  413. optr = *((u32 *)(buf + 0x00));
  414. sdkr = *((u32 *)(buf + 0x04));
  415. btcr = *((u32 *)(buf + 0x08));
  416. wrpr = *((u32 *)(buf + 0x0C));
  417. if (M32(adr + 0x00) != optr)
  418. {
  419. return (adr + 0x00);
  420. }
  421. if (M32(adr + 0x04) != sdkr)
  422. {
  423. return (adr + 0x04);
  424. }
  425. if (M32(adr + 0x08) != btcr)
  426. {
  427. return (adr + 0x08);
  428. }
  429. if (M32(adr + 0x0C) != wrpr)
  430. {
  431. return (adr + 0x0C);
  432. }
  433. return (adr + sz);
  434. }
  435. #endif /* FLASH_OB */
  436. #define RCC_HSICALIBRATION_8MHz ((0x0<<RCC_ICSCR_HSI_FS_CR_Pos) | ((*(vu32 *)(0x1FFF0100)) & 0xFFFF)) /*!< 8MHz HSI calibration trimming value */
  437. #define RCC_HSICALIBRATION_16MHz ((0x1<<RCC_ICSCR_HSI_FS_CR_Pos) | ((*(vu32 *)(0x1FFF0104)) & 0xFFFF)) /*!< 16MHz HSI calibration trimming value */
  438. #define RCC_HSICALIBRATION_24MHz ((0x2<<RCC_ICSCR_HSI_FS_CR_Pos) | ((*(vu32 *)(0x1FFF0108)) & 0xFFFF)) /*!< 24MHz HSI calibration trimming value */
  439. #define RCC_HSICALIBRATION_48MHz ((0x3<<RCC_ICSCR_HSI_FS_CR_Pos) | ((*(vu32 *)(0x1FFF010C)) & 0xFFFF)) /*!< 48MHz HSI calibration trimming value */
  440. /******************** Bit definition for RCC_CR register *****************/
  441. #define RCC_CR_HSION_Pos (8U)
  442. #define RCC_CR_HSION_Msk (0x1UL << RCC_CR_HSION_Pos) /*!< 0x00000100 */
  443. #define RCC_CR_HSION RCC_CR_HSION_Msk /*!< HSI clock enable bit */
  444. #define RCC_CR_HSIRDY_Pos (10U)
  445. #define RCC_CR_HSIRDY_Msk (0x1UL << RCC_CR_HSIRDY_Pos) /*!< 0x00000400 */
  446. #define RCC_CR_HSIRDY RCC_CR_HSIRDY_Msk
  447. /******************** Bit definition for RCC_ICSCR register ***************/
  448. #define RCC_ICSCR_HSI_ABS_TRIMCR_Pos (0U)
  449. #define RCC_ICSCR_HSI_ABS_TRIMCR_Msk (0xFFFUL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000FFF */
  450. #define RCC_ICSCR_HSI_ABS_TRIMCR RCC_ICSCR_HSI_ABS_TRIMCR_Msk /*!< HSITRIM[11:0] bits */
  451. #define RCC_ICSCR_HSI_ABS_TRIMCR_0 (0x01UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000001 */
  452. #define RCC_ICSCR_HSI_ABS_TRIMCR_1 (0x02UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000002 */
  453. #define RCC_ICSCR_HSI_ABS_TRIMCR_2 (0x04UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000004 */
  454. #define RCC_ICSCR_HSI_ABS_TRIMCR_3 (0x08UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000008 */
  455. #define RCC_ICSCR_HSI_ABS_TRIMCR_4 (0x10UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000010 */
  456. #define RCC_ICSCR_HSI_ABS_TRIMCR_5 (0x20UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000020 */
  457. #define RCC_ICSCR_HSI_ABS_TRIMCR_6 (0x40UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000040 */
  458. #define RCC_ICSCR_HSI_ABS_TRIMCR_7 (0x80UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000080 */
  459. #define RCC_ICSCR_HSI_ABS_TRIMCR_8 (0x100UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000100 */
  460. #define RCC_ICSCR_HSI_ABS_TRIMCR_9 (0x200UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000200 */
  461. #define RCC_ICSCR_HSI_ABS_TRIMCR_10 (0x400UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000400 */
  462. #define RCC_ICSCR_HSI_ABS_TRIMCR_11 (0x800UL << RCC_ICSCR_HSI_ABS_TRIMCR_Pos) /*!< 0x00000800 */
  463. #define RCC_ICSCR_HSI_TC_TRIMCR_Pos (12U)
  464. #define RCC_ICSCR_HSI_TC_TRIMCR_Msk (0xFUL << RCC_ICSCR_HSI_TC_TRIMCR_Pos) /*!< 0x0000F000 */
  465. #define RCC_ICSCR_HSI_TC_TRIMCR RCC_ICSCR_HSI_TC_TRIMCR_Msk /*!< HSIFS[15:12] bits */
  466. #define RCC_ICSCR_HSI_TC_TRIMCR_0 (0x01UL << RCC_ICSCR_HSI_TC_TRIMCR_Pos) /*!< 0x00001000 */
  467. #define RCC_ICSCR_HSI_TC_TRIMCR_1 (0x02UL << RCC_ICSCR_HSI_TC_TRIMCR_Pos) /*!< 0x00002000 */
  468. #define RCC_ICSCR_HSI_TC_TRIMCR_2 (0x04UL << RCC_ICSCR_HSI_TC_TRIMCR_Pos) /*!< 0x00004000 */
  469. #define RCC_ICSCR_HSI_TC_TRIMCR_3 (0x04UL << RCC_ICSCR_HSI_TC_TRIMCR_Pos) /*!< 0x00008000 */
  470. #define RCC_ICSCR_HSI_FS_CR_Pos (16U)
  471. #define RCC_ICSCR_HSI_FS_CR_Msk (0x3UL << RCC_ICSCR_HSI_FS_CR_Pos)
  472. #define RCC_ICSCR_HSI_FS_CR RCC_ICSCR_HSI_FS_CR_Msk
  473. #define RCC_ICSCR_HSI_FS_CR_0 (0x01UL << RCC_ICSCR_HSI_FS_CR_Pos)
  474. #define RCC_ICSCR_HSI_FS_CR_1 (0x02UL << RCC_ICSCR_HSI_FS_CR_Pos)
  475. /* Set HSI 24M and Triming Data */
  476. void InitRccAndFlashParam(void)
  477. {
  478. RCC_ICSCR_HSI_FS_RESTORE = READ_BIT(RCC->ICSCR, RCC_ICSCR_HSI_FS_CR);
  479. MODIFY_REG(RCC->ICSCR, (RCC_ICSCR_HSI_FS_CR | RCC_ICSCR_HSI_ABS_TRIMCR | RCC_ICSCR_HSI_TC_TRIMCR), RCC_HSICALIBRATION_24MHz);
  480. while (RCC_CR_HSIRDY != READ_BIT(RCC->CR, RCC_CR_HSIRDY));
  481. }
  482. /* Set HSI and Triming Data defult*/
  483. void UnInitRccAndFlashParam(void)
  484. {
  485. MODIFY_REG(RCC->ICSCR, RCC_ICSCR_HSI_FS_CR, RCC_ICSCR_HSI_FS_RESTORE);
  486. switch (RCC_ICSCR_HSI_FS_RESTORE)
  487. {
  488. case RCC_ICSCR_HSI_FS_CR:/* 48MHz */
  489. FLASH->ACR |= FLASH_ACR_LATENCY; /* Wait State */
  490. MODIFY_REG(RCC->ICSCR, (RCC_ICSCR_HSI_FS_CR | RCC_ICSCR_HSI_ABS_TRIMCR | RCC_ICSCR_HSI_TC_TRIMCR),
  491. RCC_HSICALIBRATION_48MHz); /*!< 48MHz HSI calibration trimming value */
  492. break;
  493. case RCC_ICSCR_HSI_FS_CR_1:/* 24MHz */
  494. MODIFY_REG(RCC->ICSCR, (RCC_ICSCR_HSI_FS_CR | RCC_ICSCR_HSI_ABS_TRIMCR | RCC_ICSCR_HSI_TC_TRIMCR),
  495. RCC_HSICALIBRATION_24MHz); /* Set HSI 24M and Triming Data */
  496. break;
  497. case RCC_ICSCR_HSI_FS_CR_0:/* 16MHz */
  498. MODIFY_REG(RCC->ICSCR, (RCC_ICSCR_HSI_FS_CR | RCC_ICSCR_HSI_ABS_TRIMCR | RCC_ICSCR_HSI_TC_TRIMCR),
  499. RCC_HSICALIBRATION_16MHz); /* Set HSI 16M and Triming Data */
  500. break;
  501. default:/* 8MHz */
  502. MODIFY_REG(RCC->ICSCR, (RCC_ICSCR_HSI_FS_CR | RCC_ICSCR_HSI_ABS_TRIMCR | RCC_ICSCR_HSI_TC_TRIMCR),
  503. RCC_HSICALIBRATION_8MHz); /* Set HSI 8M and Triming Data */
  504. break;
  505. }
  506. while (RCC_CR_HSIRDY != READ_BIT(RCC->CR, RCC_CR_HSIRDY));
  507. }