lib_gpio.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. /**
  2. ******************************************************************************
  3. * @file lib_gpio.c
  4. * @author Application Team
  5. * @version V4.4.0
  6. * @date 2018-09-27
  7. * @brief GPIO library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_gpio.h"
  14. /**
  15. * @brief GPIO initialization.
  16. * @param GPIOx: GPIOB~GPIOF
  17. InitStruct:GPIO configuration.
  18. GPIO_Pin: can use the ¡®|¡¯ operator
  19. GPIO_Pin_0 ~ GPIO_Pin_15 or GPIO_Pin_All
  20. GPIO_Mode:
  21. GPIO_Mode_INPUT
  22. GPIO_Mode_OUTPUT_CMOS
  23. GPIO_Mode_OUTPUT_OD
  24. GPIO_Mode_INOUT_OD
  25. GPIO_Mode_INOUT_CMOS
  26. GPIO_Mode_FORBIDDEN
  27. * @retval None
  28. */
  29. void GPIOBToF_Init(GPIO_TypeDef *GPIOx, GPIO_InitType *InitStruct)
  30. {
  31. uint32_t tmp_reg1, tmp_reg2;
  32. /* Check parameters */
  33. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  34. assert_parameters(IS_GPIO_PIN(InitStruct->GPIO_Pin));
  35. assert_parameters(IS_GPIO_MODE(InitStruct->GPIO_Mode));
  36. if (GPIOF == GPIOx)
  37. InitStruct->GPIO_Pin &= ~(GPIO_Pin_2);
  38. /* Configure ATT */
  39. if (InitStruct->GPIO_Mode & 0x2U)
  40. {
  41. tmp_reg1 = GPIOx->ATT;
  42. tmp_reg1 &= ~InitStruct->GPIO_Pin;
  43. if (InitStruct->GPIO_Mode & 0x1U)
  44. {
  45. tmp_reg1 |= InitStruct->GPIO_Pin;
  46. }
  47. GPIOx->ATT = tmp_reg1;
  48. }
  49. /* Configure output/input mode */
  50. tmp_reg1 = GPIOx->OEN;
  51. tmp_reg1 &= ~InitStruct->GPIO_Pin;
  52. tmp_reg2 = GPIOx->IE;
  53. tmp_reg2 &= ~InitStruct->GPIO_Pin;
  54. if (InitStruct->GPIO_Mode & 0x8U)
  55. {
  56. tmp_reg2 |= InitStruct->GPIO_Pin;
  57. }
  58. if (InitStruct->GPIO_Mode & 0x4U)
  59. {
  60. tmp_reg1 |= InitStruct->GPIO_Pin;
  61. }
  62. GPIOx->OEN = tmp_reg1;
  63. GPIOx->IE = tmp_reg2;
  64. }
  65. /**
  66. * @brief GPIOA initialization.
  67. * @param GPIOx: GPIOA
  68. InitStruct:GPIO configuration.
  69. GPIO_Pin: can use the ¡®|¡¯ operator
  70. GPIO_Pin_0 ~ GPIO_Pin_15 or GPIO_Pin_All
  71. GPIO_Mode:
  72. GPIO_Mode_INPUT
  73. GPIO_Mode_OUTPUT_CMOS
  74. GPIO_Mode_OUTPUT_OD
  75. GPIO_Mode_INOUT_OD
  76. GPIO_Mode_FORBIDDEN
  77. * @retval None
  78. */
  79. void GPIOA_Init(GPIOA_TypeDef *GPIOx, GPIO_InitType *InitStruct)
  80. {
  81. uint32_t tmp_reg1, tmp_reg2;
  82. /* Check parameters */
  83. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  84. assert_parameters(IS_GPIO_PIN(InitStruct->GPIO_Pin));
  85. assert_parameters(IS_GPIO_MODE(InitStruct->GPIO_Mode));
  86. /* Configure ATT */
  87. if (InitStruct->GPIO_Mode & 0x2U)
  88. {
  89. tmp_reg1 = GPIOx->ATT;
  90. tmp_reg1 &= ~InitStruct->GPIO_Pin;
  91. if (InitStruct->GPIO_Mode & 0x1U)
  92. {
  93. tmp_reg1 |= InitStruct->GPIO_Pin;
  94. }
  95. GPIOx->ATT = tmp_reg1;
  96. }
  97. /* Configure output/input mode */
  98. tmp_reg1 = GPIOx->OEN;
  99. tmp_reg1 &= ~InitStruct->GPIO_Pin;
  100. tmp_reg2 = GPIOx->IE;
  101. tmp_reg2 &= ~InitStruct->GPIO_Pin;
  102. if (InitStruct->GPIO_Mode & 0x8U)
  103. {
  104. tmp_reg2 |= InitStruct->GPIO_Pin;
  105. }
  106. if (InitStruct->GPIO_Mode & 0x4U)
  107. {
  108. tmp_reg1 |= InitStruct->GPIO_Pin;
  109. }
  110. GPIOx->OEN = tmp_reg1;
  111. GPIOx->IE = tmp_reg2;
  112. }
  113. /**
  114. * @brief Read input data register bit.
  115. * @param GPIOx: GPIOB~GPIOF
  116. GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15.
  117. * @retval input pin value.
  118. */
  119. uint8_t GPIOBToF_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
  120. {
  121. uint32_t tmp;
  122. /* Check parameters */
  123. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  124. assert_parameters(IS_GPIO_PINR(GPIO_Pin));
  125. tmp = GPIOx->STS;
  126. tmp &= GPIO_Pin;
  127. if (tmp)
  128. return 1;
  129. else
  130. return 0;
  131. }
  132. /**
  133. * @brief Read input data register bit.
  134. * @param GPIOx: GPIOA
  135. GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15.
  136. * @retval input pin value.
  137. */
  138. uint8_t GPIOA_ReadInputDataBit(GPIOA_TypeDef *GPIOx, uint16_t GPIO_Pin)
  139. {
  140. uint32_t tmp;
  141. /* Check parameters */
  142. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  143. assert_parameters(IS_GPIO_PINR(GPIO_Pin));
  144. tmp = GPIOx->STS;
  145. tmp &= GPIO_Pin;
  146. if (tmp)
  147. return 1;
  148. else
  149. return 0;
  150. }
  151. /**
  152. * @brief Read input data register.
  153. * @param GPIOx: GPIOB~GPIOF
  154. * @retval input port value.
  155. */
  156. uint16_t GPIOBToF_ReadInputData(GPIO_TypeDef* GPIOx)
  157. {
  158. /* Check parameters */
  159. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  160. return GPIOx->STS;
  161. }
  162. /**
  163. * @brief Read input data register.
  164. * @param GPIOx: GPIOA
  165. * @retval input port value.
  166. */
  167. uint16_t GPIOA_ReadInputData(GPIOA_TypeDef* GPIOx)
  168. {
  169. /* Check parameters */
  170. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  171. return GPIOx->STS;
  172. }
  173. /**
  174. * @brief Read output data register bit.
  175. * @param GPIOx: GPIOB~GPIOF
  176. GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15
  177. * @retval output pin value.
  178. */
  179. uint8_t GPIOBToF_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  180. {
  181. uint32_t tmp;
  182. /* Check parameters */
  183. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  184. assert_parameters(IS_GPIO_PINR(GPIO_Pin));
  185. tmp = GPIOx->DAT;
  186. tmp &= GPIO_Pin;
  187. if (tmp)
  188. return 1;
  189. else
  190. return 0;
  191. }
  192. /**
  193. * @brief Read output data register bit.
  194. * @param GPIOx: GPIOA
  195. GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15
  196. * @retval output pin value.
  197. */
  198. uint8_t GPIOA_ReadOutputDataBit(GPIOA_TypeDef* GPIOx, uint16_t GPIO_Pin)
  199. {
  200. uint32_t tmp;
  201. /* Check parameters */
  202. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  203. assert_parameters(IS_GPIO_PINR(GPIO_Pin));
  204. tmp = GPIOx->DAT;
  205. tmp &= GPIO_Pin;
  206. if (tmp)
  207. return 1;
  208. else
  209. return 0;
  210. }
  211. /**
  212. * @brief Read output data register.
  213. * @param GPIOx: GPIOB~GPIOF
  214. * @retval Output port value.
  215. */
  216. uint16_t GPIOBToF_ReadOutputData(GPIO_TypeDef* GPIOx)
  217. {
  218. /* Check parameters */
  219. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  220. return GPIOx->DAT;
  221. }
  222. /**
  223. * @brief Read output data register.
  224. * @param GPIOx: GPIOA
  225. * @retval Output port value.
  226. */
  227. uint16_t GPIOA_ReadOutputData(GPIOA_TypeDef* GPIOx)
  228. {
  229. /* Check parameters */
  230. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  231. return GPIOx->DAT;
  232. }
  233. /**
  234. * @brief Set output data register bit.
  235. * @param GPIOx: GPIOB~GPIOF
  236. GPIO_Pin: can use the ¡®|¡¯ operator
  237. GPIO_Pin_0 ~ GPIO_Pin_15 or GPIO_Pin_All
  238. * @retval None.
  239. */
  240. void GPIOBToF_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  241. {
  242. /* Check parameters */
  243. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  244. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  245. GPIOx->DAT |= GPIO_Pin;
  246. }
  247. /**
  248. * @brief Set output data register bit.
  249. * @param GPIOx: GPIOA
  250. GPIO_Pin: can use the ¡®|¡¯ operator
  251. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  252. * @retval None.
  253. */
  254. void GPIOA_SetBits(GPIOA_TypeDef* GPIOx, uint16_t GPIO_Pin)
  255. {
  256. /* Check parameters */
  257. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  258. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  259. GPIOx->DAT |= GPIO_Pin;
  260. }
  261. /**
  262. * @brief Reset output data register bit.
  263. * @param GPIOx: GPIOB~GPIOF
  264. GPIO_Pin: can use the ¡®|¡¯ operator
  265. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  266. * @retval None.
  267. */
  268. void GPIOBToF_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  269. {
  270. /* Check parameters */
  271. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  272. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  273. GPIOx->DAT &= ~GPIO_Pin;
  274. }
  275. /**
  276. * @brief Reset output data register bit.
  277. * @param GPIOx: GPIOA
  278. GPIO_Pin: can use the ¡®|¡¯ operator
  279. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  280. * @retval None.
  281. */
  282. void GPIOA_ResetBits(GPIOA_TypeDef* GPIOx, uint16_t GPIO_Pin)
  283. {
  284. /* Check parameters */
  285. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  286. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  287. GPIOx->DAT &= ~GPIO_Pin;
  288. }
  289. /**
  290. * @brief Write output data register bit.
  291. * @param GPIOx: GPIOB~GPIOF
  292. GPIO_Pin: can use the ¡®|¡¯ operator
  293. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  294. val:value write to register bit.
  295. * @retval None.
  296. */
  297. void GPIOBToF_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint8_t val)
  298. {
  299. /* Check parameters */
  300. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  301. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  302. assert_parameters(IS_GPIO_BITVAL(val));
  303. if (val == 1)
  304. {
  305. GPIOx->DAT |= GPIO_Pin;
  306. }
  307. else
  308. {
  309. GPIOx->DAT &= ~GPIO_Pin;
  310. }
  311. }
  312. /**
  313. * @brief Write output data register bit.
  314. * @param GPIOx: GPIOA
  315. GPIO_Pin: can use the ¡®|¡¯ operator
  316. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  317. val:value write to register bit.
  318. * @retval None.
  319. */
  320. void GPIOA_WriteBit(GPIOA_TypeDef* GPIOx, uint16_t GPIO_Pin, uint8_t val)
  321. {
  322. /* Check parameters */
  323. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  324. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  325. assert_parameters(IS_GPIO_BITVAL(val));
  326. if (val == 1)
  327. {
  328. GPIOx->DAT |= GPIO_Pin;
  329. }
  330. else
  331. {
  332. GPIOx->DAT &= ~GPIO_Pin;
  333. }
  334. }
  335. /**
  336. * @brief Write output data register.
  337. * @param GPIOx: GPIOB~GPIOF
  338. val:value write to register.
  339. * @retval None.
  340. */
  341. void GPIOBToF_Write(GPIO_TypeDef* GPIOx, uint16_t val)
  342. {
  343. /* Check parameters */
  344. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  345. GPIOx->DAT = val;
  346. }
  347. /**
  348. * @brief Write output data register.
  349. * @param GPIOx: GPIOA
  350. val:value write to register.
  351. * @retval None.
  352. */
  353. void GPIOA_Write(GPIOA_TypeDef* GPIOx, uint16_t val)
  354. {
  355. /* Check parameters */
  356. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  357. GPIOx->DAT = val;
  358. }
  359. /**
  360. * @brief GPIO AF configure.
  361. * @param GPIOx:GPIOB GPIOE
  362. GPIO_AFx:
  363. GPIOB_AF_PLLHDIV
  364. GPIOB_AF_OSC
  365. GPIOB_AF_PLLLOUT
  366. GPIOE_AF_CMP1O
  367. NewState:
  368. ENABLE
  369. DISABLE
  370. * @retval None.
  371. */
  372. void GPIOBToF_AFConfig(GPIO_TypeDef* GPIOx, uint32_t GPIO_AFx, uint8_t NewState)
  373. {
  374. uint32_t tmp;
  375. /* Check parameters */
  376. assert_parameters(IS_GPIOAF_ALL_INSTANCE(GPIOx));
  377. assert_parameters(IS_GPIO_GPIOAF(GPIO_AFx));
  378. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  379. if (GPIOx == GPIOB)
  380. {
  381. tmp = GPIOAF->SELB;
  382. if (NewState != DISABLE)
  383. {
  384. tmp |= GPIO_AFx;
  385. }
  386. else
  387. {
  388. tmp &= ~GPIO_AFx;
  389. }
  390. GPIOAF->SELB = tmp;
  391. }
  392. if (GPIOx == GPIOE)
  393. {
  394. tmp = GPIOAF->SELE;
  395. if (NewState != DISABLE)
  396. {
  397. tmp |= GPIO_AFx;
  398. }
  399. else
  400. {
  401. tmp &= ~GPIO_AFx;
  402. }
  403. GPIOAF->SELE = tmp;
  404. }
  405. }
  406. /**
  407. * @brief GPIO AF configure.
  408. * @param PMUIO_AFx:
  409. PMUIO7_AF_PLLDIV
  410. PMUIO_AF_CMP2O
  411. PMUIO3_AF_PLLDIV
  412. NewState:
  413. ENABLE
  414. DISABLE
  415. * @retval None.
  416. */
  417. void GPIOA_AFConfig(uint32_t PMUIO_AFx, uint8_t NewState)
  418. {
  419. /* Check parameters */
  420. assert_parameters(IS_GPIO_PMUIOAF(PMUIO_AFx));
  421. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  422. if (NewState != DISABLE)
  423. {
  424. GPIOA->SEL |= PMUIO_AFx;
  425. }
  426. else
  427. {
  428. GPIOA->SEL &= ~PMUIO_AFx;
  429. }
  430. }
  431. /**
  432. * @brief GPIO pin remap.
  433. * @param GPIO_Remap:
  434. GPIO_REMAP_I2C
  435. NewState:
  436. ENABLE
  437. DISABLE
  438. * @retval None.
  439. */
  440. void GPIO_PinRemapConfig(uint32_t GPIO_Remap, uint8_t NewState)
  441. {
  442. uint32_t tmp;
  443. /* Check parameters */
  444. assert_parameters(IS_GPIO_REMAP(GPIO_Remap));
  445. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  446. tmp = GPIOAF->_MISC;
  447. tmp &= ~GPIO_Remap;
  448. if (NewState == ENABLE)
  449. tmp |= GPIO_Remap;
  450. GPIOAF->_MISC = tmp;
  451. }
  452. /**
  453. * @brief GPIO PLLDIV configure.
  454. * @param Divider:
  455. GPIO_PLLDIV_1
  456. GPIO_PLLDIV_2
  457. GPIO_PLLDIV_4
  458. GPIO_PLLDIV_8
  459. GPIO_PLLDIV_16
  460. * @retval None.
  461. */
  462. void GPIO_PLLDIV_Config(uint32_t Divider)
  463. {
  464. uint32_t tmp;
  465. /* Check parameters */
  466. assert_parameters(IS_GPIO_PLLDIV(Divider));
  467. tmp = GPIOAF->_MISC;
  468. tmp &= ~IO_MISC_PLLHDIV;
  469. tmp |= Divider;
  470. GPIOAF->_MISC = tmp;
  471. }
  472. /**
  473. * @brief GPIOA de-glitch circuit control.
  474. * @param GPIO_Pin: can use the ¡®|¡¯ operator
  475. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  476. NewState:
  477. ENABLE
  478. DISABLE
  479. * @retval None.
  480. */
  481. void GPIOA_NoDeg_Cmd( uint16_t GPIO_Pin, uint8_t NewState)
  482. {
  483. uint16_t tmp;
  484. /* Check parameters */
  485. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  486. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  487. tmp = GPIOA->IOANODEG;
  488. /*IOA wake-up signal will not go through de-glitch circuit.*/
  489. if (NewState != DISABLE)
  490. {
  491. tmp |= GPIO_Pin;
  492. }
  493. /*IOA wake-up signal will go through de-glitch circuit.*/
  494. else
  495. {
  496. tmp &= ~GPIO_Pin;
  497. }
  498. GPIOA->IOANODEG = tmp;
  499. }
  500. /*********************************** END OF FILE ******************************/