apm32f4xx_dmc.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. /*!
  2. * @file apm32f4xx_dmc.h
  3. *
  4. * @brief This file contains all the prototypes,enumeration and macros for the DMC peripheral
  5. *
  6. * @version V1.0.2
  7. *
  8. * @date 2022-06-23
  9. *
  10. * @attention
  11. *
  12. * Copyright (C) 2021-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 usefull 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 __APM32F4XX_DMC_H
  27. #define __APM32F4XX_DMC_H
  28. #ifdef __cplusplus
  29. extern "C" {
  30. #endif
  31. /* Includes */
  32. #include "apm32f4xx.h"
  33. /** @addtogroup APM32F4xx_StdPeriphDriver
  34. @{
  35. */
  36. /** @addtogroup DMC_Driver
  37. @{
  38. */
  39. /** @defgroup DMC_Enumerations
  40. @{
  41. */
  42. /**
  43. * @brief Bank Address Width
  44. */
  45. typedef enum
  46. {
  47. DMC_BANK_WIDTH_1, /*!< Set bank address width to 1-bit */
  48. DMC_BANK_WIDTH_2 /*!< Set bank address width to 2-bit */
  49. } DMC_BANK_WIDTH_T;
  50. /**
  51. * @brief Row Address Width
  52. */
  53. typedef enum
  54. {
  55. DMC_ROW_WIDTH_11 = 0x0A, /*!< Set row address width to 11-bit */
  56. DMC_ROW_WIDTH_12, /*!< Set row address width to 12-bit */
  57. DMC_ROW_WIDTH_13, /*!< Set row address width to 13-bit */
  58. DMC_ROW_WIDTH_14, /*!< Set row address width to 14-bit */
  59. DMC_ROW_WIDTH_15, /*!< Set row address width to 15-bit */
  60. DMC_ROW_WIDTH_16 /*!< Set row address width to 16-bit */
  61. } DMC_ROW_WIDTH_T;
  62. /**
  63. * @brief Column Address Width
  64. */
  65. typedef enum
  66. {
  67. DMC_COL_WIDTH_8 = 0x07, /*!< Set column address width to 8-bit */
  68. DMC_COL_WIDTH_9, /*!< Set column address width to 9-bit */
  69. DMC_COL_WIDTH_10, /*!< Set column address width to 10-bit */
  70. DMC_COL_WIDTH_11, /*!< Set column address width to 11-bit */
  71. DMC_COL_WIDTH_12, /*!< Set column address width to 12-bit */
  72. DMC_COL_WIDTH_13, /*!< Set column address width to 13-bit */
  73. DMC_COL_WIDTH_14, /*!< Set column address width to 14-bit */
  74. DMC_COL_WIDTH_15 /*!< Set column address width to 15-bit */
  75. } DMC_COL_WIDTH_T;
  76. /**
  77. * @brief CAS Latency Select
  78. */
  79. typedef enum
  80. {
  81. DMC_CAS_LATENCY_1, /*!< Set CAS lantency to 1 clock */
  82. DMC_CAS_LATENCY_2, /*!< Set CAS lantency to 2 clock */
  83. DMC_CAS_LATENCY_3, /*!< Set CAS lantency to 3 clock */
  84. DMC_CAS_LATENCY_4 /*!< Set CAS lantency to 4 clock */
  85. } DMC_CAS_LATENCY_T;
  86. /**
  87. * @brief RAS Minimun Time Select
  88. */
  89. typedef enum
  90. {
  91. DMC_RAS_MINIMUM_1, /*!< Set RAS minimun time to 1 clock */
  92. DMC_RAS_MINIMUM_2, /*!< Set RAS minimun time to 2 clock */
  93. DMC_RAS_MINIMUM_3, /*!< Set RAS minimun time to 3 clock */
  94. DMC_RAS_MINIMUM_4, /*!< Set RAS minimun time to 4 clock */
  95. DMC_RAS_MINIMUM_5, /*!< Set RAS minimun time to 5 clock */
  96. DMC_RAS_MINIMUM_6, /*!< Set RAS minimun time to 6 clock */
  97. DMC_RAS_MINIMUM_7, /*!< Set RAS minimun time to 7 clock */
  98. DMC_RAS_MINIMUM_8, /*!< Set RAS minimun time to 8 clock */
  99. DMC_RAS_MINIMUM_9, /*!< Set RAS minimun time to 9 clock */
  100. DMC_RAS_MINIMUM_10, /*!< Set RAS minimun time to 10 clock */
  101. DMC_RAS_MINIMUM_11, /*!< Set RAS minimun time to 11 clock */
  102. DMC_RAS_MINIMUM_12, /*!< Set RAS minimun time to 12 clock */
  103. DMC_RAS_MINIMUM_13, /*!< Set RAS minimun time to 13 clock */
  104. DMC_RAS_MINIMUM_14, /*!< Set RAS minimun time to 14 clock */
  105. DMC_RAS_MINIMUM_15, /*!< Set RAS minimun time to 15 clock */
  106. DMC_RAS_MINIMUM_16 /*!< Set RAS minimun time to 16 clock */
  107. } DMC_RAS_MINIMUM_T;
  108. /**
  109. * @brief RAS To CAS Delay Time Select
  110. */
  111. typedef enum
  112. {
  113. DMC_DELAY_TIME_1, /*!< Set RAS to CAS delay time to 1 clock */
  114. DMC_DELAY_TIME_2, /*!< Set RAS to CAS delay time to 2 clock */
  115. DMC_DELAY_TIME_3, /*!< Set RAS to CAS delay time to 3 clock */
  116. DMC_DELAY_TIME_4, /*!< Set RAS to CAS delay time to 4 clock */
  117. DMC_DELAY_TIME_5, /*!< Set RAS to CAS delay time to 5 clock */
  118. DMC_DELAY_TIME_6, /*!< Set RAS to CAS delay time to 6 clock */
  119. DMC_DELAY_TIME_7, /*!< Set RAS to CAS delay time to 7 clock */
  120. DMC_DELAY_TIME_8 /*!< Set RAS to CAS delay time to 8 clock */
  121. } DMC_DELAY_TIME_T;
  122. /**
  123. * @brief Precharge Period Select
  124. */
  125. typedef enum
  126. {
  127. DMC_PRECHARGE_1, /*!< Set precharge period to 1 clock */
  128. DMC_PRECHARGE_2, /*!< Set precharge period to 2 clock */
  129. DMC_PRECHARGE_3, /*!< Set precharge period to 3 clock */
  130. DMC_PRECHARGE_4, /*!< Set precharge period to 4 clock */
  131. DMC_PRECHARGE_5, /*!< Set precharge period to 5 clock */
  132. DMC_PRECHARGE_6, /*!< Set precharge period to 6 clock */
  133. DMC_PRECHARGE_7, /*!< Set precharge period to 7 clock */
  134. DMC_PRECHARGE_8 /*!< Set precharge period to 8 clock */
  135. } DMC_PRECHARGE_T;
  136. /**
  137. * @brief Last Data Next Precharge For Write Time Select
  138. */
  139. typedef enum
  140. {
  141. DMC_NEXT_PRECHARGE_1, /*!< Set time between the last data and
  142. next precharge for write to 1 clock */
  143. DMC_NEXT_PRECHARGE_2, /*!< Set time between the last data and
  144. next precharge for write to 2 clock */
  145. DMC_NEXT_PRECHARGE_3, /*!< Set time between the last data and
  146. next precharge for write to 3 clock */
  147. DMC_NEXT_PRECHARGE_4 /*!< Set time between the last data and
  148. next precharge for write to 4 clock */
  149. } DMC_NEXT_PRECHARGE_T;
  150. /**
  151. * @brief Auto-Refresh Period Select
  152. */
  153. typedef enum
  154. {
  155. DMC_AUTO_REFRESH_1, /*!< Set auto-refresh period to 1 clock */
  156. DMC_AUTO_REFRESH_2, /*!< Set auto-refresh period to 2 clock */
  157. DMC_AUTO_REFRESH_3, /*!< Set auto-refresh period to 3 clock */
  158. DMC_AUTO_REFRESH_4, /*!< Set auto-refresh period to 4 clock */
  159. DMC_AUTO_REFRESH_5, /*!< Set auto-refresh period to 5 clock */
  160. DMC_AUTO_REFRESH_6, /*!< Set auto-refresh period to 6 clock */
  161. DMC_AUTO_REFRESH_7, /*!< Set auto-refresh period to 7 clock */
  162. DMC_AUTO_REFRESH_8, /*!< Set auto-refresh period to 8 clock */
  163. DMC_AUTO_REFRESH_9, /*!< Set auto-refresh period to 9 clock */
  164. DMC_AUTO_REFRESH_10, /*!< Set auto-refresh period to 10 clock */
  165. DMC_AUTO_REFRESH_11, /*!< Set auto-refresh period to 11 clock */
  166. DMC_AUTO_REFRESH_12, /*!< Set auto-refresh period to 12 clock */
  167. DMC_AUTO_REFRESH_13, /*!< Set auto-refresh period to 13 clock */
  168. DMC_AUTO_REFRESH_14, /*!< Set auto-refresh period to 14 clock */
  169. DMC_AUTO_REFRESH_15, /*!< Set auto-refresh period to 15 clock */
  170. DMC_AUTO_REFRESH_16, /*!< Set auto-refresh period to 16 clock */
  171. } DMC_AUTO_REFRESH_T;
  172. /**
  173. * @brief Active-to-active Command Period Select
  174. */
  175. typedef enum
  176. {
  177. DMC_ATA_CMD_1, /*!< Set active to active command period to 1 clock */
  178. DMC_ATA_CMD_2, /*!< Set active to active command period to 2 clock */
  179. DMC_ATA_CMD_3, /*!< Set active to active command period to 3 clock */
  180. DMC_ATA_CMD_4, /*!< Set active to active command period to 4 clock */
  181. DMC_ATA_CMD_5, /*!< Set active to active command period to 5 clock */
  182. DMC_ATA_CMD_6, /*!< Set active to active command period to 6 clock */
  183. DMC_ATA_CMD_7, /*!< Set active to active command period to 7 clock */
  184. DMC_ATA_CMD_8, /*!< Set active to active command period to 8 clock */
  185. DMC_ATA_CMD_9, /*!< Set active to active command period to 9 clock */
  186. DMC_ATA_CMD_10, /*!< Set active to active command period to 10 clock */
  187. DMC_ATA_CMD_11, /*!< Set active to active command period to 11 clock */
  188. DMC_ATA_CMD_12, /*!< Set active to active command period to 12 clock */
  189. DMC_ATA_CMD_13, /*!< Set active to active command period to 13 clock */
  190. DMC_ATA_CMD_14, /*!< Set active to active command period to 14 clock */
  191. DMC_ATA_CMD_15, /*!< Set active to active command period to 15 clock */
  192. DMC_ATA_CMD_16, /*!< Set active to active command period to 16 clock */
  193. } DMC_ATA_CMD_T;
  194. /**
  195. * @brief Clock PHASE
  196. */
  197. typedef enum
  198. {
  199. DMC_CLK_PHASE_NORMAL, /*!< Clock phase is normal */
  200. DMC_CLK_PHASE_REVERSE /*!< Clock phase is reverse */
  201. } DMC_CLK_PHASE_T;
  202. /**
  203. * @brief Open Banks Of Number
  204. */
  205. typedef enum
  206. {
  207. DMC_BANK_NUMBER_1, /*!< Set 1 bank be opened */
  208. DMC_BANK_NUMBER_2, /*!< Set 2 banks be opened */
  209. DMC_BANK_NUMBER_3, /*!< Set 3 banks be opened */
  210. DMC_BANK_NUMBER_4, /*!< Set 4 banks be opened */
  211. DMC_BANK_NUMBER_5, /*!< Set 5 banks be opened */
  212. DMC_BANK_NUMBER_6, /*!< Set 6 banks be opened */
  213. DMC_BANK_NUMBER_7, /*!< Set 7 banks be opened */
  214. DMC_BANK_NUMBER_8, /*!< Set 8 banks be opened */
  215. DMC_BANK_NUMBER_9, /*!< Set 9 banks be opened */
  216. DMC_BANK_NUMBER_10, /*!< Set 10 banks be opened */
  217. DMC_BANK_NUMBER_11, /*!< Set 11 banks be opened */
  218. DMC_BANK_NUMBER_12, /*!< Set 12 banks be opened */
  219. DMC_BANK_NUMBER_13, /*!< Set 13 banks be opened */
  220. DMC_BANK_NUMBER_14, /*!< Set 14 banks be opened */
  221. DMC_BANK_NUMBER_15, /*!< Set 15 banks be opened */
  222. DMC_BANK_NUMBER_16, /*!< Set 16 banks be opened */
  223. } DMC_BANK_NUMBER_T;
  224. /**
  225. * @brief Full refresh type
  226. */
  227. typedef enum
  228. {
  229. DMC_REFRESH_ROW_ONE, /*!< Refresh one row */
  230. DMC_REFRESH_ROW_ALL, /*!< Refresh all row */
  231. } DMC_REFRESH_T;
  232. /**
  233. * @brief Precharge type
  234. */
  235. typedef enum
  236. {
  237. DMC_PRECHARGE_IM, /*!< Immediate precharge */
  238. DMC_PRECHARGE_DELAY, /*!< Delayed precharge */
  239. } DMC_PRECHARE_T;
  240. /**
  241. * @brief WRAP Burst Type
  242. */
  243. typedef enum
  244. {
  245. DMC_WRAPB_4, /*!< Wrap4 burst transfer */
  246. DMC_WRAPB_8, /*!< Wrap8 burst transfer */
  247. } DMC_WRPB_T;
  248. /**@} end of group DMC_Enumerations*/
  249. /** @addtogroup DMC_Structure Data Structure
  250. @{
  251. */
  252. /**
  253. * @brief Timing config definition
  254. */
  255. typedef struct
  256. {
  257. uint32_t latencyCAS : 2; /*!< DMC_CAS_LATENCY_T */
  258. uint32_t tRAS : 4; /*!< DMC_RAS_MINIMUM_T */
  259. uint32_t tRCD : 3; /*!< DMC_DELAY_TIME_T */
  260. uint32_t tRP : 3; /*!< DMC_PRECHARGE_T */
  261. uint32_t tWR : 2; /*!< DMC_NEXT_PRECHARGE_T */
  262. uint32_t tARP : 4; /*!< DMC_AUTO_REFRESH_T */
  263. uint32_t tCMD : 4; /*!< DMC_ATA_CMD_T */
  264. uint32_t tXSR : 9; /*!< auto-refresh commands, can be 0x000 to 0x1FF */
  265. uint16_t tRFP : 16; /*!< Refresh period, can be 0x0000 to 0xFFFF */
  266. } DMC_TimingConfig_T;
  267. /**
  268. * @brief Config struct definition
  269. */
  270. typedef struct
  271. {
  272. DMC_BANK_WIDTH_T bankWidth; /*!< Number of bank bits */
  273. DMC_ROW_WIDTH_T rowWidth; /*!< Number of row address bits */
  274. DMC_COL_WIDTH_T colWidth; /*!< Number of col address bits */
  275. DMC_CLK_PHASE_T clkPhase; /*!< Clock phase */
  276. DMC_TimingConfig_T timing; /*!< Timing */
  277. } DMC_Config_T;
  278. /**@} end of group DMC_Structure*/
  279. /** @defgroup DMC_Functions
  280. @{
  281. */
  282. /* Enable / Disable */
  283. void DMC_Enable(void);
  284. void DMC_Disable(void);
  285. void DMC_EnableInit(void);
  286. /* Global config */
  287. void DMC_Config(DMC_Config_T* dmcConfig);
  288. void DMC_ConfigStructInit(DMC_Config_T* dmcConfig);
  289. /* Address */
  290. void DMC_ConfigBankWidth(DMC_BANK_WIDTH_T bankWidth);
  291. void DMC_ConfigAddrWidth(DMC_ROW_WIDTH_T rowWidth, DMC_COL_WIDTH_T colWidth);
  292. /* Timing */
  293. void DMC_ConfigTiming(DMC_TimingConfig_T* timingConfig);
  294. void DMC_ConfigTimingStructInit(DMC_TimingConfig_T* timingConfig);
  295. void DMC_ConfigStableTimePowerup(uint16_t stableTime);
  296. void DMC_ConfigAutoRefreshNumDuringInit(DMC_AUTO_REFRESH_T num);
  297. void DMC_ConfigRefreshPeriod(uint16_t period);
  298. /* Refresh mode */
  299. void DMC_EixtSlefRefreshMode(void);
  300. void DMC_EnterSlefRefreshMode(void);
  301. /* Accelerate Module */
  302. void DMC_EnableAccelerateModule(void);
  303. void DMC_DisableAccelerateModule(void);
  304. /* Config */
  305. void DMC_ConfigOpenBank(DMC_BANK_NUMBER_T num);
  306. void DMC_EnableUpdateMode(void);
  307. void DMC_EnterPowerdownMode(void);
  308. void DMC_ConfigFullRefreshBeforeSR(DMC_REFRESH_T refresh);
  309. void DMC_ConfigFullRefreshAfterSR(DMC_REFRESH_T refresh);
  310. void DMC_ConfigPrechargeType(DMC_PRECHARE_T precharge);
  311. void DMC_ConfigClockPhase(DMC_CLK_PHASE_T clkPhase);
  312. void DMC_ConfigWRAPB(DMC_WRPB_T burst);
  313. /* read flag */
  314. uint8_t DMC_ReadSelfRefreshStatus(void);
  315. #ifdef __cplusplus
  316. }
  317. #endif
  318. #endif /* __APM32F4XX_DMC_H */
  319. /**@} end of group DMC_Enumerations */
  320. /**@} end of group DMC_Driver */
  321. /**@} end of group APM32F4xx_StdPeriphDriver */