gpio.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. /******************************************************************************
  2. * @brief providing common gpio API.
  3. *
  4. ******************************************************************************/
  5. #include "gpio.h"
  6. /******************************************************************************
  7. * Local variables
  8. ******************************************************************************/
  9. /******************************************************************************
  10. * Local function prototypes
  11. ******************************************************************************/
  12. /******************************************************************************
  13. * Local functions
  14. *****************************************************************************/
  15. /******************************************************************************
  16. * Global functions
  17. ******************************************************************************/
  18. /******************************************************************************
  19. * define GPIO APIs
  20. *
  21. *//*! @addtogroup gpio_api_list
  22. * @{
  23. *******************************************************************************/
  24. /*****************************************************************************//*!
  25. * @brief Initialize the GPIO registers to the default reset values.
  26. *
  27. * @param[in] pGPIO Pointer to GPIO module, can be GPIOA/GPIOB.
  28. *
  29. * @return none
  30. *
  31. * @ Pass/ Fail criteria: none
  32. *****************************************************************************/
  33. void GPIO_DeInit(GPIO_Type *pGPIO)
  34. {
  35. /* Sanity check */
  36. #if defined(CPU_NV32)
  37. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB));
  38. #endif
  39. #if defined(CPU_NV32M3)
  40. ASSERT(pGPIO == GPIOA);
  41. #endif
  42. #if defined(CPU_NV32M4)
  43. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB) || (pGPIO == GPIOC));
  44. #endif
  45. pGPIO->PCOR = 0x00000000; /* Port Clear Output Register */
  46. pGPIO->PDDR = 0x00000000; /* Port Data Direction */
  47. //pGPIO->PDIR = 0x00000000; /* Port Data Input Register */
  48. pGPIO->PDOR = 0x00000000; /* Port Data Output Register */
  49. pGPIO->PIDR = 0xFFFFFFFF; /* Port Input Disable Register */
  50. pGPIO->PSOR = 0x00000000; /* Port Set Output Register */
  51. pGPIO->PTOR = 0x00000000; /* Port Toggle Output Register */
  52. }
  53. /*****************************************************************************//*!
  54. * @brief Initialize GPIO pins which are specified by u32PinMask
  55. *
  56. * @param[in] pGPIO Pointer to GPIO module, can be GPIOA/GPIOB.
  57. * @param[in] u32PinMask GPIO pin mask need to be set
  58. * @param[in] sGpioType pin attribute
  59. *
  60. * @return none
  61. *
  62. * @Note
  63. * . High-current drive function is disabled, if the pin is configured as an input
  64. * . Internal pullup is disabled if the pin is configured as an output
  65. *
  66. * @ Pass/ Fail criteria: none
  67. *****************************************************************************/
  68. void GPIO_Init(GPIO_Type *pGPIO, uint32_t u32PinMask, GPIO_PinConfigType sGpioType)
  69. {
  70. /* Sanity check */
  71. #if defined(CPU_NV32)
  72. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB));
  73. #endif
  74. #if defined(CPU_NV32M3)
  75. ASSERT(pGPIO == GPIOA);
  76. #endif
  77. #if defined(CPU_NV32M4)
  78. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB) || (pGPIO == GPIOC));
  79. #endif
  80. /* Config GPIO for Input or Output */
  81. if ((sGpioType == GPIO_PinOutput) || (sGpioType == GPIO_PinOutput_HighCurrent))
  82. {
  83. pGPIO->PDDR |= u32PinMask; /* Enable Port Data Direction Register */
  84. pGPIO->PIDR |= u32PinMask; /* Set Port Input Disable Register */
  85. }
  86. else if ((sGpioType == GPIO_PinInput) || (sGpioType == GPIO_PinInput_InternalPullup))
  87. {
  88. pGPIO->PDDR &= ~u32PinMask; /* Disable Port Data Direction Register */
  89. pGPIO->PIDR &= ~u32PinMask; /* Clear Port Input Disable Register */
  90. }
  91. /* Config PORT Pull select for GPIO */
  92. #if defined(CPU_NV32)
  93. switch((uint32_t)pGPIO)
  94. {
  95. case GPIOA_BASE:
  96. (sGpioType == GPIO_PinInput_InternalPullup)?(PORT->PUEL |= u32PinMask):(PORT->PUEL &= ~u32PinMask);
  97. break;
  98. case GPIOB_BASE:
  99. (sGpioType == GPIO_PinInput_InternalPullup)?(PORT->PUEH |= u32PinMask):(PORT->PUEH &= ~u32PinMask);
  100. break;
  101. default:
  102. break;
  103. }
  104. #endif
  105. #if defined(CPU_NV32M3)
  106. switch((uint32_t)pGPIO)
  107. {
  108. case GPIOA_BASE:
  109. (sGpioType == GPIO_PinInput_InternalPullup)?(PORT->PUEL |= u32PinMask):(PORT->PUEL &= ~u32PinMask);
  110. break;
  111. default:
  112. break;
  113. }
  114. #endif
  115. #if defined(CPU_NV32M4)
  116. switch((uint32_t)pGPIO)
  117. {
  118. case GPIOA_BASE:
  119. (sGpioType == GPIO_PinInput_InternalPullup)?(PORT->PUE0 |= u32PinMask):(PORT->PUE0 &= ~u32PinMask);
  120. break;
  121. case GPIOB_BASE:
  122. (sGpioType == GPIO_PinInput_InternalPullup)?(PORT->PUE1 |= u32PinMask):(PORT->PUE1 &= ~u32PinMask);
  123. break;
  124. case GPIOC_BASE:
  125. (sGpioType == GPIO_PinInput_InternalPullup)?(PORT->PUE2 |= u32PinMask):(PORT->PUE2 &= ~u32PinMask);
  126. break;
  127. default:
  128. break;
  129. }
  130. #endif
  131. /* Config PORT GPIO_PinOutput_HighCurrent for GPIO */
  132. #if defined(CPU_NV32M3)
  133. if (u32PinMask & GPIO_PTC5_MASK)
  134. {
  135. PORT->HDRVE |= PORT_HDRVE_PTC5_MASK;
  136. }
  137. if (u32PinMask & GPIO_PTC1_MASK)
  138. {
  139. PORT->HDRVE |= PORT_HDRVE_PTC1_MASK;
  140. }
  141. if (u32PinMask & GPIO_PTB5_MASK)
  142. {
  143. PORT->HDRVE |= PORT_HDRVE_PTB5_MASK;
  144. }
  145. #endif
  146. #if defined(CPU_NV32) | defined(CPU_NV32M4)
  147. if (pGPIO == GPIOA)
  148. {
  149. if (u32PinMask & GPIO_PTB4_MASK)
  150. {
  151. PORT->HDRVE |= PORT_HDRVE_PTB4_MASK;
  152. }
  153. if (u32PinMask & GPIO_PTB5_MASK)
  154. {
  155. PORT->HDRVE |= PORT_HDRVE_PTB5_MASK;
  156. }
  157. if (u32PinMask & GPIO_PTD0_MASK)
  158. {
  159. PORT->HDRVE |= PORT_HDRVE_PTD0_MASK;
  160. }
  161. if (u32PinMask & GPIO_PTD1_MASK)
  162. {
  163. PORT->HDRVE |= PORT_HDRVE_PTD1_MASK;
  164. }
  165. }
  166. if (pGPIO == GPIOB)
  167. {
  168. if (u32PinMask & GPIO_PTE0_MASK)
  169. {
  170. PORT->HDRVE |= PORT_HDRVE_PTE0_MASK;
  171. }
  172. if (u32PinMask & GPIO_PTE1_MASK)
  173. {
  174. PORT->HDRVE |= PORT_HDRVE_PTE1_MASK;
  175. }
  176. if (u32PinMask & GPIO_PTH0_MASK)
  177. {
  178. PORT->HDRVE |= PORT_HDRVE_PTH0_MASK;
  179. }
  180. if (u32PinMask & GPIO_PTH1_MASK)
  181. {
  182. PORT->HDRVE |= PORT_HDRVE_PTH1_MASK;
  183. }
  184. }
  185. #endif
  186. }
  187. /*****************************************************************************//*!
  188. * @brief Toggle the pins which are specified by u32PinMask
  189. *
  190. * @param[in] pGPIO Pointer to GPIO module, can be GPIOA/GPIOB.
  191. * @param[in] u32PinMask Specify GPIO pin need to be toggled
  192. *
  193. * @return none
  194. *
  195. * @ Pass/ Fail criteria: none
  196. *****************************************************************************/
  197. void GPIO_Toggle(GPIO_Type *pGPIO, uint32_t u32PinMask)
  198. {
  199. /* Sanity check */
  200. #if defined(CPU_NV32)
  201. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB));
  202. #endif
  203. #if defined(CPU_NV32M3)
  204. ASSERT(pGPIO == GPIOA);
  205. #endif
  206. #if defined(CPU_NV32M4)
  207. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB) || (pGPIO == GPIOC));
  208. #endif
  209. pGPIO->PTOR = u32PinMask; /* Toggle the pins specified by u32PinMask */
  210. }
  211. /*****************************************************************************//*!
  212. * @brief Read input data from GPIO which is specified by pGPIO
  213. *
  214. * @param[in] pGPIO Pointer to GPIO module, can be GPIOA/GPIOB.
  215. *
  216. * @return GPIO input value unsigned int 32-bit
  217. *
  218. * @ Pass/ Fail criteria: none
  219. *****************************************************************************/
  220. uint32_t GPIO_Read(GPIO_Type *pGPIO)
  221. {
  222. /* Sanity check */
  223. #if defined(CPU_NV32)
  224. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB));
  225. #endif
  226. #if defined(CPU_NV32M3)
  227. ASSERT(pGPIO == GPIOA);
  228. #endif
  229. #if defined(CPU_NV32M4)
  230. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB) || (pGPIO == GPIOC));
  231. #endif
  232. return (pGPIO->PDIR); /* Read Port Data Input Register */
  233. }
  234. /*****************************************************************************//*!
  235. * @brief Read input data from Bit GPIO which is specified by pGPIO
  236. *
  237. * @param[in] pGPIO Pointer to GPIO module, can be GPIOA/GPIOB.
  238. *
  239. * @return Bit GPIO input value
  240. *
  241. * @ Pass/ Fail criteria: none
  242. *****************************************************************************/
  243. uint8_t GPIO_BitRead(GPIO_PinType GPIO_Pin)
  244. {
  245. uint8_t data;
  246. /* Sanity check */
  247. ASSERT(GPIO_Pin <= GPIO_PTI7);
  248. /* Config GPIO and pull select*/
  249. if (GPIO_Pin < GPIO_PTE0)
  250. {
  251. if(((1<<GPIO_Pin) & GPIOA->PDIR) > 0) /* Read Bit GPIO input value */
  252. data = 0x1; /* return value */
  253. else
  254. data = 0x0;
  255. }
  256. else if (GPIO_Pin < GPIO_PTI0)
  257. {
  258. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - 32);
  259. if(((1<<GPIO_Pin) & GPIOB->PDIR) > 0) /* Read Bit GPIO input value */
  260. data = 0x1; /* return value */
  261. else
  262. data = 0x0;
  263. }
  264. return data;
  265. }
  266. /*****************************************************************************//*!
  267. * @brief Write output data to GPIO which is specified by pGPIO
  268. *
  269. * @param[in] pGPIO Pointer to GPIO module, can be GPIOA/GPIOB.
  270. * @param[in] u32Value value to output
  271. *
  272. * @return none
  273. *
  274. * @ Pass/ Fail criteria: none
  275. *****************************************************************************/
  276. void GPIO_Write(GPIO_Type *pGPIO, uint32_t u32Value)
  277. {
  278. /* Sanity check */
  279. #if defined(CPU_NV32)
  280. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB));
  281. #endif
  282. #if defined(CPU_NV32M3)
  283. ASSERT(pGPIO == GPIOA);
  284. #endif
  285. #if defined(CPU_NV32M4)
  286. ASSERT((pGPIO == GPIOA) || (pGPIO == GPIOB) || (pGPIO == GPIOC));
  287. #endif
  288. pGPIO->PDOR = u32Value; /* Write Port Ouput Data Register */
  289. }
  290. /*****************************************************************************//*!
  291. * @brief Initialize GPIO single pin which is specified by GPIO_Pin
  292. *
  293. * @param[in] GPIO_Pin GPIO pin name, can be GPIO_PTA0,1 ...
  294. * @param[in] GPIO_PinConfig Config output or input
  295. *
  296. * @return none
  297. *
  298. * @ Pass/ Fail criteria: none
  299. *****************************************************************************/
  300. void GPIO_PinInit(GPIO_PinType GPIO_Pin, GPIO_PinConfigType GPIO_PinConfig)
  301. {
  302. /* Sanity check */
  303. ASSERT(GPIO_Pin <= GPIO_PTI7);
  304. /* Config GPIO and pull select*/
  305. #if defined(CPU_NV32)
  306. if (GPIO_Pin < GPIO_PTE0)
  307. {
  308. switch (GPIO_PinConfig)
  309. {
  310. case GPIO_PinOutput:
  311. GPIOA->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  312. GPIOA->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  313. PORT->PUEL &= ~(1<<GPIO_Pin); /* Disable Pullup */
  314. break;
  315. case GPIO_PinInput:
  316. GPIOA->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  317. GPIOA->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  318. PORT->PUEL &= ~(1<<GPIO_Pin); /* Disable Pullup */
  319. break;
  320. case GPIO_PinInput_InternalPullup:
  321. GPIOA->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  322. GPIOA->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  323. PORT->PUEL |= (1<<GPIO_Pin); /* Enable Pullup */
  324. break;
  325. case GPIO_PinOutput_HighCurrent:
  326. GPIOA->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  327. GPIOA->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  328. PORT->PUEL &= ~(1<<GPIO_Pin); /* Disable Pullup */
  329. break;
  330. }
  331. }
  332. else if (GPIO_Pin < GPIO_PTI0)
  333. {
  334. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - 32);
  335. switch (GPIO_PinConfig)
  336. {
  337. case GPIO_PinOutput:
  338. GPIOB->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  339. GPIOB->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  340. PORT->PUEH &= ~(1<<GPIO_Pin); /* Disable Pullup */
  341. break;
  342. case GPIO_PinInput:
  343. GPIOB->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  344. GPIOB->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  345. PORT->PUEH &= ~(1<<GPIO_Pin); /* Disable Pullup */
  346. break;
  347. case GPIO_PinInput_InternalPullup:
  348. GPIOB->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  349. GPIOB->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  350. PORT->PUEH |= (1<<GPIO_Pin); /* Enable Pullup */
  351. break;
  352. case GPIO_PinOutput_HighCurrent:
  353. GPIOB->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  354. GPIOB->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  355. PORT->PUEH &= ~(1<<GPIO_Pin); /* Disable Pullup */
  356. break;
  357. }
  358. }
  359. #endif
  360. #if defined(CPU_NV32M3)
  361. if (GPIO_Pin < GPIO_PTE0)
  362. {
  363. switch (GPIO_PinConfig)
  364. {
  365. case GPIO_PinOutput:
  366. GPIOA->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  367. GPIOA->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  368. PORT->PUEL &= ~(1<<GPIO_Pin); /* Disable Pullup */
  369. break;
  370. case GPIO_PinInput:
  371. GPIOA->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  372. GPIOA->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  373. PORT->PUEL &= ~(1<<GPIO_Pin); /* Disable Pullup */
  374. break;
  375. case GPIO_PinInput_InternalPullup:
  376. GPIOA->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  377. GPIOA->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  378. PORT->PUEL |= (1<<GPIO_Pin); /* Enable Pullup */
  379. break;
  380. case GPIO_PinOutput_HighCurrent:
  381. GPIOA->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  382. GPIOA->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  383. PORT->PUEL &= ~(1<<GPIO_Pin); /* Disable Pullup */
  384. break;
  385. }
  386. }
  387. #endif
  388. #if defined(CPU_NV32M4)
  389. if (GPIO_Pin < GPIO_PTE0)
  390. {
  391. switch (GPIO_PinConfig)
  392. {
  393. case GPIO_PinOutput:
  394. GPIOA->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  395. GPIOA->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  396. PORT->PUE0 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  397. break;
  398. case GPIO_PinInput:
  399. GPIOA->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  400. GPIOA->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  401. PORT->PUE0 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  402. break;
  403. case GPIO_PinInput_InternalPullup:
  404. GPIOA->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  405. GPIOA->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  406. PORT->PUE0 |= (1<<GPIO_Pin); /* Enable Pullup */
  407. break;
  408. case GPIO_PinOutput_HighCurrent:
  409. GPIOA->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  410. GPIOA->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  411. PORT->PUE0 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  412. break;
  413. }
  414. }
  415. else if (GPIO_Pin < GPIO_PTI0)
  416. {
  417. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - 32);
  418. switch (GPIO_PinConfig)
  419. {
  420. case GPIO_PinOutput:
  421. GPIOB->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  422. GPIOB->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  423. PORT->PUE1 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  424. break;
  425. case GPIO_PinInput:
  426. GPIOB->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  427. GPIOB->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  428. PORT->PUE1 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  429. break;
  430. case GPIO_PinInput_InternalPullup:
  431. GPIOB->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  432. GPIOB->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  433. PORT->PUE1 |= (1<<GPIO_Pin); /* Enable Pullup */
  434. break;
  435. case GPIO_PinOutput_HighCurrent:
  436. GPIOB->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  437. GPIOB->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  438. PORT->PUE1 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  439. break;
  440. }
  441. }
  442. else
  443. {
  444. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - 64);
  445. switch (GPIO_PinConfig)
  446. {
  447. case GPIO_PinOutput:
  448. GPIOC->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  449. GPIOC->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  450. PORT->PUE2 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  451. break;
  452. case GPIO_PinInput:
  453. GPIOC->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  454. GPIOC->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  455. PORT->PUE2 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  456. break;
  457. case GPIO_PinInput_InternalPullup:
  458. GPIOC->PDDR &= ~(1<<GPIO_Pin); /* Disable Port Data Direction Register */
  459. GPIOC->PIDR &= ~(1<<GPIO_Pin); /* Clear Port Input Disable Register */
  460. PORT->PUE2 |= (1<<GPIO_Pin); /* Enable Pullup */
  461. break;
  462. case GPIO_PinOutput_HighCurrent:
  463. GPIOC->PDDR |= (1<<GPIO_Pin); /* Enable Port Data Direction Register */
  464. GPIOC->PIDR |= (1<<GPIO_Pin); /* Set Port Input Disable Register */
  465. PORT->PUE2 &= ~(1<<GPIO_Pin); /* Disable Pullup */
  466. break;
  467. }
  468. }
  469. #endif
  470. /* Config GPIO HDRV */
  471. if(GPIO_PinConfig == GPIO_PinOutput_HighCurrent)
  472. {
  473. #if defined(CPU_NV32M3)
  474. switch (GPIO_Pin)
  475. {
  476. case GPIO_PTB5:
  477. PORT->HDRVE |= PORT_HDRVE_PTB5_MASK;
  478. break;
  479. case GPIO_PTC1:
  480. PORT->HDRVE |= PORT_HDRVE_PTC1_MASK;
  481. break;
  482. case GPIO_PTC5:
  483. PORT->HDRVE |= PORT_HDRVE_PTC5_MASK;
  484. break;
  485. default:
  486. break;
  487. }
  488. #endif
  489. #if defined(CPU_NV32M4) | defined(CPU_NV32)
  490. switch (GPIO_Pin)
  491. {
  492. case GPIO_PTB4:
  493. PORT->HDRVE |= PORT_HDRVE_PTB4_MASK;
  494. break;
  495. case GPIO_PTB5:
  496. PORT->HDRVE |= PORT_HDRVE_PTB5_MASK;
  497. break;
  498. case GPIO_PTD0:
  499. PORT->HDRVE |= PORT_HDRVE_PTD0_MASK;
  500. break;
  501. case GPIO_PTD1:
  502. PORT->HDRVE |= PORT_HDRVE_PTD1_MASK;
  503. break;
  504. case GPIO_PTE0:
  505. PORT->HDRVE |= PORT_HDRVE_PTE0_MASK;
  506. break;
  507. case GPIO_PTE1:
  508. PORT->HDRVE |= PORT_HDRVE_PTE1_MASK;
  509. break;
  510. case GPIO_PTH0:
  511. PORT->HDRVE |= PORT_HDRVE_PTH0_MASK;
  512. break;
  513. case GPIO_PTH1:
  514. PORT->HDRVE |= PORT_HDRVE_PTH1_MASK;
  515. break;
  516. default:
  517. break;
  518. }
  519. #endif
  520. }
  521. }
  522. /*****************************************************************************//*!
  523. * @brief Toggle GPIO single pin which is specified by GPIO_Pin
  524. *
  525. * @param[in] GPIO_Pin GPIO pin name, can be GPIO_PTA0,1 ...
  526. *
  527. * @return none
  528. *
  529. * @ Pass/ Fail criteria: none
  530. *****************************************************************************/
  531. void GPIO_PinToggle(GPIO_PinType GPIO_Pin)
  532. {
  533. /* Sanity check */
  534. ASSERT(GPIO_Pin <= GPIO_PTI7);
  535. if (GPIO_Pin < GPIO_PTE0)
  536. {
  537. /* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
  538. GPIOA->PTOR = (1<<GPIO_Pin);
  539. }
  540. #if (defined(CPU_NV32) | defined(CPU_NV32M4))
  541. else if (GPIO_Pin < GPIO_PTI0)
  542. {
  543. /* PTE0-7, PTF0-7, PTH0-7, PTI0-7 */
  544. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTE0);
  545. GPIOB->PTOR = (1<<GPIO_Pin);
  546. }
  547. #endif
  548. #if defined(CPU_NV32M4)
  549. else if(GPIO_Pin < GPIO_PIN_MAX)
  550. {
  551. /* PTI0-7 */
  552. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTI0);
  553. GPIOC->PTOR = (1<<GPIO_Pin);
  554. }
  555. #endif
  556. }
  557. /*****************************************************************************//*!
  558. * @brief Set GPIO single pin which is specified by GPIO_Pin
  559. *
  560. * @param[in] GPIO_Pin GPIO pin name, can be GPIO_PTA0,1 ...
  561. *
  562. * @return none
  563. *
  564. * @ Pass/ Fail criteria: none
  565. *****************************************************************************/
  566. void GPIO_PinSet(GPIO_PinType GPIO_Pin)
  567. {
  568. /* Sanity check */
  569. ASSERT(GPIO_Pin <= GPIO_PTI7);
  570. if (GPIO_Pin < GPIO_PTE0)
  571. {
  572. /* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
  573. GPIOA->PSOR = (1<<GPIO_Pin);
  574. }
  575. #if (defined(CPU_NV32) | defined(CPU_NV32M4))
  576. else if (GPIO_Pin < GPIO_PTI0)
  577. {
  578. /* PTE0-7, PTF0-7, PTH0-7, PTI0-7 */
  579. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTE0);
  580. GPIOB->PSOR = (1<<GPIO_Pin);
  581. }
  582. #endif
  583. #if defined(CPU_NV32M4)
  584. else if(GPIO_Pin < GPIO_PIN_MAX)
  585. {
  586. /* PTI0-7 */
  587. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTI0);
  588. GPIOC->PSOR = (1<<GPIO_Pin);
  589. }
  590. #endif
  591. }
  592. /*****************************************************************************//*!
  593. * @brief Clear GPIO single pin which is specified by GPIO_Pin
  594. *
  595. * @param[in] GPIO_Pin GPIO pin name, can be GPIO_PTA0,1 ...
  596. *
  597. * @return none
  598. *
  599. * @ Pass/ Fail criteria: none
  600. *****************************************************************************/
  601. void GPIO_PinClear(GPIO_PinType GPIO_Pin)
  602. {
  603. /* Sanity check */
  604. ASSERT(GPIO_Pin <= GPIO_PTI7);
  605. if (GPIO_Pin < GPIO_PTE0)
  606. {
  607. /* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
  608. GPIOA->PCOR = (1<<GPIO_Pin);
  609. }
  610. #if (defined(CPU_NV32) | defined(CPU_NV32M4))
  611. else if (GPIO_Pin < GPIO_PTI0)
  612. {
  613. /* PTE0-7, PTF0-7, PTH0-7, PTI0-7 */
  614. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTE0);
  615. GPIOB->PCOR = (1<<GPIO_Pin);
  616. }
  617. #endif
  618. #if defined(CPU_NV32M4)
  619. else if(GPIO_Pin < GPIO_PIN_MAX)
  620. {
  621. /* PTI0-7 */
  622. GPIO_Pin = (GPIO_PinType)(GPIO_Pin - GPIO_PTI0);
  623. GPIOC->PCOR = (1<<GPIO_Pin);
  624. }
  625. #endif
  626. }
  627. /*! @} End of gpio_api_list */