gd32f30x_gpio.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. /*!
  2. \file gd32f30x_gpio.c
  3. \brief GPIO driver
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-02-10, V1.0.1, firmware for GD32F30x
  8. */
  9. #include "gd32f30x_gpio.h"
  10. #define AFIO_EXTI_SOURCE_FIELDS ((uint8_t)0x04U) /*!< select AFIO exti source registers */
  11. #define LSB_16BIT_MASK ((uint16_t)0xFFFFU) /*!< LSB 16-bit mask */
  12. #define PCF_POSITION_MASK ((uint32_t)0x000F0000U) /*!< AFIO_PCF register position mask */
  13. #define PCF_SWJCFG_MASK ((uint32_t)0xF0FFFFFFU) /*!< AFIO_PCF register SWJCFG mask */
  14. #define PCF_LOCATION1_MASK ((uint32_t)0x00200000U) /*!< AFIO_PCF register location1 mask */
  15. #define PCF_LOCATION2_MASK ((uint32_t)0x00100000U) /*!< AFIO_PCF register location2 mask */
  16. #define AFIO_PCF1_FIELDS ((uint32_t)0x80000000U) /*!< select AFIO_PCF1 register */
  17. /*!
  18. \brief reset GPIO port
  19. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  20. \param[out] none
  21. \retval none
  22. */
  23. void gpio_deinit(uint32_t gpio_periph)
  24. {
  25. switch(gpio_periph){
  26. case GPIOA:
  27. /* reset GPIOA */
  28. rcu_periph_reset_enable(RCU_GPIOARST);
  29. rcu_periph_reset_disable(RCU_GPIOARST);
  30. break;
  31. case GPIOB:
  32. /* reset GPIOB */
  33. rcu_periph_reset_enable(RCU_GPIOBRST);
  34. rcu_periph_reset_disable(RCU_GPIOBRST);
  35. break;
  36. case GPIOC:
  37. /* reset GPIOC */
  38. rcu_periph_reset_enable(RCU_GPIOCRST);
  39. rcu_periph_reset_disable(RCU_GPIOCRST);
  40. break;
  41. case GPIOD:
  42. /* reset GPIOD */
  43. rcu_periph_reset_enable(RCU_GPIODRST);
  44. rcu_periph_reset_disable(RCU_GPIODRST);
  45. break;
  46. case GPIOE:
  47. /* reset GPIOE */
  48. rcu_periph_reset_enable(RCU_GPIOERST);
  49. rcu_periph_reset_disable(RCU_GPIOERST);
  50. break;
  51. case GPIOF:
  52. /* reset GPIOF */
  53. rcu_periph_reset_enable(RCU_GPIOFRST);
  54. rcu_periph_reset_disable(RCU_GPIOFRST);
  55. break;
  56. case GPIOG:
  57. /* reset GPIOG */
  58. rcu_periph_reset_enable(RCU_GPIOGRST);
  59. rcu_periph_reset_disable(RCU_GPIOGRST);
  60. break;
  61. default:
  62. break;
  63. }
  64. }
  65. /*!
  66. \brief reset alternate function I/O(AFIO)
  67. \param[in] none
  68. \param[out] none
  69. \retval none
  70. */
  71. void gpio_afio_deinit(void)
  72. {
  73. rcu_periph_reset_enable(RCU_AFRST);
  74. rcu_periph_reset_disable(RCU_AFRST);
  75. }
  76. /*!
  77. \brief GPIO parameter initialization
  78. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  79. \param[in] mode: gpio pin mode
  80. \arg GPIO_MODE_AIN: analog input mode
  81. \arg GPIO_MODE_IN_FLOATING: floating input mode
  82. \arg GPIO_MODE_IPD: pull-down input mode
  83. \arg GPIO_MODE_IPU: pull-up input mode
  84. \arg GPIO_MODE_OUT_OD: GPIO output with open-drain
  85. \arg GPIO_MODE_OUT_PP: GPIO output with push-pull
  86. \arg GPIO_MODE_AF_OD: AFIO output with open-drain
  87. \arg GPIO_MODE_AF_PP: AFIO output with push-pull
  88. \param[in] speed: gpio output max speed value
  89. \arg GPIO_OSPEED_10MHZ: output max speed 10MHz
  90. \arg GPIO_OSPEED_2MHZ: output max speed 2MHz
  91. \arg GPIO_OSPEED_50MHZ: output max speed 50MHz
  92. \arg GPIO_OSPEED_MAX: output max speed more than 50MHz
  93. \param[in] pin: GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
  94. \param[out] none
  95. \retval none
  96. */
  97. void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin)
  98. {
  99. uint16_t i;
  100. uint32_t temp_mode = 0U;
  101. uint32_t reg = 0U;
  102. /* GPIO mode configuration */
  103. temp_mode = (uint32_t)(mode & ((uint32_t)0x0FU));
  104. /* GPIO speed configuration */
  105. if(((uint32_t)0x00U) != ((uint32_t)mode & ((uint32_t)0x10U))){
  106. /* output mode max speed */
  107. if(GPIO_OSPEED_MAX == (uint32_t)speed){
  108. temp_mode |= (uint32_t)0x03U;
  109. /* set the corresponding SPD bit */
  110. GPIOx_SPD(gpio_periph) |= (uint32_t)pin ;
  111. }else{
  112. /* output mode max speed:10MHz,2MHz,50MHz */
  113. temp_mode |= (uint32_t)speed;
  114. }
  115. }
  116. /* configure the eight low port pins with GPIO_CTL0 */
  117. for(i = 0U;i < 8U;i++){
  118. if((1U << i) & pin){
  119. reg = GPIO_CTL0(gpio_periph);
  120. /* clear the specified pin mode bits */
  121. reg &= ~GPIO_MODE_MASK(i);
  122. /* set the specified pin mode bits */
  123. reg |= GPIO_MODE_SET(i, temp_mode);
  124. /* set IPD or IPU */
  125. if(GPIO_MODE_IPD == mode){
  126. /* reset the corresponding OCTL bit */
  127. GPIO_BC(gpio_periph) = (uint32_t)pin;
  128. }else{
  129. /* set the corresponding OCTL bit */
  130. if(GPIO_MODE_IPU == mode){
  131. GPIO_BOP(gpio_periph) = (uint32_t)pin;
  132. }
  133. }
  134. /* set GPIO_CTL0 register */
  135. GPIO_CTL0(gpio_periph) = reg;
  136. }
  137. }
  138. /* configure the eight high port pins with GPIO_CTL1 */
  139. for(i = 8U;i < 16U;i++){
  140. if((1U << i) & pin){
  141. reg = GPIO_CTL1(gpio_periph);
  142. /* clear the specified pin mode bits */
  143. reg &= ~GPIO_MODE_MASK(i - 8U);
  144. /* set the specified pin mode bits */
  145. reg |= GPIO_MODE_SET(i - 8U, temp_mode);
  146. /* set IPD or IPU */
  147. if(GPIO_MODE_IPD == mode){
  148. /* reset the corresponding OCTL bit */
  149. GPIO_BC(gpio_periph) = (uint32_t)pin;
  150. }else{
  151. /* set the corresponding OCTL bit */
  152. if(GPIO_MODE_IPU == mode){
  153. GPIO_BOP(gpio_periph) = (uint32_t)pin;
  154. }
  155. }
  156. /* set GPIO_CTL1 register */
  157. GPIO_CTL1(gpio_periph) = reg;
  158. }
  159. }
  160. }
  161. /*!
  162. \brief set GPIO pin
  163. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  164. \param[in] pin: GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
  165. \param[out] none
  166. \retval none
  167. */
  168. void gpio_bit_set(uint32_t gpio_periph,uint32_t pin)
  169. {
  170. GPIO_BOP(gpio_periph) = (uint32_t)pin;
  171. }
  172. /*!
  173. \brief reset GPIO pin
  174. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  175. \param[in] pin: GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
  176. \param[out] none
  177. \retval none
  178. */
  179. void gpio_bit_reset(uint32_t gpio_periph,uint32_t pin)
  180. {
  181. GPIO_BC(gpio_periph) = (uint32_t)pin;
  182. }
  183. /*!
  184. \brief write data to the specified GPIO pin
  185. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  186. \param[in] pin: GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
  187. \param[in] bit_value: SET or RESET
  188. \arg RESET: clear the port pin
  189. \arg SET: set the port pin
  190. \param[out] none
  191. \retval none
  192. */
  193. void gpio_bit_write(uint32_t gpio_periph,uint32_t pin,bit_status bit_value)
  194. {
  195. if(RESET != bit_value){
  196. GPIO_BOP(gpio_periph) = (uint32_t)pin;
  197. }else{
  198. GPIO_BC(gpio_periph) = (uint32_t)pin;
  199. }
  200. }
  201. /*!
  202. \brief write data to the specified GPIO port
  203. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  204. \param[in] data: specify the value to be written to the port output data register
  205. \param[out] none
  206. \retval none
  207. */
  208. void gpio_port_write(uint32_t gpio_periph,uint16_t data)
  209. {
  210. GPIO_OCTL(gpio_periph) = (uint32_t)data;
  211. }
  212. /*!
  213. \brief get GPIO pin input status
  214. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  215. \param[in] pin: GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
  216. \param[out] none
  217. \retval input status of gpio pin: SET or RESET
  218. */
  219. FlagStatus gpio_input_bit_get(uint32_t gpio_periph,uint32_t pin)
  220. {
  221. if((uint32_t)RESET != (GPIO_ISTAT(gpio_periph)&(pin))){
  222. return SET;
  223. }else{
  224. return RESET;
  225. }
  226. }
  227. /*!
  228. \brief get GPIO port input status
  229. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  230. \param[out] none
  231. \retval input status of gpio all pins
  232. */
  233. uint16_t gpio_input_port_get(uint32_t gpio_periph)
  234. {
  235. return (uint16_t)(GPIO_ISTAT(gpio_periph));
  236. }
  237. /*!
  238. \brief get GPIO pin output status
  239. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  240. \param[in] pin: GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
  241. \param[out] none
  242. \retval output status of gpio pin: SET or RESET
  243. */
  244. FlagStatus gpio_output_bit_get(uint32_t gpio_periph,uint32_t pin)
  245. {
  246. if((uint32_t)RESET !=(GPIO_OCTL(gpio_periph)&(pin))){
  247. return SET;
  248. }else{
  249. return RESET;
  250. }
  251. }
  252. /*!
  253. \brief get GPIO port output status
  254. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  255. \param[out] none
  256. \retval output status of gpio all pins
  257. */
  258. uint16_t gpio_output_port_get(uint32_t gpio_periph)
  259. {
  260. return ((uint16_t)GPIO_OCTL(gpio_periph));
  261. }
  262. /*!
  263. \brief lock GPIO pin
  264. \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G)
  265. \param[in] pin: GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
  266. \param[out] none
  267. \retval none
  268. */
  269. void gpio_pin_lock(uint32_t gpio_periph,uint32_t pin)
  270. {
  271. uint32_t lock = 0x00010000U;
  272. lock |= pin;
  273. /* lock key writing sequence: write 1 -> write 0 -> write 1 -> read 0 -> read 1 */
  274. GPIO_LOCK(gpio_periph) = (uint32_t)lock;
  275. GPIO_LOCK(gpio_periph) = (uint32_t)pin;
  276. GPIO_LOCK(gpio_periph) = (uint32_t)lock;
  277. lock = GPIO_LOCK(gpio_periph);
  278. lock = GPIO_LOCK(gpio_periph);
  279. }
  280. /*!
  281. \brief configure GPIO pin event output
  282. \param[in] output_port: gpio event output port
  283. \arg GPIO_EVENT_PORT_GPIOA: event output port A
  284. \arg GPIO_EVENT_PORT_GPIOB: event output port B
  285. \arg GPIO_EVENT_PORT_GPIOC: event output port C
  286. \arg GPIO_EVENT_PORT_GPIOD: event output port D
  287. \arg GPIO_EVENT_PORT_GPIOE: event output port E
  288. \param[in] output_pin: GPIO_EVENT_PIN_x(x=0..15)
  289. \param[out] none
  290. \retval none
  291. */
  292. void gpio_event_output_config(uint8_t output_port, uint8_t output_pin)
  293. {
  294. uint32_t reg = 0U;
  295. reg = AFIO_EC;
  296. /* clear AFIO_EC_PORT and AFIO_EC_PIN bits */
  297. reg &= (uint32_t)(~(AFIO_EC_PORT|AFIO_EC_PIN));
  298. reg |= (uint32_t)((uint32_t)output_port << 0x04U);
  299. reg |= (uint32_t)output_pin;
  300. AFIO_EC = reg;
  301. }
  302. /*!
  303. \brief enable GPIO pin event output
  304. \param[in] none
  305. \param[out] none
  306. \retval none
  307. */
  308. void gpio_event_output_enable(void)
  309. {
  310. AFIO_EC |= AFIO_EC_EOE;
  311. }
  312. /*!
  313. \brief disable GPIO pin event output
  314. \param[in] none
  315. \param[out] none
  316. \retval none
  317. */
  318. void gpio_event_output_disable(void)
  319. {
  320. AFIO_EC &= (uint32_t)(~AFIO_EC_EOE);
  321. }
  322. /*!
  323. \brief select GPIO pin exti sources
  324. \param[in] output_port: gpio event output port
  325. \arg GPIO_PORT_SOURCE_GPIOA: output port source A
  326. \arg GPIO_PORT_SOURCE_GPIOB: output port source B
  327. \arg GPIO_PORT_SOURCE_GPIOC: output port source C
  328. \arg GPIO_PORT_SOURCE_GPIOD: output port source D
  329. \arg GPIO_PORT_SOURCE_GPIOE: output port source E
  330. \arg GPIO_PORT_SOURCE_GPIOF: output port source F
  331. \arg GPIO_PORT_SOURCE_GPIOG: output port source G
  332. \param[in] output_pin: GPIO_PIN_SOURCE_x(x=0..15)
  333. \param[out] none
  334. \retval none
  335. */
  336. void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin)
  337. {
  338. uint32_t source = 0U;
  339. source = ((uint32_t)0x0FU) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & (uint8_t)0x03U));
  340. /* select EXTI sources */
  341. if(GPIO_PIN_SOURCE_4 > output_pin){
  342. /* select EXTI0/EXTI1/EXTI2/EXTI3 */
  343. AFIO_EXTISS0 &= ~source;
  344. AFIO_EXTISS0 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & (uint8_t)0x03U)));
  345. }else if(GPIO_PIN_SOURCE_8 > output_pin){
  346. /* select EXTI4/EXTI5/EXTI6/EXTI7 */
  347. AFIO_EXTISS1 &= ~source;
  348. AFIO_EXTISS1 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & (uint8_t)0x03U)));
  349. }else if(GPIO_PIN_SOURCE_12 > output_pin){
  350. /* select EXTI8/EXTI9/EXTI10/EXTI11 */
  351. AFIO_EXTISS2 &= ~source;
  352. AFIO_EXTISS2 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & (uint8_t)0x03U)));
  353. }else{
  354. /* select EXTI12/EXTI13/EXTI14/EXTI15 */
  355. AFIO_EXTISS3 &= ~source;
  356. AFIO_EXTISS3 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & (uint8_t)0x03U)));
  357. }
  358. }
  359. #ifdef GD32F30X_CL
  360. /*!
  361. \brief select ethernet MII or RMII PHY
  362. \param[in] enet_sel: ethernet MII or RMII PHY selection
  363. \arg GPIO_ENET_PHY_MII: configure ethernet MAC for connection with an MII PHY
  364. \arg GPIO_ENET_PHY_RMII: configure ethernet MAC for connection with an RMII PHY
  365. \param[out] none
  366. \retval none
  367. */
  368. void gpio_ethernet_phy_select(uint32_t enet_sel)
  369. {
  370. /* clear AFIO_PCF0_ENET_PHY_SEL bit */
  371. AFIO_PCF0 &= (uint32_t)(~AFIO_PCF0_ENET_PHY_SEL);
  372. /* select MII or RMII PHY */
  373. AFIO_PCF0 |= (uint32_t)enet_sel;
  374. }
  375. #endif /* GD32F30X_CL */
  376. /*!
  377. \brief configure GPIO pin remap
  378. \param[in] gpio_remap: select the pin to remap
  379. \arg GPIO_SPI0_REMAP: SPI0 remapping
  380. \arg GPIO_I2C0_REMAP: I2C0 remapping
  381. \arg GPIO_USART0_REMAP: USART0 remapping
  382. \arg GPIO_USART1_REMAP: USART1 remapping
  383. \arg GPIO_USART2_PARTIAL_REMAP: USART2 partial remapping
  384. \arg GPIO_USART2_FULL_REMAP: USART2 full remapping
  385. \arg GPIO_TIMER0_PARTIAL_REMAP: TIMER0 partial remapping
  386. \arg GPIO_TIMER0_FULL_REMAP: TIMER0 full remapping
  387. \arg GPIO_TIMER1_PARTIAL_REMAP1: TIMER1 partial remapping
  388. \arg GPIO_TIMER1_PARTIAL_REMAP2: TIMER1 partial remapping
  389. \arg GPIO_TIMER1_FULL_REMAP: TIMER1 full remapping
  390. \arg GPIO_TIMER2_PARTIAL_REMAP: TIMER2 partial remapping
  391. \arg GPIO_TIMER2_FULL_REMAP: TIMER2 full remapping
  392. \arg GPIO_TIMER3_REMAP: TIMER3 remapping
  393. \arg GPIO_CAN_PARTIAL_REMAP: CAN partial remapping(only for GD32F30X_HD devices and GD32F30X_XD devices)
  394. \arg GPIO_CAN_FULL_REMAP: CAN full remapping(only for GD32F30X_HD devices and GD32F30X_XD devices)
  395. \arg GPIO_CAN0_PARTIAL_REMAP: CAN0 partial remapping(only for GD32F30X_CL devices)
  396. \arg GPIO_CAN0_FULL_REMAP: CAN0 full remapping(only for GD32F30X_CL devices)
  397. \arg GPIO_PD01_REMAP: PD01 remapping
  398. \arg GPIO_TIMER4CH3_IREMAP: TIMER4 channel3 internal remapping(only for GD32F30X_CL devices and GD32F30X_HD devices)
  399. \arg GPIO_ADC0_ETRGINS_REMAP: ADC0 external trigger inserted conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices)
  400. \arg GPIO_ADC0_ETRGREG_REMAP: ADC0 external trigger regular conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices)
  401. \arg GPIO_ADC1_ETRGINS_REMAP: ADC1 external trigger inserted conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices)
  402. \arg GPIO_ADC1_ETRGREG_REMAP: ADC1 external trigger regular conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices)
  403. \arg GPIO_ENET_REMAP: ENET remapping(only for GD32F30X_CL devices)
  404. \arg GPIO_CAN1_REMAP: CAN1 remapping(only for GD32F30X_CL devices)
  405. \arg GPIO_SWJ_NONJTRST_REMAP: full SWJ(JTAG-DP + SW-DP),but without NJTRST
  406. \arg GPIO_SWJ_SWDPENABLE_REMAP: JTAG-DP disabled and SW-DP enabled
  407. \arg GPIO_SWJ_DISABLE_REMAP: JTAG-DP disabled and SW-DP disabled
  408. \arg GPIO_SPI2_REMAP: SPI2 remapping(only for GD32F30X_CL devices)
  409. \arg GPIO_TIMER1ITR0_REMAP: TIMER1 internal trigger 0 remapping(only for GD32F30X_CL devices)
  410. \arg GPIO_PTP_PPS_REMAP: ethernet PTP PPS remapping(only for GD32F30X_CL devices)
  411. \arg GPIO_TIMER8_REMAP: TIMER8 remapping
  412. \arg GPIO_TIMER9_REMAP: TIMER9 remapping
  413. \arg GPIO_TIMER10_REMAP: TIMER10 remapping
  414. \arg GPIO_TIMER12_REMAP: TIMER12 remapping
  415. \arg GPIO_TIMER13_REMAP: TIMER13 remapping
  416. \arg GPIO_EXMC_NADV_REMAP: EXMC_NADV connect/disconnect
  417. \arg GPIO_CTC_REMAP0: CTC remapping(PD15)
  418. \arg GPIO_CTC_REMAP1: CTC remapping(PF0)
  419. \param[in] newvalue: ENABLE or DISABLE
  420. \param[out] none
  421. \retval none
  422. */
  423. void gpio_pin_remap_config(uint32_t gpio_remap, ControlStatus newvalue)
  424. {
  425. uint32_t remap1 = 0U, remap2 = 0U, temp_reg = 0U, temp_mask = 0U;
  426. if(((uint32_t)0x80000000U) == (gpio_remap & 0x80000000U)){
  427. /* get AFIO_PCF1 regiter value */
  428. temp_reg = AFIO_PCF1;
  429. }else{
  430. /* get AFIO_PCF0 regiter value */
  431. temp_reg = AFIO_PCF0;
  432. }
  433. temp_mask = (gpio_remap & PCF_POSITION_MASK) >> 0x10U;
  434. remap1 = gpio_remap & LSB_16BIT_MASK;
  435. /* judge pin remap type */
  436. if((PCF_LOCATION1_MASK | PCF_LOCATION2_MASK) == (gpio_remap & (PCF_LOCATION1_MASK | PCF_LOCATION2_MASK))){
  437. temp_reg &= PCF_SWJCFG_MASK;
  438. AFIO_PCF0 &= PCF_SWJCFG_MASK;
  439. }else if(PCF_LOCATION2_MASK == (gpio_remap & PCF_LOCATION2_MASK)){
  440. remap2 = ((uint32_t)0x03U) << temp_mask;
  441. temp_reg &= ~remap2;
  442. temp_reg |= ~PCF_SWJCFG_MASK;
  443. }else{
  444. temp_reg &= ~(remap1 << ((gpio_remap >> 0x15U)*0x10U));
  445. temp_reg |= ~PCF_SWJCFG_MASK;
  446. }
  447. /* set pin remap value */
  448. if(DISABLE != newvalue){
  449. temp_reg |= (remap1 << ((gpio_remap >> 0x15U)*0x10U));
  450. }
  451. if(AFIO_PCF1_FIELDS == (gpio_remap & AFIO_PCF1_FIELDS)){
  452. /* set AFIO_PCF1 regiter value */
  453. AFIO_PCF1 = temp_reg;
  454. }else{
  455. /* set AFIO_PCF0 regiter value */
  456. AFIO_PCF0 = temp_reg;
  457. }
  458. }
  459. /*!
  460. \brief configure the I/O compensation cell
  461. \param[in] compensation: specifies the I/O compensation cell mode
  462. \arg GPIO_COMPENSATION_ENABLE: I/O compensation cell is enabled
  463. \arg GPIO_COMPENSATION_DISABLE: I/O compensation cell is disabled
  464. \param[out] none
  465. \retval none
  466. */
  467. void gpio_compensation_config(uint32_t compensation)
  468. {
  469. uint32_t reg;
  470. reg = AFIO_CPSCTL;
  471. /* reset the AFIO_CPSCTL_CPS_EN bit and set according to gpio_compensation */
  472. reg &= ~AFIO_CPSCTL_CPS_EN;
  473. AFIO_CPSCTL = (reg | compensation);
  474. }
  475. /*!
  476. \brief check the I/O compensation cell is ready or not
  477. \param[in] none
  478. \param[out] none
  479. \retval FlagStatus: SET or RESET
  480. */
  481. FlagStatus gpio_compensation_flag_get(void)
  482. {
  483. if(((uint32_t)RESET) != (AFIO_CPSCTL & AFIO_CPSCTL_CPS_RDY)){
  484. return SET;
  485. }else{
  486. return RESET;
  487. }
  488. }