apm32f10x_fmc.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. /*!
  2. * @file apm32f10x_fmc.h
  3. *
  4. * @brief This file contains all the functions prototypes for the FMC firmware library
  5. *
  6. * @version V1.0.4
  7. *
  8. * @date 2022-12-01
  9. *
  10. * @attention
  11. *
  12. * Copyright (C) 2020-2022 Geehy Semiconductor
  13. *
  14. * You may not use this file except in compliance with the
  15. * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
  16. *
  17. * The program is only for reference, which is distributed in the hope
  18. * that it will be useful and instructional for customers to develop
  19. * their software. Unless required by applicable law or agreed to in
  20. * writing, the program is distributed on an "AS IS" BASIS, WITHOUT
  21. * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
  23. * and limitations under the License.
  24. */
  25. /* Define to prevent recursive inclusion */
  26. #ifndef __APM32F10X_FMC_H
  27. #define __APM32F10X_FMC_H
  28. /* Includes */
  29. #include "apm32f10x.h"
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33. /** @addtogroup APM32F10x_StdPeriphDriver
  34. @{
  35. */
  36. /** @addtogroup FMC_Driver FMC Driver
  37. @{
  38. */
  39. /** @defgroup FMC_Macros Macros
  40. @{
  41. */
  42. /* Macros description */
  43. /* Values for APM32 Low and Medium density devices */
  44. #define FLASH_WRP_PAGE_0_3 ((uint32_t)BIT0) /*!< Write protection of page 0 to 3 */
  45. #define FLASH_WRP_PAGE_4_7 ((uint32_t)BIT1) /*!< Write protection of page 4 to 7 */
  46. #define FLASH_WRP_PAGE_8_11 ((uint32_t)BIT2) /*!< Write protection of page 8 to 11 */
  47. #define FLASH_WRP_PAGE_12_15 ((uint32_t)BIT3) /*!< Write protection of page 12 to 15 */
  48. #define FLASH_WRP_PAGE_16_19 ((uint32_t)BIT4) /*!< Write protection of page 16 to 19 */
  49. #define FLASH_WRP_PAGE_20_23 ((uint32_t)BIT5) /*!< Write protection of page 20 to 23 */
  50. #define FLASH_WRP_PAGE_24_27 ((uint32_t)BIT6) /*!< Write protection of page 24 to 27 */
  51. #define FLASH_WRP_PAGE_28_31 ((uint32_t)BIT7) /*!< Write protection of page 28 to 31 */
  52. /* Values for APM32 Medium-density devices */
  53. #define FLASH_WRP_PAGE_32_35 ((uint32_t)BIT8) /*!< Write protection of page 32 to 35 */
  54. #define FLASH_WRP_PAGE_36_39 ((uint32_t)BIT9) /*!< Write protection of page 36 to 39 */
  55. #define FLASH_WRP_PAGE_40_43 ((uint32_t)BIT10) /*!< Write protection of page 40 to 43 */
  56. #define FLASH_WRP_PAGE_44_47 ((uint32_t)BIT11) /*!< Write protection of page 44 to 47 */
  57. #define FLASH_WRP_PAGE_48_51 ((uint32_t)BIT12) /*!< Write protection of page 48 to 51 */
  58. #define FLASH_WRP_PAGE_52_55 ((uint32_t)BIT13) /*!< Write protection of page 52 to 55 */
  59. #define FLASH_WRP_PAGE_56_59 ((uint32_t)BIT14) /*!< Write protection of page 56 to 59 */
  60. #define FLASH_WRP_PAGE_60_63 ((uint32_t)BIT15) /*!< Write protection of page 60 to 63 */
  61. #define FLASH_WRP_PAGE_64_67 ((uint32_t)BIT16) /*!< Write protection of page 64 to 67 */
  62. #define FLASH_WRP_PAGE_68_71 ((uint32_t)BIT17) /*!< Write protection of page 68 to 71 */
  63. #define FLASH_WRP_PAGE_72_75 ((uint32_t)BIT18) /*!< Write protection of page 72 to 75 */
  64. #define FLASH_WRP_PAGE_76_79 ((uint32_t)BIT19) /*!< Write protection of page 76 to 79 */
  65. #define FLASH_WRP_PAGE_80_83 ((uint32_t)BIT20) /*!< Write protection of page 80 to 83 */
  66. #define FLASH_WRP_PAGE_84_87 ((uint32_t)BIT21) /*!< Write protection of page 84 to 87 */
  67. #define FLASH_WRP_PAGE_88_91 ((uint32_t)BIT22) /*!< Write protection of page 88 to 91 */
  68. #define FLASH_WRP_PAGE_92_95 ((uint32_t)BIT23) /*!< Write protection of page 92 to 95 */
  69. #define FLASH_WRP_PAGE_96_99 ((uint32_t)BIT24) /*!< Write protection of page 96 to 99 */
  70. #define FLASH_WRP_PAGE_100_103 ((uint32_t)BIT25) /*!< Write protection of page 100 to 103 */
  71. #define FLASH_WRP_PAGE_104_107 ((uint32_t)BIT26) /*!< Write protection of page 104 to 107 */
  72. #define FLASH_WRP_PAGE_108_111 ((uint32_t)BIT27) /*!< Write protection of page 108 to 111 */
  73. #define FLASH_WRP_PAGE_112_115 ((uint32_t)BIT28) /*!< Write protection of page 112 to 115 */
  74. #define FLASH_WRP_PAGE_116_119 ((uint32_t)BIT29) /*!< Write protection of page 116 to 119 */
  75. #define FLASH_WRP_PAGE_120_123 ((uint32_t)BIT30) /*!< Write protection of page 120 to 123 */
  76. #define FLASH_WRP_PAGE_124_127 ((uint32_t)BIT31) /*!< Write protection of page 124 to 127 */
  77. /* Values only for APM32 High-density devices */
  78. #define FLASH_WRP_PAGE_0_1 ((uint32_t)BIT0) /*!< Write protection of page 0 to 1 */
  79. #define FLASH_WRP_PAGE_2_3 ((uint32_t)BIT1) /*!< Write protection of page 2 to 3 */
  80. #define FLASH_WRP_PAGE_4_5 ((uint32_t)BIT2) /*!< Write protection of page 4 to 5 */
  81. #define FLASH_WRP_PAGE_6_7 ((uint32_t)BIT3) /*!< Write protection of page 6 to 7 */
  82. #define FLASH_WRP_PAGE_8_9 ((uint32_t)BIT4) /*!< Write protection of page 8 to 9 */
  83. #define FLASH_WRP_PAGE_10_11 ((uint32_t)BIT5) /*!< Write protection of page 10 to 11 */
  84. #define FLASH_WRP_PAGE_12_13 ((uint32_t)BIT6) /*!< Write protection of page 12 to 13 */
  85. #define FLASH_WRP_PAGE_14_15 ((uint32_t)BIT7) /*!< Write protection of page 14 to 15 */
  86. #define FLASH_WRP_PAGE_16_17 ((uint32_t)BIT8) /*!< Write protection of page 16 to 17 */
  87. #define FLASH_WRP_PAGE_18_19 ((uint32_t)BIT9) /*!< Write protection of page 18 to 19 */
  88. #define FLASH_WRP_PAGE_20_21 ((uint32_t)BIT10) /*!< Write protection of page 20 to 21 */
  89. #define FLASH_WRP_PAGE_22_23 ((uint32_t)BIT11) /*!< Write protection of page 22 to 23 */
  90. #define FLASH_WRP_PAGE_24_25 ((uint32_t)BIT12) /*!< Write protection of page 24 to 25 */
  91. #define FLASH_WRP_PAGE_26_27 ((uint32_t)BIT13) /*!< Write protection of page 26 to 27 */
  92. #define FLASH_WRP_PAGE_28_29 ((uint32_t)BIT14) /*!< Write protection of page 28 to 29 */
  93. #define FLASH_WRP_PAGE_30_31 ((uint32_t)BIT15) /*!< Write protection of page 30 to 31 */
  94. #define FLASH_WRP_PAGE_32_33 ((uint32_t)BIT16) /*!< Write protection of page 32 to 33 */
  95. #define FLASH_WRP_PAGE_34_35 ((uint32_t)BIT17) /*!< Write protection of page 34 to 35 */
  96. #define FLASH_WRP_PAGE_36_37 ((uint32_t)BIT18) /*!< Write protection of page 36 to 37 */
  97. #define FLASH_WRP_PAGE_38_39 ((uint32_t)BIT19) /*!< Write protection of page 38 to 39 */
  98. #define FLASH_WRP_PAGE_40_41 ((uint32_t)BIT20) /*!< Write protection of page 40 to 41 */
  99. #define FLASH_WRP_PAGE_42_43 ((uint32_t)BIT21) /*!< Write protection of page 42 to 43 */
  100. #define FLASH_WRP_PAGE_44_45 ((uint32_t)BIT22) /*!< Write protection of page 44 to 45 */
  101. #define FLASH_WRP_PAGE_46_47 ((uint32_t)BIT23) /*!< Write protection of page 46 to 47 */
  102. #define FLASH_WRP_PAGE_48_49 ((uint32_t)BIT24) /*!< Write protection of page 48 to 49 */
  103. #define FLASH_WRP_PAGE_50_51 ((uint32_t)BIT25) /*!< Write protection of page 50 to 51 */
  104. #define FLASH_WRP_PAGE_52_53 ((uint32_t)BIT26) /*!< Write protection of page 52 to 53 */
  105. #define FLASH_WRP_PAGE_54_55 ((uint32_t)BIT27) /*!< Write protection of page 54 to 55 */
  106. #define FLASH_WRP_PAGE_56_57 ((uint32_t)BIT28) /*!< Write protection of page 56 to 57 */
  107. #define FLASH_WRP_PAGE_58_59 ((uint32_t)BIT29) /*!< Write protection of page 58 to 59 */
  108. #define FLASH_WRP_PAGE_60_61 ((uint32_t)BIT30) /*!< Write protection of page 60 to 61 */
  109. #define FLASH_WRP_PAGE_62_127 ((uint32_t)BIT31) /*!< Write protection of page 62 to 127 */
  110. #define FMC_WRP_PAGE_ALL ((uint32_t)0xFFFFFFFF) /*!< Write protection of page all */
  111. /**@} end of group FMC_Macros*/
  112. /** @defgroup FMC_Enumerations Enumerations
  113. @{
  114. */
  115. /**
  116. * @brief Flash Latency
  117. */
  118. typedef enum
  119. {
  120. FMC_LATENCY_0,
  121. FMC_LATENCY_1,
  122. FMC_LATENCY_2
  123. } FMC_LATENCY_T;
  124. /**
  125. * @brief FMC Status
  126. */
  127. typedef enum
  128. {
  129. FMC_STATUS_BUSY = 1, /*!< flash busy */
  130. FMC_STATUS_ERROR_PG, /*!< flash programming error */
  131. FMC_STATUS_ERROR_WRP, /*!< flash write protection error */
  132. FMC_STATUS_COMPLETE, /*!< flash operation complete */
  133. FMC_STATUS_TIMEOUT /*!< flash time out */
  134. } FMC_STATUS_T;
  135. /**
  136. * @brief Option Bytes IWatchdog
  137. */
  138. typedef enum
  139. {
  140. OB_IWDT_HARD = 0x0000,
  141. OB_IWDT_SOTF = 0x0001
  142. } OB_IWDT_T;
  143. /**
  144. * @brief Option Bytes nRST STOP
  145. */
  146. typedef enum
  147. {
  148. OB_STOP_RST = 0x0000,
  149. OB_STOP_NORST = 0x0002
  150. } OB_STOP_T;
  151. /**
  152. * @brief Option Bytes nRST STDBY
  153. */
  154. typedef enum
  155. {
  156. OB_STDBY_RST = 0x0000,
  157. OB_STDBY_NORST = 0x0004
  158. } OB_STDBY_T;
  159. /**
  160. * @brief FMC Interrupts
  161. */
  162. typedef enum
  163. {
  164. FMC_INT_ERR,
  165. FMC_INT_OC
  166. } FMC_INT_T;
  167. /**
  168. * @brief FMC flag
  169. */
  170. typedef enum
  171. {
  172. FMC_FLAG_BUSY = 0x00000001, /*!< FMC Busy flag */
  173. FMC_FLAG_OC = 0x00000020, /*!< FMC End of Operation flag */
  174. FMC_FLAG_PE = 0x00000004, /*!< FMC Program error flag */
  175. FMC_FLAG_WPE = 0x00000010, /*!< FMC Write protected error flag */
  176. FMC_FLAG_OBE = 0x10000001, /*!< FMC Option Byte error flag */
  177. } FMC_FLAG_T;
  178. /**@} end of group FMC_Enumerations*/
  179. /** @defgroup FMC_Structures Structures
  180. @{
  181. */
  182. /**
  183. * @brief User Option byte config struct definition
  184. */
  185. typedef struct
  186. {
  187. OB_IWDT_T iwdtSet;
  188. OB_STOP_T stopSet;
  189. OB_STDBY_T stdbySet;
  190. } FMC_UserConfig_T;
  191. /**@} end of group FMC_Structure*/
  192. /** @defgroup FMC_Functions Functions
  193. @{
  194. */
  195. /* Initialization and Configuration */
  196. void FMC_ConfigLatency(FMC_LATENCY_T latency);
  197. void FMC_EnableHalfCycleAccess(void);
  198. void FMC_DisableHalfCycleAccess(void);
  199. void FMC_EnablePrefetchBuffer(void);
  200. void FMC_DisablePrefetchBuffer(void);
  201. /* Lock management */
  202. void FMC_Unlock(void);
  203. void FMC_Lock(void);
  204. /* Erase management */
  205. FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr);
  206. FMC_STATUS_T FMC_EraseAllPage(void);
  207. FMC_STATUS_T FMC_EraseOptionBytes(void);
  208. /* Read Write management */
  209. FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data);
  210. FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data);
  211. FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data);
  212. FMC_STATUS_T FMC_EnableWriteProtection(uint32_t page);
  213. FMC_STATUS_T FMC_EnableReadOutProtection(void);
  214. FMC_STATUS_T FMC_DisableReadOutProtection(void);
  215. FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig);
  216. uint32_t FMC_ReadUserOptionByte(void);
  217. uint32_t FMC_ReadOptionByteWriteProtection(void);
  218. uint8_t FMC_GetReadProtectionStatus(void);
  219. uint8_t FMC_ReadPrefetchBufferStatus(void);
  220. /* Interrupts and flags */
  221. void FMC_EnableInterrupt(FMC_INT_T interrupt);
  222. void FMC_DisableInterrupt(FMC_INT_T interrupt);
  223. uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag);
  224. void FMC_ClearStatusFlag(uint32_t flag);
  225. /* Status management */
  226. FMC_STATUS_T FMC_ReadStatus(void);
  227. FMC_STATUS_T FMC_WaitForLastOperation(uint32_t timeOut);
  228. /**@} end of group FMC_Functions*/
  229. /**@} end of group FMC_Driver*/
  230. /**@} end of group APM32F10x_StdPeriphDriver*/
  231. #ifdef __cplusplus
  232. }
  233. #endif
  234. #endif /* __APM32F10X_FMC_H */