fmc_reg.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. /**************************************************************************//**
  2. * @file fmc_reg.h
  3. * @version V1.00
  4. * @brief FMC register definition header file
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. * @copyright (C) 2018 Nuvoton Technology Corp. All rights reserved.
  8. *****************************************************************************/
  9. #ifndef __FMC_REG_H__
  10. #define __FMC_REG_H__
  11. #if defined ( __CC_ARM )
  12. #pragma anon_unions
  13. #endif
  14. /**
  15. @addtogroup REGISTER Control Register
  16. @{
  17. */
  18. /**
  19. @addtogroup FMC Flash Memory Controller(FMC)
  20. Memory Mapped Structure for FMC Controller
  21. @{ */
  22. typedef struct
  23. {
  24. /**
  25. * @var FMC_T::ISPCTL
  26. * Offset: 0x00 ISP Control Register
  27. * ---------------------------------------------------------------------------------------------------
  28. * |Bits |Field |Descriptions
  29. * | :----: | :----: | :---- |
  30. * |[0] |ISPEN |ISP Enable Bit (Write Protection)
  31. * | | |ISP function enable bit. Set this bit to enable ISP function.
  32. * | | |0 = ISP function Disabled.
  33. * | | |1 = ISP function Enabled.
  34. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  35. * |[1] |BS |Boot Select (Write Protection)
  36. * | | |Set/clear this bit to select next booting from LDROM/APROM, respectively.
  37. * | | |This bit also functions as chip booting status flag, which can be used to check where chip booted from.
  38. * | | |This bit is initiated with the inversed value of CBS[1] (CONFIG0[7]) after any reset is happened except CPU reset (RSTS_CPU is 1) or system reset (RSTS_SYS) is happened.
  39. * | | |0 = Booting from APROM.
  40. * | | |1 = Booting from LDROM.
  41. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  42. * |[2] |SPUEN |SPROM Update Enable Bit (Write Protection)
  43. * | | |0 = SPROM cannot be updated.
  44. * | | |1 = SPROM can be updated.
  45. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  46. * |[3] |APUEN |APROM Update Enable Bit (Write Protection)
  47. * | | |0 = APROM cannot be updated when the chip runs in APROM.
  48. * | | |1 = APROM can be updated when the chip runs in APROM.
  49. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  50. * |[4] |CFGUEN |CONFIG Update Enable Bit (Write Protection)
  51. * | | |0 = CONFIG cannot be updated.
  52. * | | |1 = CONFIG can be updated.
  53. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  54. * |[5] |LDUEN |LDROM Update Enable Bit (Write Protection)
  55. * | | |LDROM update enable bit.
  56. * | | |0 = LDROM cannot be updated.
  57. * | | |1 = LDROM can be updated.
  58. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  59. * |[6] |ISPFF |ISP Fail Flag (Write Protection)
  60. * | | |This bit is set by hardware when a triggered ISP meets any of the following conditions:
  61. * | | |This bit needs to be cleared by writing 1 to it.
  62. * | | |(1) APROM writes to itself if APUEN is set to 0.
  63. * | | |(2) LDROM writes to itself if LDUEN is set to 0.
  64. * | | |(3) CONFIG is erased/programmed if CFGUEN is set to 0.
  65. * | | |(4) SPROM is erased/programmed if SPUEN is set to 0.
  66. * | | |(5) SPROM is programmed at SPROM secured mode.
  67. * | | |(6) Page Erase command at LOCK mode with ICE connection.
  68. * | | |(7) Erase or Program command at brown-out detected.
  69. * | | |(8) Destination address is illegal, such as over an available range.
  70. * | | |(9) Invalid ISP commands.
  71. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  72. * @var FMC_T::ISPADDR
  73. * Offset: 0x04 ISP Address Register
  74. * ---------------------------------------------------------------------------------------------------
  75. * |Bits |Field |Descriptions
  76. * | :----: | :----: | :---- |
  77. * |[31:0] |ISPADDR |ISP Address
  78. * | | |The NuMicro M031 series is equipped with embedded flash.
  79. * | | |ISPADDR[1:0] must be kept 00 for ISP 32-bit operation and ISPADR[8:0] must be kept all 0 for Vector Page Re-map Command.
  80. * | | |For CRC32 Checksum Calculation command, this field is the flash starting address for checksum calculation, 512 bytes alignment is necessary for checksum calculation.
  81. * @var FMC_T::ISPDAT
  82. * Offset: 0x08 ISP Data Register
  83. * ---------------------------------------------------------------------------------------------------
  84. * |Bits |Field |Descriptions
  85. * | :----: | :----: | :---- |
  86. * |[31:0] |ISPDAT |ISP Data
  87. * | | |Write data to this register before ISP program operation.
  88. * | | |Read data from this register after ISP read operation.
  89. * | | |For Run CRC32 Checksum Calculation command, ISPDAT is the memory size (byte) and 512 bytes alignment.
  90. * | | |For ISP Read Checksum command, ISPDAT is the checksum result.
  91. * | | |If ISPDAT = 0x0000_0000, it means that (1) the checksum calculation is in progress, or (2) the memory range for checksum calculation is incorrect.
  92. * @var FMC_T::ISPCMD
  93. * Offset: 0x0C ISP Command Register
  94. * ---------------------------------------------------------------------------------------------------
  95. * |Bits |Field |Descriptions
  96. * | :----: | :----: | :---- |
  97. * |[6:0] |CMD |ISP CMD
  98. * | | |ISP command table is shown below:
  99. * | | |0x00 = FLASH Read.
  100. * | | |0x04 = Read Unique ID..
  101. * | | |0x0B = Read Company ID.
  102. * | | |0x0C = Read Device ID.
  103. * | | |0x0D = Read CRC32 Checksum.
  104. * | | |0x21 = FLASH 32-bit Program.
  105. * | | |0x22 = FLASH Page Erase..
  106. * | | |0x2D = Run CRC32 Checksum Calculation.
  107. * | | |0x2E = Vector Remap.
  108. * | | |The other commands are invalid.
  109. * @var FMC_T::ISPTRG
  110. * Offset: 0x10 ISP Trigger Control Register
  111. * ---------------------------------------------------------------------------------------------------
  112. * |Bits |Field |Descriptions
  113. * | :----: | :----: | :---- |
  114. * |[0] |ISPGO |ISP Start Trigger (Write Protection)
  115. * | | |Write 1 to start ISP operation and this bit will be cleared to 0 by hardware automatically when ISP operation is finished.
  116. * | | |0 = ISP operation is finished.
  117. * | | |1 = ISP is progressed.
  118. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  119. * @var FMC_T::DFBA
  120. * Offset: 0x14 Data Flash Base Address
  121. * ---------------------------------------------------------------------------------------------------
  122. * |Bits |Field |Descriptions
  123. * | :----: | :----: | :---- |
  124. * |[31:0] |DFBA |Data Flash Base Address
  125. * | | |This register indicates Data Flash start address. It is a read only register.
  126. * | | |The Data Flash is shared with APROM. the content of this register is loaded from CONFIG1.
  127. * | | |This register is valid when DFEN (CONFIG0[0]) =0.
  128. * @var FMC_T::FTCTL
  129. * Offset: 0x18 Flash Access Time Control Register
  130. * ---------------------------------------------------------------------------------------------------
  131. * |Bits |Field |Descriptions
  132. * | :----: | :----: | :---- |
  133. * |[6:4] |FOM |Frequency Optimization Mode (Write Protect)
  134. * | | |The NuMicro Mini58TM series support adjustable flash access timing to optimize the flash access cycles in different working frequency.
  135. * | | |0x1 = Frequency <= 24MHz..
  136. * | | |Others = Frequency <= 50MHz.
  137. * | | |Note: This bit is write-protected. Refer to the SYS_REGLCTL register.
  138. * @var FMC_T::ISPSTS
  139. * Offset: 0x40 ISP Status Register
  140. * ---------------------------------------------------------------------------------------------------
  141. * |Bits |Field |Descriptions
  142. * | :----: | :----: | :---- |
  143. * |[0] |ISPBUSY |ISP BUSY (Read Only)
  144. * | | |0 = ISP operation is finished.
  145. * | | |1 = ISP operation is busy.
  146. * |[2:1] |CBS |Boot Selection of CONFIG (Read Only)
  147. * | | |This bit is initiated with the CBS (CONFIG0[7:6]) after any reset is happened except CPU reset (RSTS_CPU is 1) or system reset (RSTS_SYS) is happened.
  148. * | | |00 = LDROM with IAP mode.
  149. * | | |01 = LDROM without IAP mode.
  150. * | | |10 = APROM with IAP mode.
  151. * | | |11 = APROM without IAP mode.
  152. * |[6] |ISPFF |ISP Fail Flag (Write Protection)
  153. * | | |This bit is the mirror of ISPFF (FMC_ISPCTL[6]), it needs to be cleared by writing 1 to FMC_ISPCTL[6] or FMC_ISPSTS[6].
  154. * | | |This bit is set by hardware when a triggered ISP meets any of the following conditions:
  155. * | | |(1) APROM writes to itself if APUEN is set to 0.
  156. * | | |(2) LDROM writes to itself if LDUEN is set to 0.
  157. * | | |(3) CONFIG is erased/programmed if CFGUEN is set to 0.
  158. * | | |(4) SPROM is erased/programmed if SPUEN is set to 0.
  159. * | | |(5) SPROM is programmed at SPROM secured mode.
  160. * | | |(6) Page Erase command at LOCK mode with ICE connection.
  161. * | | |(7) Erase or Program command at brown-out detected.
  162. * | | |(8) Destination address is illegal, such as over an available range.
  163. * | | |(9) Invalid ISP commands.
  164. * |[29:9] |VECMAP |Vector Page Mapping Address (Read Only)
  165. * | | |All access to 0x0000_0000~0x0000_01FF is remapped to the Flash memory or SRAM address {VECMAP[20:0], 9'h000} ~ {VECMAP[20:0], 9'h1FF}, except SPROM.
  166. * | | |VECMAP [20:19] = 00 system vector address is mapped to Flash memory.
  167. * | | |VECMAP [20:19] = 10 system vector address is mapped to SRAM memory.
  168. * | | |VECMAP [18:12] should be 0.All access to 0x0000_0000~0x0000_01FF is remapped to the flash memory address {VECMAP[11:0], 9'h000} ~ {VECMAP[11:0], 9'h1FF}
  169. * |[31] |SCODE |Security Code Active Flag
  170. * | | |This bit is set to 1 by hardware when detecting SPROM secured code is active at flash initialization, or software writes 1 to this bit to make secured code active; this bit is only cleared by SPROM page erase operation.
  171. * | | |0 = SPROM secured code is inactive.
  172. * | | |1 = SPROM secured code is active.
  173. */
  174. __IO uint32_t ISPCTL; /*!< [0x0000] ISP Control Register */
  175. __IO uint32_t ISPADDR; /*!< [0x0004] ISP Address Register */
  176. __IO uint32_t ISPDAT; /*!< [0x0008] ISP Data Register */
  177. __IO uint32_t ISPCMD; /*!< [0x000c] ISP Command Register */
  178. __IO uint32_t ISPTRG; /*!< [0x0010] ISP Trigger Control Register */
  179. __I uint32_t DFBA; /*!< [0x0014] Data Flash Base Address */
  180. __IO uint32_t FTCTL; /*!< [0x0018] Flash Access Time Control Register */
  181. __IO uint32_t ICPCTL; /*!< [0x001C] Flash ICP Enable Control Register */
  182. __I uint32_t RESERVE0[8];
  183. __IO uint32_t ISPSTS; /*!< [0x0040] ISP Status Register */
  184. __I uint32_t RESERVE1[15];
  185. __IO uint32_t MPDAT0; /*!< [0x0080] ISP Data0 Register */
  186. __IO uint32_t MPDAT1; /*!< [0x0084] ISP Data1 Register */
  187. __IO uint32_t MPDAT2; /*!< [0x0088] ISP Data2 Register */
  188. __IO uint32_t MPDAT3; /*!< [0x008c] ISP Data3 Register */
  189. __I uint32_t RESERVE2[12];
  190. __I uint32_t MPSTS; /*!< [0x00c0] ISP Multi-Program Status Register */
  191. __I uint32_t MPADDR; /*!< [0x00c4] ISP Multi-Program Address Register */
  192. __I uint32_t RESERVE3[0x3CD];
  193. __I uint32_t VERSION; /*!< [0x0FFC] FMC Version Register */
  194. } FMC_T;
  195. /**
  196. @addtogroup FMC_CONST FMC Bit Field Definition
  197. Constant Definitions for FMC Controller
  198. @{ */
  199. #define FMC_ISPCTL_ISPEN_Pos (0) /*!< FMC_T::ISPCTL: ISPEN Position */
  200. #define FMC_ISPCTL_ISPEN_Msk (0x1ul << FMC_ISPCTL_ISPEN_Pos) /*!< FMC_T::ISPCTL: ISPEN Mask */
  201. #define FMC_ISPCTL_BS_Pos (1) /*!< FMC_T::ISPCTL: BS Position */
  202. #define FMC_ISPCTL_BS_Msk (0x1ul << FMC_ISPCTL_BS_Pos) /*!< FMC_T::ISPCTL: BS Mask */
  203. #define FMC_ISPCTL_SPUEN_Pos (2) /*!< FMC_T::ISPCTL: SPUEN Position */
  204. #define FMC_ISPCTL_SPUEN_Msk (0x1ul << FMC_ISPCTL_SPUEN_Pos) /*!< FMC_T::ISPCTL: SPUEN Mask */
  205. #define FMC_ISPCTL_APUEN_Pos (3) /*!< FMC_T::ISPCTL: APUEN Position */
  206. #define FMC_ISPCTL_APUEN_Msk (0x1ul << FMC_ISPCTL_APUEN_Pos) /*!< FMC_T::ISPCTL: APUEN Mask */
  207. #define FMC_ISPCTL_CFGUEN_Pos (4) /*!< FMC_T::ISPCTL: CFGUEN Position */
  208. #define FMC_ISPCTL_CFGUEN_Msk (0x1ul << FMC_ISPCTL_CFGUEN_Pos) /*!< FMC_T::ISPCTL: CFGUEN Mask */
  209. #define FMC_ISPCTL_LDUEN_Pos (5) /*!< FMC_T::ISPCTL: LDUEN Position */
  210. #define FMC_ISPCTL_LDUEN_Msk (0x1ul << FMC_ISPCTL_LDUEN_Pos) /*!< FMC_T::ISPCTL: LDUEN Mask */
  211. #define FMC_ISPCTL_ISPFF_Pos (6) /*!< FMC_T::ISPCTL: ISPFF Position */
  212. #define FMC_ISPCTL_ISPFF_Msk (0x1ul << FMC_ISPCTL_ISPFF_Pos) /*!< FMC_T::ISPCTL: ISPFF Mask */
  213. #define FMC_ISPCTL_INTEN_Pos (24) /*!< FMC_T::ISPCTL: INTEN Position */
  214. #define FMC_ISPCTL_INTEN_Msk (0x1ul << FMC_ISPCTL_INTEN_Pos) /*!< FMC_T::ISPCTL: INTEN Mask */
  215. #define FMC_ISPADDR_ISPADDR_Pos (0) /*!< FMC_T::ISPADDR: ISPADDR Position */
  216. #define FMC_ISPADDR_ISPADDR_Msk (0xfffffffful << FMC_ISPADDR_ISPADDR_Pos) /*!< FMC_T::ISPADDR: ISPADDR Mask */
  217. #define FMC_ISPDAT_ISPDAT_Pos (0) /*!< FMC_T::ISPDAT: ISPDAT Position */
  218. #define FMC_ISPDAT_ISPDAT_Msk (0xfffffffful << FMC_ISPDAT_ISPDAT_Pos) /*!< FMC_T::ISPDAT: ISPDAT Mask */
  219. #define FMC_ISPCMD_CMD_Pos (0) /*!< FMC_T::ISPCMD: CMD Position */
  220. #define FMC_ISPCMD_CMD_Msk (0x7ful << FMC_ISPCMD_CMD_Pos) /*!< FMC_T::ISPCMD: CMD Mask */
  221. #define FMC_ISPTRG_ISPGO_Pos (0) /*!< FMC_T::ISPTRG: ISPGO Position */
  222. #define FMC_ISPTRG_ISPGO_Msk (0x1ul << FMC_ISPTRG_ISPGO_Pos) /*!< FMC_T::ISPTRG: ISPGO Mask */
  223. #define FMC_DFBA_DFBA_Pos (0) /*!< FMC_T::DFBA: DFBA Position */
  224. #define FMC_DFBA_DFBA_Msk (0xfffffffful << FMC_DFBA_DFBA_Pos) /*!< FMC_T::DFBA: DFBA Mask */
  225. #define FMC_FTCTL_FOM_Pos (4) /*!< FMC_T::FTCTL: FOM Position */
  226. #define FMC_FTCTL_FOM_Msk (0x7ul << FMC_FTCTL_FOM_Pos) /*!< FMC_T::FTCTL: FOM Mask */
  227. #define FMC_ISPSTS_ISPBUSY_Pos (0) /*!< FMC_T::ISPSTS: ISPBUSY Position */
  228. #define FMC_ISPSTS_ISPBUSY_Msk (0x1ul << FMC_ISPSTS_ISPBUSY_Pos) /*!< FMC_T::ISPSTS: ISPBUSY Mask */
  229. #define FMC_ISPSTS_CBS_Pos (1) /*!< FMC_T::ISPSTS: CBS Position */
  230. #define FMC_ISPSTS_CBS_Msk (0x3ul << FMC_ISPSTS_CBS_Pos) /*!< FMC_T::ISPSTS: CBS Mask */
  231. #define FMC_ISPSTS_PGFF_Pos (5) /*!< FMC_T::ISPSTS: PGFF Position */
  232. #define FMC_ISPSTS_PGFF_Msk (0x1ul << FMC_ISPSTS_PGFF_Pos) /*!< FMC_T::ISPSTS: PGFF Mask */
  233. #define FMC_ISPSTS_ISPFF_Pos (6) /*!< FMC_T::ISPSTS: ISPFF Position */
  234. #define FMC_ISPSTS_ISPFF_Msk (0x1ul << FMC_ISPSTS_ISPFF_Pos) /*!< FMC_T::ISPSTS: ISPFF Mask */
  235. #define FMC_ISPSTS_ALLONE_Pos (7) /*!< FMC_T::ISPSTS: ISPFF Position */
  236. #define FMC_ISPSTS_ALLONE_Msk (0x1ul << FMC_ISPSTS_ALLONE_Pos)
  237. #define FMC_ISPSTS_INTFLAG_Pos (8) /*!< FMC_T::ISPSTS: INTFLAG Position */
  238. #define FMC_ISPSTS_INTFLAG_Msk (0x1ul << FMC_ISPSTS_INTFLAG_Pos) /*!< FMC_T::ISPSTS: INTFLAG Mask */
  239. #define FMC_ISPSTS_VECMAP_Pos (9) /*!< FMC_T::ISPSTS: VECMAP Position */
  240. #define FMC_ISPSTS_VECMAP_Msk (0x1ffffful << FMC_ISPSTS_VECMAP_Pos) /*!< FMC_T::ISPSTS: VECMAP Mask */
  241. #define FMC_ISPSTS_SCODE_Pos (31) /*!< FMC_T::ISPSTS: SCODE Position */
  242. #define FMC_ISPSTS_SCODE_Msk (0x1ul << FMC_ISPSTS_SCODE_Pos) /*!< FMC_T::ISPSTS: SCODE Mask */
  243. #define FMC_MPDAT0_ISPDAT0_Pos (0) /*!< FMC_T::MPDAT0: ISPDAT0 Position */
  244. #define FMC_MPDAT0_ISPDAT0_Msk (0xfffffffful << FMC_MPDAT0_ISPDAT0_Pos) /*!< FMC_T::MPDAT0: ISPDAT0 Mask */
  245. #define FMC_MPDAT1_ISPDAT1_Pos (0) /*!< FMC_T::MPDAT1: ISPDAT1 Position */
  246. #define FMC_MPDAT1_ISPDAT1_Msk (0xfffffffful << FMC_MPDAT1_ISPDAT1_Pos) /*!< FMC_T::MPDAT1: ISPDAT1 Mask */
  247. #define FMC_MPDAT2_ISPDAT2_Pos (0) /*!< FMC_T::MPDAT2: ISPDAT2 Position */
  248. #define FMC_MPDAT2_ISPDAT2_Msk (0xfffffffful << FMC_MPDAT2_ISPDAT2_Pos) /*!< FMC_T::MPDAT2: ISPDAT2 Mask */
  249. #define FMC_MPDAT3_ISPDAT3_Pos (0) /*!< FMC_T::MPDAT3: ISPDAT3 Position */
  250. #define FMC_MPDAT3_ISPDAT3_Msk (0xfffffffful << FMC_MPDAT3_ISPDAT3_Pos) /*!< FMC_T::MPDAT3: ISPDAT3 Mask */
  251. #define FMC_MPSTS_MPBUSY_Pos (0) /*!< FMC_T::MPSTS: MPBUSY Position */
  252. #define FMC_MPSTS_MPBUSY_Msk (0x1ul << FMC_MPSTS_MPBUSY_Pos) /*!< FMC_T::MPSTS: MPBUSY Mask */
  253. #define FMC_MPSTS_PPGO_Pos (1) /*!< FMC_T::MPSTS: PPGO Position */
  254. #define FMC_MPSTS_PPGO_Msk (0x1ul << FMC_MPSTS_PPGO_Pos) /*!< FMC_T::MPSTS: PPGO Mask */
  255. #define FMC_MPSTS_ISPFF_Pos (2) /*!< FMC_T::MPSTS: ISPFF Position */
  256. #define FMC_MPSTS_ISPFF_Msk (0x1ul << FMC_MPSTS_ISPFF_Pos) /*!< FMC_T::MPSTS: ISPFF Mask */
  257. #define FMC_MPSTS_D0_Pos (4) /*!< FMC_T::MPSTS: D0 Position */
  258. #define FMC_MPSTS_D0_Msk (0x1ul << FMC_MPSTS_D0_Pos) /*!< FMC_T::MPSTS: D0 Mask */
  259. #define FMC_MPSTS_D1_Pos (5) /*!< FMC_T::MPSTS: D1 Position */
  260. #define FMC_MPSTS_D1_Msk (0x1ul << FMC_MPSTS_D1_Pos) /*!< FMC_T::MPSTS: D1 Mask */
  261. #define FMC_MPSTS_D2_Pos (6) /*!< FMC_T::MPSTS: D2 Position */
  262. #define FMC_MPSTS_D2_Msk (0x1ul << FMC_MPSTS_D2_Pos) /*!< FMC_T::MPSTS: D2 Mask */
  263. #define FMC_MPSTS_D3_Pos (7) /*!< FMC_T::MPSTS: D3 Position */
  264. #define FMC_MPSTS_D3_Msk (0x1ul << FMC_MPSTS_D3_Pos) /*!< FMC_T::MPSTS: D3 Mask */
  265. #define FMC_MPADDR_MPADDR_Pos (0) /*!< FMC_T::MPADDR: MPADDR Position */
  266. #define FMC_MPADDR_MPADDR_Msk (0xfffffffful << FMC_MPADDR_MPADDR_Pos) /*!< FMC_T::MPADDR: MPADDR Mask */
  267. /**@}*/ /* FMC_CONST */
  268. /**@}*/ /* end of FMC register group */
  269. /**@}*/ /* end of REGISTER group */
  270. #if defined ( __CC_ARM )
  271. #pragma no_anon_unions
  272. #endif
  273. #endif /* __FMC_REG_H__ */