ciu32f003_std_flash(2).h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_flash.h
  4. * @author MCU Ecosystem Development Team
  5. * @brief FLASH STD库驱动头文件。
  6. * 提供FLASH相关的STD库操作函数声明、数据类型以及常量的定义。
  7. *
  8. *
  9. **************************************************************************************************
  10. * @attention
  11. * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
  12. *
  13. **************************************************************************************************
  14. */
  15. /*避免头文件重复引用*/
  16. #ifndef CIU32F003_STD_FLASH_H
  17. #define CIU32F003_STD_FLASH_H
  18. /************************************************************************************************/
  19. /**
  20. * @addtogroup CIU32F003_STD_Driver
  21. * @{
  22. */
  23. /**
  24. * @defgroup FLASH FLASH
  25. * @brief FLASH存储器的STD库驱动
  26. * @{
  27. */
  28. /************************************************************************************************/
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. /*------------------------------------------includes--------------------------------------------*/
  33. #include "ciu32f003_std_common.h"
  34. /*-------------------------------------------define---------------------------------------------*/
  35. /************************************************************************************************/
  36. /**
  37. * @defgroup FLASH_Constants FLASH Constants
  38. * @brief FLASH常量定义及宏定义
  39. * @{
  40. *
  41. */
  42. /************************************************************************************************/
  43. /* Flash读取访问等待周期 */
  44. #define FLASH_LATENCY_0CLK FLASH_ACR_LATENCY_0CLK /**< 等待周期:0 HCLK */
  45. #define FLASH_LATENCY_1CLK FLASH_ACR_LATENCY_1CLK /**< 等待周期:1 HCLK */
  46. /* Flash控制寄存器解锁密钥 */
  47. #define FLASH_CR_KEY1 (0xE57A1A85U) /**< Flash控制寄存器解锁密钥1 */
  48. #define FLASH_CR_KEY2 (0x7C6E8391U) /**< Flash控制寄存器解锁密钥2 */
  49. /* Flash选项字节解锁密钥 */
  50. #define FLASH_OPT_KEY1 (0x6A894D7BU) /**< Flash选项字节解锁密钥1 */
  51. #define FLASH_OPT_KEY2 (0x7C311F5AU) /**< Flash选项字节解锁密钥2 */
  52. /* Flash操作状态 */
  53. #define FLASH_FLAG_EOP FLASH_SR_EOP /**< Flash操作完成标志 */
  54. #define FLASH_FLAG_BSY FLASH_SR_BSY /**< Flash操作状态标志 */
  55. #define FLASH_FLAG_OPTVERR FLASH_SR_OPTVERR /**< Flash option bytes校验错误标志 */
  56. #define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /**< Flash写保护错误标志 */
  57. /* Flash中断源 */
  58. #define FLASH_INTERRUPT_OPERR FLASH_CR_OPERRIE /**< Flash操作异常中断 */
  59. #define FLASH_INTERRUPT_EOP FLASH_CR_EOPIE /**< Flash操作完成中断 */
  60. /* Flash操作模式 */
  61. #define FLASH_MODE_IDLE FLASH_CR_OP_MODE_IDLE /**< Flash退出擦除编程模式 */
  62. #define FLASH_MODE_PAGE_ERASE FLASH_CR_OP_MODE_PAGE_ERASE /**< Flash页擦除模式 */
  63. #define FLASH_MODE_MASS_ERASE FLASH_CR_OP_MODE_MASS_ERASE /**< Flash批量擦除模式 */
  64. #define FLASH_MODE_PROGRAM FLASH_CR_OP_MODE_PROGRAM /**< Flash编程模式 */
  65. /* 选项字节1 位域使能 */
  66. #define FLASH_PIN_MODE_MASK FLASH_OPTR1_NRST_SWD_MODE_MASK /**< NRST SWD引脚功能选择 */
  67. #define FLASH_PIN_MODE_NRST_SWD FLASH_OPTR1_NRST_SWD_MODE_0 /**< PC0: NRST PB6: SWDIO */
  68. #define FLASH_PIN_MODE_GPIO_SWD FLASH_OPTR1_NRST_SWD_MODE_2 /**< PC0: GPIO PB6: SWDIO */
  69. #define FLASH_PIN_MODE_SWD_GPIO FLASH_OPTR1_NRST_SWD_MODE_3 /**< PC0: SWDIO PB6: GPIO */
  70. #define FLASH_BOR_DISABLE (0x00000000U) /**< BOR禁止 */
  71. #define FLASH_BOR_ENABLE FLASH_OPTR1_BOR_EN /**< BOR使能 */
  72. #define FLASH_BOR_LEVEL_0 FLASH_OPTR1_BOR_LEVEL_0 /**< BOR检测电压上升/下降阈值:2.0/1.9V */
  73. #define FLASH_BOR_LEVEL_1 FLASH_OPTR1_BOR_LEVEL_1 /**< BOR检测电压上升/下降阈值:2.4/2.3V */
  74. #define FLASH_BOR_LEVEL_2 FLASH_OPTR1_BOR_LEVEL_2 /**< BOR检测电压上升/下降阈值:2.8/2.7V */
  75. #define FLASH_BOR_LEVEL_3 FLASH_OPTR1_BOR_LEVEL_3 /**< BOR检测电压上升/下降阈值:3.2/3.1V */
  76. #define FLASH_RDP_LEVEL_MASK FLASH_OPTR1_RDPRP_MASK /**< RDP配置域 */
  77. #define FLASH_RDP_LEVEL_0 (0x00000000U) /**< RDP保护等级0 */
  78. #define FLASH_RDP_LEVEL_1 (0x00000001U) /**< RDP保护等级1 */
  79. /* 选项字节2 位域使能 */
  80. #define FLASH_IWDG_STOP_MODE_STOP (0x00000000U) /**< IWDG在Stop模式下停止计数 */
  81. #define FLASH_IWDG_STOP_MODE_NORMAL FLASH_OPTR2_IWDG_STOP /**< IWDG在Stop模式下正常计数 */
  82. #define FLASH_STOP_RESET_ENABLE (0x00000000U) /**< 执行进入Stop模式操作,不进入Stop,产生复位 */
  83. #define FLASH_STOP_RESET_DISABLE FLASH_OPTR2_RST_STOP /**< 执行进入Stop模式操作,正常进入Stop,不产生复位 */
  84. /* 写保护区域配置 */
  85. #define FLASH_WRP_AREA_0 (0x0000003EU) /**< 写保护区域:0x00000000U ~ 0x00000FFF */
  86. #define FLASH_WRP_AREA_1 (0x0000003DU) /**< 写保护区域:0x00001000U ~ 0x00001FFF */
  87. #define FLASH_WRP_AREA_2 (0x0000003BU) /**< 写保护区域:0x00002000U ~ 0x00002FFF */
  88. #define FLASH_WRP_AREA_3 (0x00000037U) /**< 写保护区域:0x00003000U ~ 0x00003FFF */
  89. #define FLASH_WRP_AREA_4 (0x0000002FU) /**< 写保护区域:0x00004000U ~ 0x00004FFF */
  90. #define FLASH_WRP_AREA_5 (0x0000001FU) /**< 写保护区域:0x00005000U ~ 0x00005FFF */
  91. #define FLASH_WRP_AREA_ALL (0x00000000U) /**< User flash区域全部写保护 */
  92. #define FLASH_WRP_AREA_NONE (0x0000003FU) /**< User flash区域写保护关闭 */
  93. /**
  94. * @brief 计算Option Bytes区编程值
  95. * @param VAL OB区低16位预期编程值
  96. * @retval OB高16位取反后与低16位相加的值
  97. */
  98. #define FLASH_OB_DATA_CALCULATE(VAL) ((uint32_t)(((VAL) & 0xFFFF) | ((~(VAL & 0xFFFF)) << 16)))
  99. /**
  100. * @}
  101. */
  102. /*-------------------------------------------functions------------------------------------------*/
  103. /************************************************************************************************/
  104. /**
  105. * @defgroup FLASH_External_Functions FLASH External Functions
  106. * @brief FLASH对外函数
  107. * @{
  108. *
  109. */
  110. /************************************************************************************************/
  111. /**
  112. * @brief Flash控制寄存器解锁
  113. * @note FLASH控制器解锁后操作CRKEY寄存器会产生总线错误并锁定写保护,直至下次复位
  114. * @retval 无
  115. */
  116. __STATIC_INLINE void std_flash_unlock(void)
  117. {
  118. if ((FLASH->CR & FLASH_CR_LOCK) == FLASH_CR_LOCK)
  119. {
  120. FLASH->CRKEY = FLASH_CR_KEY1;
  121. FLASH->CRKEY = FLASH_CR_KEY2;
  122. }
  123. }
  124. /**
  125. * @brief Flash控制寄存器锁定
  126. * @retval 无
  127. */
  128. __STATIC_INLINE void std_flash_lock(void)
  129. {
  130. FLASH->CR |= FLASH_CR_LOCK;
  131. }
  132. /**
  133. * @brief 读取Flash锁定状态
  134. * @retval uint32_t Flash锁定状态
  135. * @arg 非0: 锁定
  136. * @arg 0: 未锁定
  137. */
  138. __STATIC_INLINE uint32_t std_flash_get_lock_status(void)
  139. {
  140. return (FLASH->CR & FLASH_CR_LOCK);
  141. }
  142. /**
  143. * @brief Flash选项字节解锁
  144. * @note FLASH 选项字节解锁后操作OPTKEY寄存器会产生总线错误并锁定写保护,直至下次复位
  145. * @retval 无
  146. */
  147. __STATIC_INLINE void std_flash_opt_unlock(void)
  148. {
  149. if ((FLASH->CR & FLASH_CR_OPTLOCK) == FLASH_CR_OPTLOCK)
  150. {
  151. FLASH->OPTKEY = FLASH_OPT_KEY1;
  152. FLASH->OPTKEY = FLASH_OPT_KEY2;
  153. }
  154. }
  155. /**
  156. * @brief Flash选项字节锁定
  157. * @retval 无
  158. */
  159. __STATIC_INLINE void std_flash_opt_lock(void)
  160. {
  161. FLASH->CR |= FLASH_CR_OPTLOCK;
  162. }
  163. /**
  164. * @brief 读取Flash选项字节锁定状态
  165. * @retval uint32_t Flash选项字节锁定状态
  166. * @arg 非0: 锁定
  167. * @arg 0: 未锁定
  168. */
  169. __STATIC_INLINE uint32_t std_flash_get_opt_lock_status(void)
  170. {
  171. return (FLASH->CR & FLASH_CR_OPTLOCK);
  172. }
  173. /**
  174. * @brief 设置FLASH读取访问等待周期
  175. * @param latency 读取访问等待周期
  176. * @arg FLASH_LATENCY_0CLK
  177. * @arg FLASH_LATENCY_1CLK
  178. * @retval 无
  179. */
  180. __STATIC_INLINE void std_flash_set_latency(uint32_t latency)
  181. {
  182. MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, latency);
  183. }
  184. /**
  185. * @brief 读取FLASH读取访问等待周期
  186. * @retval uint32_t 读取访问等待周期
  187. * @arg FLASH_LATENCY_0CLK
  188. * @arg FLASH_LATENCY_1CLK
  189. */
  190. __STATIC_INLINE uint32_t std_flash_get_latency(void)
  191. {
  192. return (FLASH->ACR & FLASH_ACR_LATENCY);
  193. }
  194. /**
  195. * @brief 使能FLASH中断
  196. * @param interrupts 中断源
  197. * @arg FLASH_INTERRUPT_OPERR
  198. * @arg FLASH_INTERRUPT_EOP
  199. * @retval 无
  200. */
  201. __STATIC_INLINE void std_flash_interrupt_enable(uint32_t interrupts)
  202. {
  203. FLASH->CR |= interrupts;
  204. }
  205. /**
  206. * @brief 禁止FLASH中断
  207. * @param interrupts 中断源
  208. * @arg FLASH_INTERRUPT_OPERR
  209. * @arg FLASH_INTERRUPT_EOP
  210. * @retval 无
  211. */
  212. __STATIC_INLINE void std_flash_interrupt_disable(uint32_t interrupts)
  213. {
  214. FLASH->CR &= (~interrupts);
  215. }
  216. /**
  217. * @brief 读取FLASH中断使能状态
  218. * @param interrupt 中断源
  219. * @arg FLASH_INTERRUPT_OPERR
  220. * @arg FLASH_INTERRUPT_EOP
  221. * @retval uint32_t FLASH中断使能状态
  222. * @arg 非0: 使能
  223. * @arg 0: 禁止
  224. */
  225. __STATIC_INLINE uint32_t std_flash_get_interrupt_enable(uint32_t interrupt)
  226. {
  227. return (FLASH->CR & interrupt);
  228. }
  229. /**
  230. * @brief 读取FLASH状态标志
  231. * @param flag 状态标志
  232. * @arg FLASH_FLAG_EOP
  233. * @arg FLASH_FLAG_BSY
  234. * @arg FLASH_FLAG_OPTVERR
  235. * @arg FLASH_FLAG_WRPERR
  236. * @retval uint32_t FLASH状态标志
  237. * @arg 非0: 标志位置位
  238. * @arg 0: 标志位清除
  239. */
  240. __STATIC_INLINE uint32_t std_flash_get_flag(uint32_t flag)
  241. {
  242. return (FLASH->SR & flag);
  243. }
  244. /**
  245. * @brief 清除FLASH状态标志
  246. * @param flags 状态标志组合
  247. * @arg FLASH_FLAG_EOP
  248. * @arg FLASH_FLAG_WRPERR
  249. * @retval 无
  250. */
  251. __STATIC_INLINE void std_flash_clear_flag(uint32_t flags)
  252. {
  253. FLASH->SR = flags;
  254. }
  255. /**
  256. * @brief 设置Flash操作模式
  257. * @param mode 擦除模式
  258. * @arg FLASH_MODE_IDLE
  259. * @arg FLASH_MODE_PAGE_ERASE
  260. * @arg FLASH_MODE_MASS_ERASE
  261. * @arg FLASH_MODE_PROGRAM
  262. * @retval 无
  263. */
  264. __STATIC_INLINE void std_flash_set_operate_mode(uint32_t mode)
  265. {
  266. MODIFY_REG(FLASH->CR, FLASH_CR_OP_MODE, mode);
  267. }
  268. /**
  269. * @brief 读取选项字节寄存器1
  270. * @retval uint32_t 选项字节1加载值
  271. */
  272. __STATIC_INLINE uint32_t std_flash_get_opt1(void)
  273. {
  274. return (FLASH->OPTR1);
  275. }
  276. /**
  277. * @brief 读取FLASH读保护等级
  278. * @retval uint32_t FLASH读保护等级
  279. * @arg FLASH_RDP_LEVEL_0
  280. * @arg FLASH_RDP_LEVEL_1
  281. */
  282. __STATIC_INLINE uint32_t std_flash_get_rdp_level(void)
  283. {
  284. return (FLASH->OPTR1 & FLASH_OPTR1_RDPRP);
  285. }
  286. /**
  287. * @brief 读取BOR阈值等级
  288. * @retval uint32_t FLASH读保护等级
  289. * @arg FLASH_BOR_LEVEL_0
  290. * @arg ...
  291. * @arg FLASH_BOR_LEVEL_3
  292. */
  293. __STATIC_INLINE uint32_t std_flash_get_bor_level(void)
  294. {
  295. return (FLASH->OPTR1 & FLASH_OPTR1_BOR_LEVEL);
  296. }
  297. /**
  298. * @brief 读取BOR使能控制
  299. * @retval uint32_t BOR使能控制
  300. * @arg FLASH_BOR_DISABLE
  301. * @arg FLASH_BOR_ENABLE
  302. */
  303. __STATIC_INLINE uint32_t std_flash_get_bor_en(void)
  304. {
  305. return (FLASH->OPTR1 & FLASH_OPTR1_BOR_EN);
  306. }
  307. /**
  308. * @brief 读取NRST SWD引脚功能控制
  309. * @retval uint32_t NRST SWD引脚功能选择
  310. * @arg FLASH_PIN_MODE_NRST_SWD
  311. * @arg FLASH_PIN_MODE_GPIO_SWD
  312. * @arg FLASH_PIN_MODE_SWD_GPIO
  313. */
  314. __STATIC_INLINE uint32_t std_flash_get_nrst_swd_mode(void)
  315. {
  316. return (FLASH->OPTR1 & FLASH_PIN_MODE_MASK);
  317. }
  318. /**
  319. * @brief 读取选项字节寄存器2
  320. * @retval uint32_t 选项字节2加载值
  321. */
  322. __STATIC_INLINE uint32_t std_flash_get_opt2(void)
  323. {
  324. return (FLASH->OPTR2);
  325. }
  326. /**
  327. * @brief 读取IWDG在STOP模式下计数器停止控制
  328. * @retval uint32_t IWDG_STOP设置
  329. * @arg FLASH_IWDG_STOP_MODE_STOP
  330. * @arg FLASH_IWDG_STOP_MODE_NORMAL
  331. */
  332. __STATIC_INLINE uint32_t std_flash_get_iwdg_stop(void)
  333. {
  334. return (FLASH->OPTR2 & FLASH_OPTR2_IWDG_STOP);
  335. }
  336. /**
  337. * @brief 读取进入STOP模式是否复位的配置
  338. * @retval uint32_t RST_STOP设置
  339. * @arg FLASH_STOP_RESET_ENABLE
  340. * @arg FLASH_STOP_RESET_DISABLE
  341. */
  342. __STATIC_INLINE uint32_t std_flash_get_rst_stop(void)
  343. {
  344. return (FLASH->OPTR2 & FLASH_OPTR2_RST_STOP);
  345. }
  346. /**
  347. * @brief 读取写保护区配置值
  348. * @retval uint32_t 写保护区配置值
  349. */
  350. __STATIC_INLINE uint32_t std_flash_get_wrp(void)
  351. {
  352. return (FLASH->WRP & FLASH_WRP_WRP);
  353. }
  354. /**
  355. * @brief 读取芯片型号
  356. * @retval uint32_t 芯片型号
  357. */
  358. __STATIC_INLINE uint32_t std_flash_get_device_type(void)
  359. {
  360. return (*(uint32_t *)DEVICE_TYPE);
  361. }
  362. /**
  363. * @brief 读取Flash空间大小
  364. * @retval uint32_t Flash空间大小
  365. */
  366. __STATIC_INLINE uint32_t std_flash_get_flash_size(void)
  367. {
  368. return (*(uint32_t *)USERFLASH_SIZE);
  369. }
  370. /**
  371. * @brief 读取SRAM空间大小
  372. * @retval uint32_t SRAM空间大小
  373. */
  374. __STATIC_INLINE uint32_t std_flash_get_sram_size(void)
  375. {
  376. return (*(uint32_t *)SRAM_SIZE);
  377. }
  378. std_status_t std_flash_erase(uint32_t mode, uint32_t address);
  379. std_status_t std_flash_word_program(uint32_t address, uint32_t prog_data);
  380. /**
  381. * @}
  382. */
  383. #ifdef __cplusplus
  384. }
  385. #endif
  386. /**
  387. * @}
  388. */
  389. /**
  390. * @}
  391. */
  392. #endif /* CIU32F003_STD_FLASH_H */