apm32f4xx_smc.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969
  1. /*!
  2. * @file apm32f4xx_smc.c
  3. *
  4. * @brief This file provides all the SMC firmware functions
  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. #include "apm32f4xx_smc.h"
  26. #include "apm32f4xx_rcm.h"
  27. /** @addtogroup APM32F4xx_StdPeriphDriver
  28. @{
  29. */
  30. /** @defgroup SMC_Driver
  31. * @brief SMC driver modules
  32. @{
  33. */
  34. /** @defgroup SMC_Functions
  35. @{
  36. */
  37. /*!
  38. * @brief Rest the SMC NOR/SRAM Banks registers
  39. *
  40. * @param bank: Selects the SMC Bank.
  41. * The parameter can be one of following values:
  42. * @arg SMC_BANK1_NORSRAM_1 : SMC Bank1 NOR/SRAM1
  43. * @arg SMC_BANK1_NORSRAM_2 : SMC Bank1 NOR/SRAM2
  44. * @arg SMC_BANK1_NORSRAM_3 : SMC Bank1 NOR/SRAM3
  45. * @arg SMC_BANK1_NORSRAM_4 : SMC Bank1 NOR/SRAM4
  46. *
  47. * @retval None
  48. */
  49. void SMC_ResetNORSRAM(SMC_BANK1_NORSRAM_T bank)
  50. {
  51. if (bank == SMC_BANK1_NORSRAM_1)
  52. {
  53. SMC_Bank1->CSCTRL1 = 0x000030DB;
  54. SMC_Bank1->CSTIM1 = 0x0FFFFFFF;
  55. SMC_Bank1E->WRTTIM1 = 0x0FFFFFFF;
  56. }
  57. else if (bank == SMC_BANK1_NORSRAM_2)
  58. {
  59. SMC_Bank1->CSCTRL2 = 0x000030D2;
  60. SMC_Bank1->CSTIM2 = 0x0FFFFFFF;
  61. SMC_Bank1E->WRTTIM2 = 0x0FFFFFFF;
  62. }
  63. else if (bank == SMC_BANK1_NORSRAM_3)
  64. {
  65. SMC_Bank1->CSCTRL3 = 0x000030D2;
  66. SMC_Bank1->CSTIM3 = 0x0FFFFFFF;
  67. SMC_Bank1E->WRTTIM3 = 0x0FFFFFFF;
  68. }
  69. else if (bank == SMC_BANK1_NORSRAM_4)
  70. {
  71. SMC_Bank1->CSCTRL4 = 0x000030D2;
  72. SMC_Bank1->CSTIM4 = 0x0FFFFFFF;
  73. SMC_Bank1E->WRTTIM4 = 0x0FFFFFFF;
  74. }
  75. }
  76. /*!
  77. * @brief Rest the SMC NAND Banks registers
  78. *
  79. * @param bank: Selects the SMC Bank.
  80. * The parameter can be one of following values:
  81. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  82. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  83. *
  84. * @retval None
  85. */
  86. void SMC_ResetNAND(SMC_BANK_NAND_T bank)
  87. {
  88. if (bank == SMC_BANK2_NAND)
  89. {
  90. SMC_Bank2->CTRL2 = 0x00000018;
  91. SMC_Bank2->STSINT2 = 0x00000040;
  92. SMC_Bank2->CMSTIM2 = 0xFCFCFCFC;
  93. SMC_Bank2->AMSTIM2 = 0xFCFCFCFC;
  94. }
  95. else if (bank == SMC_BANK3_NAND)
  96. {
  97. SMC_Bank3->CTRL3 = 0x00000018;
  98. SMC_Bank3->STSINT3 = 0x00000040;
  99. SMC_Bank3->CMSTIM3 = 0xFCFCFCFC;
  100. SMC_Bank3->AMSTIM3 = 0xFCFCFCFC;
  101. }
  102. }
  103. /*!
  104. * @brief Reset the SMC PCCARD Banks registers
  105. *
  106. * @param None
  107. *
  108. * @retval None
  109. */
  110. void SMC_ResetPCCard(void)
  111. {
  112. SMC_Bank4->CTRL4 = 0x00000018;
  113. SMC_Bank4->STSINT4 = 0x00000000;
  114. SMC_Bank4->CMSTIM4 = 0xFCFCFCFC;
  115. SMC_Bank4->AMSTIM4 = 0xFCFCFCFC;
  116. SMC_Bank4->IOSTIM4 = 0xFCFCFCFC;
  117. }
  118. /*!
  119. * @brief Config the SMC NOR/SRAM Banks according to the specified parameters in the smcNORSRAMConfig.
  120. *
  121. * @param smcNORSRAMConfig: Point to a SMC_NORSRAMConfig_T structure
  122. *
  123. * @retval None
  124. */
  125. void SMC_ConfigNORSRAM(SMC_NORSRAMConfig_T *smcNORSRAMConfig)
  126. {
  127. if (smcNORSRAMConfig->bank == SMC_BANK1_NORSRAM_1)
  128. {
  129. SMC_Bank1->CSCTRL1_B.ADMUXEN = smcNORSRAMConfig->dataAddressMux;
  130. SMC_Bank1->CSCTRL1_B.MTYPECFG = smcNORSRAMConfig->memoryType;
  131. SMC_Bank1->CSCTRL1_B.MDBWIDCFG = smcNORSRAMConfig->memoryDataWidth;
  132. SMC_Bank1->CSCTRL1_B.BURSTEN = smcNORSRAMConfig->burstAcceesMode;
  133. SMC_Bank1->CSCTRL1_B.WSASYNCEN = smcNORSRAMConfig->asynchronousWait;
  134. SMC_Bank1->CSCTRL1_B.WSPOLCFG = smcNORSRAMConfig->waitSignalPolarity;
  135. SMC_Bank1->CSCTRL1_B.WRAPBEN = smcNORSRAMConfig->wrapMode;
  136. SMC_Bank1->CSCTRL1_B.WTIMCFG = smcNORSRAMConfig->waitSignalActive;
  137. SMC_Bank1->CSCTRL1_B.WREN = smcNORSRAMConfig->writeOperation;
  138. SMC_Bank1->CSCTRL1_B.WAITEN = smcNORSRAMConfig->waiteSignal;
  139. SMC_Bank1->CSCTRL1_B.EXTMODEEN = smcNORSRAMConfig->extendedMode;
  140. SMC_Bank1->CSCTRL1_B.WRBURSTEN = smcNORSRAMConfig->writeBurst;
  141. if (smcNORSRAMConfig->memoryType == SMC_MEMORY_TYPE_NOR)
  142. {
  143. SMC_Bank1->CSCTRL1_B.NORFMACCEN = BIT_SET;
  144. }
  145. SMC_Bank1->CSTIM1_B.ADDRSETCFG = \
  146. smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime;
  147. SMC_Bank1->CSTIM1_B.ADDRHLDCFG = \
  148. smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime;
  149. SMC_Bank1->CSTIM1_B.DATASETCFG = \
  150. smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime;
  151. SMC_Bank1->CSTIM1_B.BUSTURNCFG = \
  152. smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime;
  153. SMC_Bank1->CSTIM1_B.CLKDIVCFG = \
  154. smcNORSRAMConfig->readWriteTimingStruct->clockDivision;
  155. SMC_Bank1->CSTIM1_B.DATALATCFG = \
  156. smcNORSRAMConfig->readWriteTimingStruct->dataLatency;
  157. SMC_Bank1->CSTIM1_B.ASYNCACCCFG = \
  158. smcNORSRAMConfig->readWriteTimingStruct->accessMode;
  159. if (smcNORSRAMConfig->extendedMode == SMC_EXTENDEN_MODE_ENABLE)
  160. {
  161. SMC_Bank1E->WRTTIM1_B.ADDRSETCFG = \
  162. smcNORSRAMConfig->writeTimingStruct->addressSetupTime;
  163. SMC_Bank1E->WRTTIM1_B.ADDRHLDCFG = \
  164. smcNORSRAMConfig->writeTimingStruct->addressHodeTime;
  165. SMC_Bank1E->WRTTIM1_B.DATASETCFG = \
  166. smcNORSRAMConfig->writeTimingStruct->dataSetupTime;
  167. SMC_Bank1E->WRTTIM1_B.BUSTURNCFG = \
  168. smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime;
  169. SMC_Bank1E->WRTTIM1_B.ASYNCACCCFG = \
  170. smcNORSRAMConfig->writeTimingStruct->accessMode;
  171. }
  172. else
  173. {
  174. SMC_Bank1E->WRTTIM1 = 0x0FFFFFFF;
  175. }
  176. }
  177. else if (smcNORSRAMConfig->bank == SMC_BANK1_NORSRAM_2)
  178. {
  179. SMC_Bank1->CSCTRL2_B.ADMUXEN = smcNORSRAMConfig->dataAddressMux;
  180. SMC_Bank1->CSCTRL2_B.MTYPECFG = smcNORSRAMConfig->memoryType;
  181. SMC_Bank1->CSCTRL2_B.MDBWIDCFG = smcNORSRAMConfig->memoryDataWidth;
  182. SMC_Bank1->CSCTRL2_B.BURSTEN = smcNORSRAMConfig->burstAcceesMode;
  183. SMC_Bank1->CSCTRL2_B.WSASYNCEN = smcNORSRAMConfig->asynchronousWait;
  184. SMC_Bank1->CSCTRL2_B.WSPOLCFG = smcNORSRAMConfig->waitSignalPolarity;
  185. SMC_Bank1->CSCTRL2_B.WRAPBEN = smcNORSRAMConfig->wrapMode;
  186. SMC_Bank1->CSCTRL2_B.WTIMCFG = smcNORSRAMConfig->waitSignalActive;
  187. SMC_Bank1->CSCTRL2_B.WREN = smcNORSRAMConfig->writeOperation;
  188. SMC_Bank1->CSCTRL2_B.WAITEN = smcNORSRAMConfig->waiteSignal;
  189. SMC_Bank1->CSCTRL2_B.EXTMODEEN = smcNORSRAMConfig->extendedMode;
  190. SMC_Bank1->CSCTRL2_B.WRBURSTEN = smcNORSRAMConfig->writeBurst;
  191. if (smcNORSRAMConfig->memoryType == SMC_MEMORY_TYPE_NOR)
  192. {
  193. SMC_Bank1->CSCTRL2_B.NORFMACCEN = BIT_SET;
  194. }
  195. SMC_Bank1->CSTIM2_B.ADDRSETCFG = \
  196. smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime;
  197. SMC_Bank1->CSTIM2_B.ADDRHLDCFG = \
  198. smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime;
  199. SMC_Bank1->CSTIM2_B.DATASETCFG = \
  200. smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime;
  201. SMC_Bank1->CSTIM2_B.BUSTURNCFG = \
  202. smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime;
  203. SMC_Bank1->CSTIM2_B.CLKDIVCFG = \
  204. smcNORSRAMConfig->readWriteTimingStruct->clockDivision;
  205. SMC_Bank1->CSTIM2_B.DATALATCFG = \
  206. smcNORSRAMConfig->readWriteTimingStruct->dataLatency;
  207. SMC_Bank1->CSTIM2_B.ASYNCACCCFG = \
  208. smcNORSRAMConfig->readWriteTimingStruct->accessMode;
  209. if (smcNORSRAMConfig->extendedMode == SMC_EXTENDEN_MODE_ENABLE)
  210. {
  211. SMC_Bank1E->WRTTIM2_B.ADDRSETCFG = \
  212. smcNORSRAMConfig->writeTimingStruct->addressSetupTime;
  213. SMC_Bank1E->WRTTIM2_B.ADDRHLDCFG = \
  214. smcNORSRAMConfig->writeTimingStruct->addressHodeTime;
  215. SMC_Bank1E->WRTTIM2_B.DATASETCFG = \
  216. smcNORSRAMConfig->writeTimingStruct->dataSetupTime;
  217. SMC_Bank1E->WRTTIM2_B.BUSTURNCFG = \
  218. smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime;
  219. SMC_Bank1E->WRTTIM2_B.ASYNCACCCFG = \
  220. smcNORSRAMConfig->writeTimingStruct->accessMode;
  221. }
  222. else
  223. {
  224. SMC_Bank1E->WRTTIM2 = 0x0FFFFFFF;
  225. }
  226. }
  227. else if (smcNORSRAMConfig->bank == SMC_BANK1_NORSRAM_3)
  228. {
  229. SMC_Bank1->CSCTRL3_B.ADMUXEN = smcNORSRAMConfig->dataAddressMux;
  230. SMC_Bank1->CSCTRL3_B.MTYPECFG = smcNORSRAMConfig->memoryType;
  231. SMC_Bank1->CSCTRL3_B.MDBWIDCFG = smcNORSRAMConfig->memoryDataWidth;
  232. SMC_Bank1->CSCTRL3_B.BURSTEN = smcNORSRAMConfig->burstAcceesMode;
  233. SMC_Bank1->CSCTRL3_B.WSASYNCEN = smcNORSRAMConfig->asynchronousWait;
  234. SMC_Bank1->CSCTRL3_B.WSPOLCFG = smcNORSRAMConfig->waitSignalPolarity;
  235. SMC_Bank1->CSCTRL3_B.WRAPBEN = smcNORSRAMConfig->wrapMode;
  236. SMC_Bank1->CSCTRL3_B.WTIMCFG = smcNORSRAMConfig->waitSignalActive;
  237. SMC_Bank1->CSCTRL3_B.WREN = smcNORSRAMConfig->writeOperation;
  238. SMC_Bank1->CSCTRL3_B.WAITEN = smcNORSRAMConfig->waiteSignal;
  239. SMC_Bank1->CSCTRL3_B.EXTMODEEN = smcNORSRAMConfig->extendedMode;
  240. SMC_Bank1->CSCTRL3_B.WRBURSTEN = smcNORSRAMConfig->writeBurst;
  241. if (smcNORSRAMConfig->memoryType == SMC_MEMORY_TYPE_NOR)
  242. {
  243. SMC_Bank1->CSCTRL3_B.NORFMACCEN = BIT_SET;
  244. }
  245. SMC_Bank1->CSTIM3_B.ADDRSETCFG = \
  246. smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime;
  247. SMC_Bank1->CSTIM3_B.ADDRHLDCFG = \
  248. smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime;
  249. SMC_Bank1->CSTIM3_B.DATASETCFG = \
  250. smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime;
  251. SMC_Bank1->CSTIM3_B.BUSTURNCFG = \
  252. smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime;
  253. SMC_Bank1->CSTIM3_B.CLKDIVCFG = \
  254. smcNORSRAMConfig->readWriteTimingStruct->clockDivision;
  255. SMC_Bank1->CSTIM3_B.DATALATCFG = \
  256. smcNORSRAMConfig->readWriteTimingStruct->dataLatency;
  257. SMC_Bank1->CSTIM3_B.ASYNCACCCFG = \
  258. smcNORSRAMConfig->readWriteTimingStruct->accessMode;
  259. if (smcNORSRAMConfig->extendedMode == SMC_EXTENDEN_MODE_ENABLE)
  260. {
  261. SMC_Bank1E->WRTTIM3_B.ADDRSETCFG = \
  262. smcNORSRAMConfig->writeTimingStruct->addressSetupTime;
  263. SMC_Bank1E->WRTTIM3_B.ADDRHLDCFG = \
  264. smcNORSRAMConfig->writeTimingStruct->addressHodeTime;
  265. SMC_Bank1E->WRTTIM3_B.DATASETCFG = \
  266. smcNORSRAMConfig->writeTimingStruct->dataSetupTime;
  267. SMC_Bank1E->WRTTIM3_B.BUSTURNCFG = \
  268. smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime;
  269. SMC_Bank1E->WRTTIM3_B.ASYNCACCCFG = \
  270. smcNORSRAMConfig->writeTimingStruct->accessMode;
  271. }
  272. else
  273. {
  274. SMC_Bank1E->WRTTIM3 = 0x0FFFFFFF;
  275. }
  276. }
  277. else if (smcNORSRAMConfig->bank == SMC_BANK1_NORSRAM_4)
  278. {
  279. SMC_Bank1->CSCTRL4_B.ADMUXEN = smcNORSRAMConfig->dataAddressMux;
  280. SMC_Bank1->CSCTRL4_B.MTYPECFG = smcNORSRAMConfig->memoryType;
  281. SMC_Bank1->CSCTRL4_B.MDBWIDCFG = smcNORSRAMConfig->memoryDataWidth;
  282. SMC_Bank1->CSCTRL4_B.BURSTEN = smcNORSRAMConfig->burstAcceesMode;
  283. SMC_Bank1->CSCTRL4_B.WSASYNCEN = smcNORSRAMConfig->asynchronousWait;
  284. SMC_Bank1->CSCTRL4_B.WSPOLCFG = smcNORSRAMConfig->waitSignalPolarity;
  285. SMC_Bank1->CSCTRL4_B.WRAPBEN = smcNORSRAMConfig->wrapMode;
  286. SMC_Bank1->CSCTRL4_B.WTIMCFG = smcNORSRAMConfig->waitSignalActive;
  287. SMC_Bank1->CSCTRL4_B.WREN = smcNORSRAMConfig->writeOperation;
  288. SMC_Bank1->CSCTRL4_B.WAITEN = smcNORSRAMConfig->waiteSignal;
  289. SMC_Bank1->CSCTRL4_B.EXTMODEEN = smcNORSRAMConfig->extendedMode;
  290. SMC_Bank1->CSCTRL4_B.WRBURSTEN = smcNORSRAMConfig->writeBurst;
  291. if (smcNORSRAMConfig->memoryType == SMC_MEMORY_TYPE_NOR)
  292. {
  293. SMC_Bank1->CSCTRL4_B.NORFMACCEN = BIT_SET;
  294. }
  295. SMC_Bank1->CSTIM4_B.ADDRSETCFG = \
  296. smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime;
  297. SMC_Bank1->CSTIM4_B.ADDRHLDCFG = \
  298. smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime;
  299. SMC_Bank1->CSTIM4_B.DATASETCFG = \
  300. smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime;
  301. SMC_Bank1->CSTIM4_B.BUSTURNCFG = \
  302. smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime;
  303. SMC_Bank1->CSTIM4_B.CLKDIVCFG = \
  304. smcNORSRAMConfig->readWriteTimingStruct->clockDivision;
  305. SMC_Bank1->CSTIM4_B.DATALATCFG = \
  306. smcNORSRAMConfig->readWriteTimingStruct->dataLatency;
  307. SMC_Bank1->CSTIM4_B.ASYNCACCCFG = \
  308. smcNORSRAMConfig->readWriteTimingStruct->accessMode;
  309. if (smcNORSRAMConfig->extendedMode == SMC_EXTENDEN_MODE_ENABLE)
  310. {
  311. SMC_Bank1E->WRTTIM4_B.ADDRSETCFG = \
  312. smcNORSRAMConfig->writeTimingStruct->addressSetupTime;
  313. SMC_Bank1E->WRTTIM4_B.ADDRHLDCFG = \
  314. smcNORSRAMConfig->writeTimingStruct->addressHodeTime;
  315. SMC_Bank1E->WRTTIM4_B.DATASETCFG = \
  316. smcNORSRAMConfig->writeTimingStruct->dataSetupTime;
  317. SMC_Bank1E->WRTTIM4_B.BUSTURNCFG = \
  318. smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime;
  319. SMC_Bank1E->WRTTIM4_B.ASYNCACCCFG = \
  320. smcNORSRAMConfig->writeTimingStruct->accessMode;
  321. }
  322. else
  323. {
  324. SMC_Bank1E->WRTTIM4 = 0x0FFFFFFF;
  325. }
  326. }
  327. }
  328. /*!
  329. * @brief Config the SMC NAND Banks according to the specified parameters in the smcNANDConfig.
  330. *
  331. * @param smcNANDConfig : Point to a SMC_NANDConfig_T structure.
  332. *
  333. * @retval None
  334. */
  335. void SMC_ConfigNAND(SMC_NANDConfig_T *smcNANDConfig)
  336. {
  337. if (smcNANDConfig->bank == SMC_BANK2_NAND)
  338. {
  339. SMC_Bank2->CTRL2_B.WAITFEN = smcNANDConfig->waitFeature;
  340. SMC_Bank2->CTRL2_B.DBWIDCFG = smcNANDConfig->memoryDataWidth;
  341. SMC_Bank2->CTRL2_B.ECCEN = smcNANDConfig->ECC;
  342. SMC_Bank2->CTRL2_B.ECCPSCFG = smcNANDConfig->ECCPageSize;
  343. SMC_Bank2->CTRL2_B.C2RDCFG = smcNANDConfig->TCLRSetupTime;
  344. SMC_Bank2->CTRL2_B.A2RDCFG = smcNANDConfig->TARSetupTime;
  345. SMC_Bank2->CTRL2_B.MTYPECFG = BIT_SET;
  346. SMC_Bank2->CMSTIM2_B.SET2 = \
  347. smcNANDConfig->commonSpaceTimingStruct->setupTime;
  348. SMC_Bank2->CMSTIM2_B.WAIT2 = \
  349. smcNANDConfig->commonSpaceTimingStruct->waitSetupTime;
  350. SMC_Bank2->CMSTIM2_B.HLD2 = \
  351. smcNANDConfig->commonSpaceTimingStruct->holdSetupTime;
  352. SMC_Bank2->CMSTIM2_B.HIZ2 = \
  353. smcNANDConfig->commonSpaceTimingStruct->HiZSetupTime;
  354. SMC_Bank2->AMSTIM2_B.SET2 = \
  355. smcNANDConfig->attributeSpaceTimingStruct->setupTime;
  356. SMC_Bank2->AMSTIM2_B.WAIT2 = \
  357. smcNANDConfig->attributeSpaceTimingStruct->waitSetupTime;
  358. SMC_Bank2->AMSTIM2_B.HLD2 = \
  359. smcNANDConfig->attributeSpaceTimingStruct->holdSetupTime;
  360. SMC_Bank2->AMSTIM2_B.HIZ2 = \
  361. smcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime;
  362. }
  363. else if (smcNANDConfig->bank == SMC_BANK3_NAND)
  364. {
  365. SMC_Bank3->CTRL3_B.WAITFEN = smcNANDConfig->waitFeature;
  366. SMC_Bank3->CTRL3_B.DBWIDCFG = smcNANDConfig->memoryDataWidth;
  367. SMC_Bank3->CTRL3_B.ECCEN = smcNANDConfig->ECC;
  368. SMC_Bank3->CTRL3_B.ECCPSCFG = smcNANDConfig->ECCPageSize;
  369. SMC_Bank3->CTRL3_B.C2RDCFG = smcNANDConfig->TCLRSetupTime;
  370. SMC_Bank3->CTRL3_B.A2RDCFG = smcNANDConfig->TARSetupTime;
  371. SMC_Bank3->CTRL3_B.MTYPECFG = BIT_SET;
  372. SMC_Bank3->CMSTIM3_B.SET3 = \
  373. smcNANDConfig->commonSpaceTimingStruct->setupTime;
  374. SMC_Bank3->CMSTIM3_B.WAIT3 = \
  375. smcNANDConfig->commonSpaceTimingStruct->waitSetupTime;
  376. SMC_Bank3->CMSTIM3_B.HLD3 = \
  377. smcNANDConfig->commonSpaceTimingStruct->holdSetupTime;
  378. SMC_Bank3->CMSTIM3_B.HIZ3 = \
  379. smcNANDConfig->commonSpaceTimingStruct->HiZSetupTime;
  380. SMC_Bank3->AMSTIM3_B.SET3 = \
  381. smcNANDConfig->attributeSpaceTimingStruct->setupTime;
  382. SMC_Bank3->AMSTIM3_B.WAIT3 = \
  383. smcNANDConfig->attributeSpaceTimingStruct->waitSetupTime;
  384. SMC_Bank3->AMSTIM3_B.HLD3 = \
  385. smcNANDConfig->attributeSpaceTimingStruct->holdSetupTime;
  386. SMC_Bank3->AMSTIM3_B.HIZ3 = \
  387. smcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime;
  388. }
  389. }
  390. /*!
  391. * @brief Config the SMC PCCARD according to the specified parameters in the smcPCCardConfig.
  392. *
  393. * @param smcPCCardConfig: Point to a SMC_PCCARDConfig_T structure.
  394. *
  395. * @retval None
  396. */
  397. void SMC_ConfigPCCard(SMC_PCCARDConfig_T *smcPCCardConfig)
  398. {
  399. SMC_Bank4->CTRL4_B.WAITFEN = smcPCCardConfig->waitFeature;
  400. SMC_Bank4->CTRL4_B.C2RDCFG = smcPCCardConfig->TCLRSetupTime;
  401. SMC_Bank4->CTRL4_B.A2RDCFG = smcPCCardConfig->TARSetupTime;
  402. SMC_Bank4->CTRL4_B.DBWIDCFG = BIT_SET;
  403. SMC_Bank4->CMSTIM4_B.SET4 = \
  404. smcPCCardConfig->commonSpaceTimingStruct->setupTime;
  405. SMC_Bank4->CMSTIM4_B.WAIT4 = \
  406. smcPCCardConfig->commonSpaceTimingStruct->waitSetupTime;
  407. SMC_Bank4->CMSTIM4_B.HLD4 = \
  408. smcPCCardConfig->commonSpaceTimingStruct->holdSetupTime;
  409. SMC_Bank4->CMSTIM4_B.HIZ4 = \
  410. smcPCCardConfig->commonSpaceTimingStruct->HiZSetupTime;
  411. SMC_Bank4->AMSTIM4_B.SET4 = \
  412. smcPCCardConfig->attributeSpaceTimingStruct->setupTime;
  413. SMC_Bank4->AMSTIM4_B.WAIT4 = \
  414. smcPCCardConfig->attributeSpaceTimingStruct->waitSetupTime;
  415. SMC_Bank4->AMSTIM4_B.HLD4 = \
  416. smcPCCardConfig->attributeSpaceTimingStruct->holdSetupTime;
  417. SMC_Bank4->AMSTIM4_B.HIZ4 = \
  418. smcPCCardConfig->attributeSpaceTimingStruct->HiZSetupTime;
  419. SMC_Bank4->IOSTIM4_B.SET = \
  420. smcPCCardConfig->IOSpaceTimingStruct->setupTime;
  421. SMC_Bank4->IOSTIM4_B.WAIT = \
  422. smcPCCardConfig->IOSpaceTimingStruct->waitSetupTime;
  423. SMC_Bank4->IOSTIM4_B.HLD = \
  424. smcPCCardConfig->IOSpaceTimingStruct->holdSetupTime;
  425. SMC_Bank4->IOSTIM4_B.HIZ = \
  426. smcPCCardConfig->IOSpaceTimingStruct->HiZSetupTime;
  427. }
  428. /*!
  429. * @brief Fills each smcNORSRAMConfig member with its default value.
  430. *
  431. * @param smcNORSRAMConfig : Point to a SMC_NORSRAMConfig_T structure.
  432. *
  433. * @retval None
  434. */
  435. void SMC_ConfigNORSRAMStructInit(SMC_NORSRAMConfig_T *smcNORSRAMConfig)
  436. {
  437. smcNORSRAMConfig->bank = SMC_BANK1_NORSRAM_1;
  438. smcNORSRAMConfig->dataAddressMux = SMC_DATA_ADDRESS_MUX_ENABLE;
  439. smcNORSRAMConfig->memoryType = SMC_MEMORY_TYPE_SRAM;
  440. smcNORSRAMConfig->memoryDataWidth = SMC_MEMORY_DATA_WIDTH_8BIT;
  441. smcNORSRAMConfig->burstAcceesMode = SMC_BURST_ACCESS_MODE_DISABLE;
  442. smcNORSRAMConfig->asynchronousWait = SMC_ASYNCHRONOUS_WAIT_DISABLE;
  443. smcNORSRAMConfig->waitSignalPolarity = SMC_WAIT_SIGNAL_POLARITY_LOW;
  444. smcNORSRAMConfig->wrapMode = SMC_WRAP_MODE_DISABLE;
  445. smcNORSRAMConfig->waitSignalActive = SMC_WAIT_SIGNAL_ACTIVE_BEFORE_WAIT_STATE;
  446. smcNORSRAMConfig->writeOperation = SMC_WRITE_OPERATION_ENABLE;
  447. smcNORSRAMConfig->waiteSignal = SMC_WAITE_SIGNAL_ENABLE;
  448. smcNORSRAMConfig->extendedMode = SMC_EXTENDEN_MODE_DISABLE;
  449. smcNORSRAMConfig->writeBurst = SMC_WRITE_BURST_DISABLE;
  450. smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime = 0xF;
  451. smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime = 0xF;
  452. smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime = 0xFF;
  453. smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime = 0xF;
  454. smcNORSRAMConfig->readWriteTimingStruct->clockDivision = 0xF;
  455. smcNORSRAMConfig->readWriteTimingStruct->dataLatency = 0xF;
  456. smcNORSRAMConfig->readWriteTimingStruct->accessMode = SMC_ACCESS_MODE_A;
  457. smcNORSRAMConfig->writeTimingStruct->addressSetupTime = 0xF;
  458. smcNORSRAMConfig->writeTimingStruct->addressHodeTime = 0xF;
  459. smcNORSRAMConfig->writeTimingStruct->dataSetupTime = 0xFF;
  460. smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime = 0xF;
  461. smcNORSRAMConfig->writeTimingStruct->clockDivision = 0xF;
  462. smcNORSRAMConfig->writeTimingStruct->dataLatency = 0xF;
  463. smcNORSRAMConfig->writeTimingStruct->accessMode = SMC_ACCESS_MODE_A;
  464. }
  465. /*!
  466. * @brief Fills each smcNANDConfig member with its default value.
  467. *
  468. * @param smcNANDConfig : Point to a SMC_NANDConfig_T structure.
  469. *
  470. * @retval None
  471. */
  472. void SMC_ConfigNANDStructInit(SMC_NANDConfig_T *smcNANDConfig)
  473. {
  474. smcNANDConfig->bank = SMC_BANK2_NAND;
  475. smcNANDConfig->waitFeature = SMC_WAIT_FEATURE_DISABLE;
  476. smcNANDConfig->memoryDataWidth = SMC_MEMORY_DATA_WIDTH_8BIT;
  477. smcNANDConfig->ECC = SMC_ECC_DISABLE;
  478. smcNANDConfig->ECCPageSize = SMC_ECC_PAGE_SIZE_BYTE_256;
  479. smcNANDConfig->TCLRSetupTime = 0x0;
  480. smcNANDConfig->TARSetupTime = 0x0;
  481. smcNANDConfig->commonSpaceTimingStruct->setupTime = 0xFC;
  482. smcNANDConfig->commonSpaceTimingStruct->waitSetupTime = 0xFC;
  483. smcNANDConfig->commonSpaceTimingStruct->holdSetupTime = 0xFC;
  484. smcNANDConfig->commonSpaceTimingStruct->HiZSetupTime = 0xFC;
  485. smcNANDConfig->attributeSpaceTimingStruct->setupTime = 0xFC;
  486. smcNANDConfig->attributeSpaceTimingStruct->waitSetupTime = 0xFC;
  487. smcNANDConfig->attributeSpaceTimingStruct->holdSetupTime = 0xFC;
  488. smcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime = 0xFC;
  489. }
  490. /*!
  491. * @brief Fills each smcPCCardConfig member with its default value.
  492. *
  493. * @param smcPCCardConfig : Point to a SMC_PCCARDConfig_T structure.
  494. *
  495. * @retval None
  496. */
  497. void SMC_ConfigPCCardStructInit(SMC_PCCARDConfig_T *smcPCCardConfig)
  498. {
  499. smcPCCardConfig->waitFeature = SMC_WAIT_FEATURE_DISABLE;
  500. smcPCCardConfig->TCLRSetupTime = 0x0;
  501. smcPCCardConfig->TARSetupTime = 0x0;
  502. smcPCCardConfig->commonSpaceTimingStruct->setupTime = 0xFC;
  503. smcPCCardConfig->commonSpaceTimingStruct->waitSetupTime = 0xFC;
  504. smcPCCardConfig->commonSpaceTimingStruct->holdSetupTime = 0xFC;
  505. smcPCCardConfig->commonSpaceTimingStruct->HiZSetupTime = 0xFC;
  506. smcPCCardConfig->attributeSpaceTimingStruct->setupTime = 0xFC;
  507. smcPCCardConfig->attributeSpaceTimingStruct->waitSetupTime = 0xFC;
  508. smcPCCardConfig->attributeSpaceTimingStruct->holdSetupTime = 0xFC;
  509. smcPCCardConfig->attributeSpaceTimingStruct->HiZSetupTime = 0xFC;
  510. smcPCCardConfig->IOSpaceTimingStruct->setupTime = 0xFC;
  511. smcPCCardConfig->IOSpaceTimingStruct->waitSetupTime = 0xFC;
  512. smcPCCardConfig->IOSpaceTimingStruct->holdSetupTime = 0xFC;
  513. smcPCCardConfig->IOSpaceTimingStruct->HiZSetupTime = 0xFC;
  514. }
  515. /*!
  516. * @brief Enables the specified NOR/SRAM Memory Bank.
  517. *
  518. * @param bank: Selects the SMC Bank.
  519. * The parameter can be one of following values:
  520. * @arg SMC_BANK1_NORSRAM_1 : SMC Bank1 NOR/SRAM1
  521. * @arg SMC_BANK1_NORSRAM_2 : SMC Bank1 NOR/SRAM2
  522. * @arg SMC_BANK1_NORSRAM_3 : SMC Bank1 NOR/SRAM3
  523. * @arg SMC_BANK1_NORSRAM_4 : SMC Bank1 NOR/SRAM4
  524. *
  525. * @retval None
  526. */
  527. void SMC_EnableNORSRAM(SMC_BANK1_NORSRAM_T bank)
  528. {
  529. if (bank == SMC_BANK1_NORSRAM_1)
  530. {
  531. SMC_Bank1->CSCTRL1_B.MBKEN = BIT_SET;
  532. }
  533. else if (bank == SMC_BANK1_NORSRAM_2)
  534. {
  535. SMC_Bank1->CSCTRL2_B.MBKEN = BIT_SET;
  536. }
  537. else if (bank == SMC_BANK1_NORSRAM_3)
  538. {
  539. SMC_Bank1->CSCTRL3_B.MBKEN = BIT_SET;
  540. }
  541. else if (bank == SMC_BANK1_NORSRAM_4)
  542. {
  543. SMC_Bank1->CSCTRL4_B.MBKEN = BIT_SET;
  544. }
  545. }
  546. /*!
  547. * @brief Disbles the specified NOR/SRAM Memory Bank.
  548. *
  549. * @param bank: Selects the SMC Bank.
  550. * The parameter can be one of following values:
  551. * @arg SMC_BANK1_NORSRAM_1 : SMC Bank1 NOR/SRAM1
  552. * @arg SMC_BANK1_NORSRAM_2 : SMC Bank1 NOR/SRAM2
  553. * @arg SMC_BANK1_NORSRAM_3 : SMC Bank1 NOR/SRAM3
  554. * @arg SMC_BANK1_NORSRAM_4 : SMC Bank1 NOR/SRAM4
  555. *
  556. * @retval None
  557. */
  558. void SMC_DisableNORSRAM(SMC_BANK1_NORSRAM_T bank)
  559. {
  560. if (bank == SMC_BANK1_NORSRAM_1)
  561. {
  562. SMC_Bank1->CSCTRL1_B.MBKEN = BIT_RESET;
  563. }
  564. else if (bank == SMC_BANK1_NORSRAM_2)
  565. {
  566. SMC_Bank1->CSCTRL2_B.MBKEN = BIT_RESET;
  567. }
  568. else if (bank == SMC_BANK1_NORSRAM_3)
  569. {
  570. SMC_Bank1->CSCTRL3_B.MBKEN = BIT_RESET;
  571. }
  572. else if (bank == SMC_BANK1_NORSRAM_4)
  573. {
  574. SMC_Bank1->CSCTRL4_B.MBKEN = BIT_RESET;
  575. }
  576. }
  577. /*!
  578. * @brief Enables the specified NAND Memory Bank.
  579. *
  580. * @param bank: Selects the SMC Bank.
  581. * The parameter can be one of following values:
  582. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  583. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  584. *
  585. * @retval None
  586. */
  587. void SMC_EnableNAND(SMC_BANK_NAND_T bank)
  588. {
  589. if (bank == SMC_BANK2_NAND)
  590. {
  591. SMC_Bank2->CTRL2_B.MBKEN = BIT_SET;
  592. }
  593. else if (bank == SMC_BANK3_NAND)
  594. {
  595. SMC_Bank3->CTRL3_B.MBKEN = BIT_SET;
  596. }
  597. }
  598. /*!
  599. * @brief Disbles the specified NAND Memory Bank.
  600. *
  601. * @param bank: Selects the SMC Bank.
  602. * The parameter can be one of following values:
  603. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  604. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  605. *
  606. * @retval None
  607. */
  608. void SMC_DisableNAND(SMC_BANK_NAND_T bank)
  609. {
  610. if (bank == SMC_BANK2_NAND)
  611. {
  612. SMC_Bank2->CTRL2_B.MBKEN = BIT_RESET;
  613. }
  614. else if (bank == SMC_BANK3_NAND)
  615. {
  616. SMC_Bank3->CTRL3_B.MBKEN = BIT_RESET;
  617. }
  618. }
  619. /*!
  620. * @brief Enables the specified PC Card Memory Bank.
  621. *
  622. * @param None
  623. *
  624. * @retval None
  625. */
  626. void SMC_EnablePCCARD(void)
  627. {
  628. SMC_Bank4->CTRL4_B.MBKEN = BIT_SET;
  629. }
  630. /*!
  631. * @brief Disables the specified PC Card Memory Bank.
  632. *
  633. * @param None
  634. *
  635. * @retval None
  636. */
  637. void SMC_DisablePCCARD(void)
  638. {
  639. SMC_Bank4->CTRL4_B.MBKEN = BIT_RESET;
  640. }
  641. /*!
  642. * @brief Enbles the SMC NAND ECC feature.
  643. *
  644. * @param bank: Selects the SMC Bank.
  645. * The parameter can be one of following values:
  646. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  647. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  648. *
  649. * @retval None
  650. */
  651. void SMC_EnableNANDECC(SMC_BANK_NAND_T bank)
  652. {
  653. if (bank == SMC_BANK2_NAND)
  654. {
  655. SMC_Bank2->CTRL2_B.ECCEN = BIT_SET;
  656. }
  657. else if (bank == SMC_BANK3_NAND)
  658. {
  659. SMC_Bank3->CTRL3_B.ECCEN = BIT_SET;
  660. }
  661. }
  662. /*!
  663. * @brief Disbles or disables the SMC NAND ECC feature.
  664. *
  665. * @param bank: Selects the SMC Bank.
  666. * The parameter can be one of following values:
  667. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  668. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  669. *
  670. * @retval None
  671. *
  672. * @note
  673. */
  674. void SMC_DisableNANDECC(SMC_BANK_NAND_T bank)
  675. {
  676. if (bank == SMC_BANK2_NAND)
  677. {
  678. SMC_Bank2->CTRL2_B.ECCEN = BIT_RESET;
  679. }
  680. else if (bank == SMC_BANK3_NAND)
  681. {
  682. SMC_Bank3->CTRL3_B.ECCEN = BIT_RESET;
  683. }
  684. }
  685. /*!
  686. * @brief Read the error correction code register value.
  687. *
  688. * @param bank: Selects the SMC Bank.
  689. * The parameter can be one of following values:
  690. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  691. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  692. *
  693. * @retval The value of Error Correction Code (ECC).
  694. */
  695. uint32_t SMC_ReadECC(SMC_BANK_NAND_T bank)
  696. {
  697. uint32_t eccval = 0x00000000;
  698. if (bank == SMC_BANK2_NAND)
  699. {
  700. eccval = SMC_Bank2->ECCRS2;
  701. }
  702. else if (bank == SMC_BANK3_NAND)
  703. {
  704. eccval = SMC_Bank3->ECCRS3;
  705. }
  706. return eccval;
  707. }
  708. /*!
  709. * @brief Enables the specified SMC interrupts.
  710. *
  711. * @param bank: Selects the SMC Bank.
  712. * The parameter can be one of following values:
  713. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  714. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  715. * @arg SMC_BANK4_PCCARD : SMC Bank4 PCCARD
  716. *
  717. * @param interrupt: Select the SMC interrupt sources.
  718. * This parameter can be any combination of the following values:
  719. * @arg SMC_INT_EDGE_RISING : Rising edge detection interrupt.
  720. * @arg SMC_INT_LEVEL_HIGH : High level detection interrupt.
  721. * @arg SMC_INT_EDGE_FALLING : Falling edge detection interrupt.
  722. *
  723. * @retval None
  724. */
  725. void SMC_EnableInterrupt(SMC_BANK_NAND_T bank, uint32_t interrupt)
  726. {
  727. if (bank == SMC_BANK2_NAND)
  728. {
  729. SMC_Bank2->STSINT2 |= interrupt;
  730. }
  731. else if (bank == SMC_BANK3_NAND)
  732. {
  733. SMC_Bank3->STSINT3 |= interrupt;
  734. }
  735. else
  736. {
  737. SMC_Bank4->STSINT4 |= interrupt;
  738. }
  739. }
  740. /*!
  741. * @brief Enables the specified SMC interrupts.
  742. *
  743. * @param bank: Selects the SMC Bank.
  744. * The parameter can be one of following values:
  745. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  746. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  747. * @arg SMC_BANK4_PCCARD : SMC Bank4 PCCARD
  748. *
  749. * @param interrupt: Select the SMC interrupt sources.
  750. * This parameter can be any combination of the following values:
  751. * @arg SMC_INT_EDGE_RISING : Rising edge detection interrupt.
  752. * @arg SMC_INT_LEVEL_HIGH : High level edge detection interrupt.
  753. * @arg SMC_INT_EDGE_FALLING : Falling edge detection interrupt.
  754. *
  755. * @retval None
  756. */
  757. void SMC_DisableInterrupt(SMC_BANK_NAND_T bank, uint32_t interrupt)
  758. {
  759. if (bank == SMC_BANK2_NAND)
  760. {
  761. SMC_Bank2->STSINT2 &= ~interrupt;
  762. }
  763. else if (bank == SMC_BANK3_NAND)
  764. {
  765. SMC_Bank3->STSINT3 &= ~interrupt;
  766. }
  767. else
  768. {
  769. SMC_Bank4->STSINT4 &= ~interrupt;
  770. }
  771. }
  772. /*!
  773. * @brief Read the status of specified SMC flag.
  774. *
  775. * @param bank: Selects the SMC Bank.
  776. * The parameter can be one of following values:
  777. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  778. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  779. * @arg SMC_BANK4_PCCARD : SMC Bank4 PCCARD
  780. *
  781. * @param flag: Select the SMC interrupt sources.
  782. * This parameter can be one of the following values:
  783. * @arg SMC_FLAG_EDGE_RISING : Rising egde detection Flag.
  784. * @arg SMC_FLAG_LEVEL_HIGH : High level detection Flag.
  785. * @arg SMC_FLAG_EDGE_FALLING : Falling egde detection Flag.
  786. * @arg SMC_FLAG_FIFO_EMPTY : FIFO empty Flag.
  787. *
  788. * @retval SET or RESET
  789. *
  790. * @note
  791. */
  792. uint16_t SMC_ReadStatusFlag(SMC_BANK_NAND_T bank, SMC_FLAG_T flag)
  793. {
  794. if (bank == SMC_BANK2_NAND)
  795. {
  796. return (SMC_Bank2->STSINT2 & flag) ? SET : RESET;
  797. }
  798. else if (bank == SMC_BANK3_NAND)
  799. {
  800. return (SMC_Bank3->STSINT3 & flag) ? SET : RESET;
  801. }
  802. else
  803. {
  804. return (SMC_Bank4->STSINT4 & flag) ? SET : RESET;
  805. }
  806. }
  807. /*!
  808. * @brief Clears the SMC's pending flags.
  809. *
  810. * @param bank: Selects the SMC Bank.
  811. * The parameter can be one of following values:
  812. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  813. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  814. * @arg SMC_BANK4_PCCARD : SMC Bank4 PCCARD
  815. *
  816. * @param flag: Select the SMC interrupt sources.
  817. * This parameter can be any combination of the following values:
  818. * @arg SMC_FLAG_EDGE_RISING : Rising egde detection Flag.
  819. * @arg SMC_FLAG_LEVEL_HIGH : High level detection Flag.
  820. * @arg SMC_FLAG_EDGE_FALLING : Falling egde detection Flag.
  821. *
  822. * @retval None
  823. */
  824. void SMC_ClearStatusFlag(SMC_BANK_NAND_T bank, uint32_t flag)
  825. {
  826. if (bank == SMC_BANK2_NAND)
  827. {
  828. SMC_Bank2->STSINT2 &= ~flag;
  829. }
  830. else if (bank == SMC_BANK3_NAND)
  831. {
  832. SMC_Bank3->STSINT3 &= ~flag;
  833. }
  834. else
  835. {
  836. SMC_Bank4->STSINT4 &= ~flag;
  837. }
  838. }
  839. /*!
  840. * @brief Read the specified SMC interrupt has occurred or not.
  841. *
  842. * @param bank: Selects the SMC Bank.
  843. * The parameter can be one of following values:
  844. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  845. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  846. * @arg SMC_BANK4_PCCARD : SMC Bank4 PCCARD
  847. *
  848. * @param flag: Select the SMC interrupt source.
  849. * This parameter can be one of the following values:
  850. * @arg SMC_INT_EDGE_RISING : Rising edge detection interrupt.
  851. * @arg SMC_INT_LEVEL_HIGH : High level edge detection interrupt.
  852. * @arg SMC_INT_EDGE_FALLING : Falling edge detection interrupt.
  853. *
  854. * @retval The status of specified SMC interrupt source.
  855. */
  856. uint16_t SMC_ReadIntFlag(SMC_BANK_NAND_T bank, SMC_INT_T flag)
  857. {
  858. uint32_t tmpStatus = 0x0, itstatus = 0x0, itenable = 0x0;
  859. if (bank == SMC_BANK2_NAND)
  860. {
  861. tmpStatus = SMC_Bank2->STSINT2;
  862. }
  863. else if (bank == SMC_BANK3_NAND)
  864. {
  865. tmpStatus = SMC_Bank3->STSINT3;
  866. }
  867. else
  868. {
  869. tmpStatus = SMC_Bank4->STSINT4;
  870. }
  871. itstatus = tmpStatus & flag;
  872. itenable = tmpStatus & (flag >> 3);
  873. if ((itstatus != RESET) && (itenable != RESET))
  874. {
  875. return SET;
  876. }
  877. else
  878. {
  879. return RESET;
  880. }
  881. }
  882. /*!
  883. * @brief Clears the SMC's interrupt Flag.
  884. *
  885. * @param bank: Selects the SMC Bank.
  886. * The parameter can be one of following values:
  887. * @arg SMC_BANK2_NAND : SMC Bank2 NAND
  888. * @arg SMC_BANK3_NAND : SMC Bank3 NAND
  889. * @arg SMC_BANK4_PCCARD : SMC Bank4 PCCARD
  890. *
  891. * @param interrupt: Select the SMC interrupt sources.
  892. * This parameter can be any combination of the following values:
  893. * @arg SMC_INT_EDGE_RISING : Rising edge detection interrupt.
  894. * @arg SMC_INT_LEVEL_HIGH : High level edge detection interrupt.
  895. * @arg SMC_INT_EDGE_FALLING : Falling edge detection interrupt.
  896. *
  897. * @retval None
  898. */
  899. void SMC_ClearIntFlag(SMC_BANK_NAND_T bank, uint32_t flag)
  900. {
  901. if (bank == SMC_BANK2_NAND)
  902. {
  903. SMC_Bank2->STSINT2 &= ~(flag >> 3);
  904. }
  905. else if (bank == SMC_BANK3_NAND)
  906. {
  907. SMC_Bank3->STSINT3 &= ~(flag >> 3);
  908. }
  909. else
  910. {
  911. SMC_Bank4->STSINT4 &= ~(flag >> 3);
  912. }
  913. }
  914. /**@} end of group SMC_Functions */
  915. /**@} end of group SMC_Driver */
  916. /**@} end of group APM32F4xx_StdPeriphDriver */