lib_gpio.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. /**
  2. ******************************************************************************
  3. * @file lib_gpio.c
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  7. * @brief GPIO library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_gpio.h"
  14. /**
  15. * @brief Initializes GPIO.
  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_Type *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. /* Configure ATT */
  37. if (InitStruct->GPIO_Mode & 0x2U)
  38. {
  39. tmp_reg1 = GPIOx->ATT;
  40. tmp_reg1 &= ~InitStruct->GPIO_Pin;
  41. if (InitStruct->GPIO_Mode & 0x1U)
  42. {
  43. tmp_reg1 |= InitStruct->GPIO_Pin;
  44. }
  45. GPIOx->ATT = tmp_reg1;
  46. }
  47. /* Configure output/input mode */
  48. tmp_reg1 = GPIOx->OEN;
  49. tmp_reg1 &= ~InitStruct->GPIO_Pin;
  50. tmp_reg2 = GPIOx->IE;
  51. tmp_reg2 &= ~InitStruct->GPIO_Pin;
  52. if (InitStruct->GPIO_Mode & 0x8U)
  53. {
  54. tmp_reg2 |= InitStruct->GPIO_Pin;
  55. }
  56. if (InitStruct->GPIO_Mode & 0x4U)
  57. {
  58. tmp_reg1 |= InitStruct->GPIO_Pin;
  59. }
  60. GPIOx->OEN = tmp_reg1;
  61. GPIOx->IE = tmp_reg2;
  62. }
  63. /**
  64. * @brief Initializes GPIOA.
  65. * @param GPIOx: GPIOA
  66. InitStruct:GPIO configuration.
  67. GPIO_Pin: can use the '|' operator
  68. GPIO_Pin_0 ~ GPIO_Pin_15 or GPIO_Pin_All
  69. GPIO_Mode:
  70. GPIO_MODE_INPUT
  71. GPIO_MODE_OUTPUT_CMOS
  72. GPIO_MODE_OUTPUT_OD
  73. GPIO_MODE_INOUT_OD
  74. GPIO_MODE_INOUT_CMOS
  75. GPIO_MODE_FORBIDDEN
  76. * @retval None
  77. */
  78. void GPIOA_Init(GPIOA_Type *GPIOx, GPIO_InitType *InitStruct)
  79. {
  80. uint32_t tmp_reg1, tmp_reg2;
  81. /* Check parameters */
  82. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  83. assert_parameters(IS_GPIO_PIN(InitStruct->GPIO_Pin));
  84. assert_parameters(IS_GPIO_MODE(InitStruct->GPIO_Mode));
  85. /* Configure ATT */
  86. if (InitStruct->GPIO_Mode & 0x2U)
  87. {
  88. tmp_reg1 = GPIOx->ATT;
  89. tmp_reg1 &= ~InitStruct->GPIO_Pin;
  90. if (InitStruct->GPIO_Mode & 0x1U)
  91. {
  92. tmp_reg1 |= InitStruct->GPIO_Pin;
  93. }
  94. GPIOx->ATT = tmp_reg1;
  95. }
  96. /* Configure output/input mode */
  97. tmp_reg1 = GPIOx->OEN;
  98. tmp_reg1 &= ~InitStruct->GPIO_Pin;
  99. tmp_reg2 = GPIOx->IE;
  100. tmp_reg2 &= ~InitStruct->GPIO_Pin;
  101. if (InitStruct->GPIO_Mode & 0x8U)
  102. {
  103. tmp_reg2 |= InitStruct->GPIO_Pin;
  104. }
  105. if (InitStruct->GPIO_Mode & 0x4U)
  106. {
  107. tmp_reg1 |= InitStruct->GPIO_Pin;
  108. }
  109. GPIOx->OEN = tmp_reg1;
  110. GPIOx->IE = tmp_reg2;
  111. }
  112. /**
  113. * @brief Reads input data register bit.
  114. * @param GPIOx: GPIOB~GPIOF
  115. GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15.
  116. * @retval input pin value.
  117. */
  118. uint8_t GPIOBToF_ReadInputDataBit(GPIO_Type *GPIOx, uint16_t GPIO_Pin)
  119. {
  120. /* Check parameters */
  121. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  122. assert_parameters(IS_GPIO_PINR(GPIO_Pin));
  123. if (GPIOx->STS & GPIO_Pin)
  124. return 1;
  125. else
  126. return 0;
  127. }
  128. /**
  129. * @brief Reads input data register bit.
  130. * @param GPIOx: GPIOA
  131. GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15.
  132. * @retval input pin value.
  133. */
  134. uint8_t GPIOA_ReadInputDataBit(GPIOA_Type *GPIOx, uint16_t GPIO_Pin)
  135. {
  136. /* Check parameters */
  137. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  138. assert_parameters(IS_GPIO_PINR(GPIO_Pin));
  139. if (GPIOx->STS & GPIO_Pin)
  140. return 1;
  141. else
  142. return 0;
  143. }
  144. /**
  145. * @brief Reads input data register.
  146. * @param GPIOx: GPIOB~GPIOF
  147. * @retval input port value.
  148. */
  149. uint16_t GPIOBToF_ReadInputData(GPIO_Type* GPIOx)
  150. {
  151. /* Check parameters */
  152. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  153. return GPIOx->STS;
  154. }
  155. /**
  156. * @brief Reads input data register.
  157. * @param GPIOx: GPIOA
  158. * @retval input port value.
  159. */
  160. uint16_t GPIOA_ReadInputData(GPIOA_Type* GPIOx)
  161. {
  162. /* Check parameters */
  163. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  164. return GPIOx->STS;
  165. }
  166. /**
  167. * @brief Reads output data register bit.
  168. * @param GPIOx: GPIOB~GPIOF
  169. GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15
  170. * @retval output pin value.
  171. */
  172. uint8_t GPIOBToF_ReadOutputDataBit(GPIO_Type* GPIOx, uint16_t GPIO_Pin)
  173. {
  174. /* Check parameters */
  175. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  176. assert_parameters(IS_GPIO_PINR(GPIO_Pin));
  177. if (GPIOx->DAT & GPIO_Pin)
  178. return 1;
  179. else
  180. return 0;
  181. }
  182. /**
  183. * @brief Reads output data register bit.
  184. * @param GPIOx: GPIOA
  185. GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15
  186. * @retval output pin value.
  187. */
  188. uint8_t GPIOA_ReadOutputDataBit(GPIOA_Type* GPIOx, uint16_t GPIO_Pin)
  189. {
  190. /* Check parameters */
  191. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  192. assert_parameters(IS_GPIO_PINR(GPIO_Pin));
  193. if (GPIOx->DAT & GPIO_Pin)
  194. return 1;
  195. else
  196. return 0;
  197. }
  198. /**
  199. * @brief Reads output data register.
  200. * @param GPIOx: GPIOB~GPIOF
  201. * @retval Output port value.
  202. */
  203. uint16_t GPIOBToF_ReadOutputData(GPIO_Type* GPIOx)
  204. {
  205. /* Check parameters */
  206. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  207. return GPIOx->DAT;
  208. }
  209. /**
  210. * @brief Reads output data register.
  211. * @param GPIOx: GPIOA
  212. * @retval Output port value.
  213. */
  214. uint16_t GPIOA_ReadOutputData(GPIOA_Type* GPIOx)
  215. {
  216. /* Check parameters */
  217. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  218. return GPIOx->DAT;
  219. }
  220. /**
  221. * @brief Writes output data register bit.
  222. * @param DATx: GPIO_A~GPIO_F
  223. PinNum: 0~15
  224. val:value write to register bit.
  225. * @retval None.
  226. */
  227. void GPIO_WriteBit(GPIO_DATInitType* DATx, uint8_t PinNum, uint8_t val)
  228. {
  229. /* Check parameters */
  230. assert_parameters(IS_GPIO_DAT(DATx));
  231. assert_parameters(IS_GPIO_PINNUM(PinNum));
  232. assert_parameters(IS_GPIO_BITVAL(val));
  233. DATx->DATBitBand[PinNum] = val;
  234. }
  235. /**
  236. * @brief Write output data register bit.
  237. * @param GPIOx: GPIOB~GPIOF
  238. GPIO_Pin: can use the ‘|’ operator
  239. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  240. val:value write to register bit.
  241. * @retval None.
  242. */
  243. void GPIOBToF_WriteBit(GPIO_Type* GPIOx, uint16_t GPIO_Pin, uint8_t val)
  244. {
  245. /* Check parameters */
  246. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  247. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  248. assert_parameters(IS_GPIO_BITVAL(val));
  249. if (val == 1)
  250. {
  251. GPIOx->DAT |= GPIO_Pin;
  252. }
  253. else
  254. {
  255. GPIOx->DAT &= ~GPIO_Pin;
  256. }
  257. }
  258. /**
  259. * @brief Write output data register bit.
  260. * @param GPIOx: GPIOA
  261. GPIO_Pin: can use the ‘|’ operator
  262. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  263. val:value write to register bit.
  264. * @retval None.
  265. */
  266. void GPIOA_WriteBit(GPIOA_Type* GPIOx, uint16_t GPIO_Pin, uint8_t val)
  267. {
  268. /* Check parameters */
  269. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  270. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  271. assert_parameters(IS_GPIO_BITVAL(val));
  272. if (val == 1)
  273. {
  274. GPIOx->DAT |= GPIO_Pin;
  275. }
  276. else
  277. {
  278. GPIOx->DAT &= ~GPIO_Pin;
  279. }
  280. }
  281. /**
  282. * @brief Writes output data register.
  283. * @param GPIOx: GPIOB~GPIOF
  284. val:value write to register.
  285. * @retval None.
  286. */
  287. void GPIOBToF_Write(GPIO_Type* GPIOx, uint16_t val)
  288. {
  289. /* Check parameters */
  290. assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
  291. GPIOx->DAT = val;
  292. }
  293. /**
  294. * @brief Writes output data register.
  295. * @param GPIOx: GPIOA
  296. val:value write to register.
  297. * @retval None.
  298. */
  299. void GPIOA_Write(GPIOA_Type* GPIOx, uint16_t val)
  300. {
  301. /* Check parameters */
  302. assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
  303. GPIOx->DAT = val;
  304. }
  305. /**
  306. * @brief Enables or disables GPIO AF functiuon.
  307. * @param GPIOx:GPIOB GPIOE
  308. GPIO_AFx:
  309. GPIOB_AF_PLLHDIV
  310. GPIOB_AF_PLLLOUT
  311. GPIOB_AF_OSC
  312. GPIOE_AF_CMP1O
  313. NewState:
  314. ENABLE
  315. DISABLE
  316. * @retval None.
  317. */
  318. void GPIOBToF_AFConfig(GPIO_Type* GPIOx, uint32_t GPIO_AFx, uint8_t NewState)
  319. {
  320. /* Check parameters */
  321. assert_parameters(IS_GPIOAF_ALL_INSTANCE(GPIOx));
  322. assert_parameters(IS_GPIO_GPIOAF(GPIO_AFx));
  323. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  324. if (GPIOx == GPIOB)
  325. {
  326. if (NewState == ENABLE)
  327. {
  328. GPIOAF->IOB_SEL |= GPIO_AFx;
  329. }
  330. else
  331. {
  332. GPIOAF->IOB_SEL &= ~GPIO_AFx;
  333. }
  334. }
  335. if (GPIOx == GPIOE)
  336. {
  337. if (NewState == ENABLE)
  338. {
  339. GPIOAF->IOE_SEL |= GPIO_AFx;
  340. }
  341. else
  342. {
  343. GPIOAF->IOE_SEL &= ~GPIO_AFx;
  344. }
  345. }
  346. }
  347. /**
  348. * @brief Enables or disables GPIOA AF function.
  349. * @param PMUIO_AFx:can use the '|' operator
  350. PMUIO7_AF_PLLDIV
  351. PMUIO6_AF_CMP2O
  352. PMUIO3_AF_PLLDIV
  353. NewState:
  354. ENABLE
  355. DISABLE
  356. * @retval None.
  357. */
  358. void GPIOA_AFConfig(uint32_t PMUIO_AFx, uint8_t NewState)
  359. {
  360. /* Check parameters */
  361. assert_parameters(IS_GPIO_PMUIOAF(PMUIO_AFx));
  362. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  363. if (NewState == ENABLE)
  364. {
  365. GPIOA->SEL |= PMUIO_AFx;
  366. }
  367. else
  368. {
  369. GPIOA->SEL &= ~PMUIO_AFx;
  370. }
  371. }
  372. /**
  373. * @brief Enables or disables GPIO pin remap function.
  374. * @param GPIO_Remap:
  375. GPIO_REMAP_I2C
  376. NewState:
  377. ENABLE
  378. DISABLE
  379. * @retval None.
  380. */
  381. void GPIO_PinRemapConfig(uint32_t GPIO_Remap, uint8_t NewState)
  382. {
  383. /* Check parameters */
  384. assert_parameters(IS_GPIO_REMAP(GPIO_Remap));
  385. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  386. if (NewState == ENABLE)
  387. {
  388. GPIOAF->IO_MISC |= GPIO_Remap;
  389. }
  390. else
  391. {
  392. GPIOAF->IO_MISC &= ~GPIO_Remap;
  393. }
  394. }
  395. /**
  396. * @brief Configures GPIO PLLDIV function.
  397. * @param Divider:
  398. GPIO_PLLDIV_1
  399. GPIO_PLLDIV_2
  400. GPIO_PLLDIV_4
  401. GPIO_PLLDIV_8
  402. GPIO_PLLDIV_16
  403. * @retval None.
  404. */
  405. void GPIO_PLLDIVConfig(uint32_t Divider)
  406. {
  407. uint32_t tmp;
  408. /* Check parameters */
  409. assert_parameters(IS_GPIO_PLLDIV(Divider));
  410. tmp = GPIOAF->IO_MISC;
  411. tmp &= ~GPIOAF_IO_MISC_PLLHDIV;
  412. tmp |= Divider;
  413. GPIOAF->IO_MISC = tmp;
  414. }
  415. /**
  416. * @brief Enables or disables GPIOA de-glitch circuit.
  417. * @param GPIO_Pin: can use the '|' operator
  418. GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
  419. NewState:
  420. ENABLE
  421. DISABLE
  422. * @retval None.
  423. */
  424. void GPIOA_DeGlitchCmd(uint16_t GPIO_Pin, uint8_t NewState)
  425. {
  426. /* Check parameters */
  427. assert_parameters(IS_GPIO_PIN(GPIO_Pin));
  428. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  429. /*IOA wake-up signal will go through de-glitch circuit.*/
  430. if (NewState == ENABLE)
  431. {
  432. GPIOA->IOANODEG &= ~GPIO_Pin;
  433. }
  434. /*IOA wake-up signal will not go through de-glitch circuit.*/
  435. else
  436. {
  437. GPIOA->IOANODEG |= GPIO_Pin;
  438. }
  439. }
  440. /*********************************** END OF FILE ******************************/