gd32f4xx_syscfg.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*!
  2. \file gd32f4xx_syscfg.c
  3. \brief SYSCFG driver
  4. */
  5. /*
  6. Copyright (C) 2016 GigaDevice
  7. 2016-08-15, V1.0.0, firmware for GD32F4xx
  8. */
  9. #include "gd32f4xx_syscfg.h"
  10. /*!
  11. \brief reset the SYSCFG registers
  12. \param[in] none
  13. \param[out] none
  14. \retval none
  15. */
  16. void syscfg_deinit(void)
  17. {
  18. rcu_periph_reset_enable(RCU_SYSCFGRST);
  19. rcu_periph_reset_disable(RCU_SYSCFGRST);
  20. }
  21. /*!
  22. \brief configure the boot mode
  23. \param[in] syscfg_bootmode: selects the memory remapping
  24. \arg SYSCFG_BOOTMODE_FLASH: main flash memory (0x08000000~0x083BFFFF) is mapped at address 0x00000000
  25. \arg SYSCFG_BOOTMODE_BOOTLOADER: boot loader (0x1FFF0000 - 0x1FFF77FF) is mapped at address 0x00000000
  26. \arg SYSCFG_BOOTMODE_EXMC_SRAM: SRAM/NOR 0 and 1 of EXMC (0x60000000~0x67FFFFFF) is mapped at address 0x00000000
  27. \arg SYSCFG_BOOTMODE_SRAM: SRAM0 of on-chip SRAM (0x20000000~0x2001BFFF) is mapped at address 0x00000000
  28. \arg SYSCFG_BOOTMODE_EXMC_SDRAM: SDRAM bank0 of EXMC (0xC0000000~0xC7FFFFFF) is mapped at address 0x00000000
  29. \param[out] none
  30. \retval none
  31. */
  32. void syscfg_bootmode_config(uint8_t syscfg_bootmode)
  33. {
  34. /* reset the SYSCFG_CFG0_BOOT_MODE bit and set according to syscfg_bootmode */
  35. SYSCFG_CFG0 &= ~SYSCFG_CFG0_BOOT_MODE;
  36. SYSCFG_CFG0 |= (uint32_t)syscfg_bootmode;
  37. }
  38. /*!
  39. \brief FMC memory mapping swap
  40. \param[in] syscfg_fmc_swap: selects the interal flash bank swapping
  41. \arg SYSCFG_FMC_SWP_BANK0: bank 0 is mapped at address 0x08000000 and bank 1 is mapped at address 0x08100000
  42. \arg SYSCFG_FMC_SWP_BANK1: bank 1 is mapped at address 0x08000000 and bank 0 is mapped at address 0x08100000
  43. \param[out] none
  44. \retval none
  45. */
  46. void syscfg_fmc_swap_config(uint32_t syscfg_fmc_swap)
  47. {
  48. uint32_t reg;
  49. reg = SYSCFG_CFG0;
  50. /* reset the FMC_SWP bit and set according to syscfg_fmc_swap */
  51. reg &= ~SYSCFG_CFG0_FMC_SWP;
  52. SYSCFG_CFG0 = (reg | syscfg_fmc_swap);
  53. }
  54. /*!
  55. \brief EXMC memory mapping swap
  56. \param[in] syscfg_exmc_swap: selects the memories in EXMC swapping
  57. \arg SYSCFG_EXMC_SWP_ENABLE: SDRAM bank 0 and bank 1 are swapped with NAND bank 1 and PC card
  58. \arg SYSCFG_EXMC_SWP_DISABLE: no memory mapping swap
  59. \param[out] none
  60. \retval none
  61. */
  62. void syscfg_exmc_swap_config(uint32_t syscfg_exmc_swap)
  63. {
  64. uint32_t reg;
  65. reg = SYSCFG_CFG0;
  66. /* reset the SYSCFG_CFG0_EXMC_SWP bits and set according to syscfg_exmc_swap */
  67. reg &= ~SYSCFG_CFG0_EXMC_SWP;
  68. SYSCFG_CFG0 = (reg | syscfg_exmc_swap);
  69. }
  70. /*!
  71. \brief configure the GPIO pin as EXTI Line
  72. \param[in] exti_port: specify the GPIO port used in EXTI
  73. \arg EXTI_SOURCE_GPIOx(x = A,B,C,D,E,F,G,H,I): EXTI GPIO port
  74. \param[in] exti_pin: specify the EXTI line
  75. \arg EXTI_SOURCE_PINx(x = 0..15): EXTI GPIO pin
  76. \param[out] none
  77. \retval none
  78. */
  79. void syscfg_exti_line_config(uint8_t exti_port, uint8_t exti_pin)
  80. {
  81. uint32_t clear_exti_mask = ~((uint32_t)EXTI_SS_MASK << (EXTI_SS_MSTEP(exti_pin)));
  82. uint32_t config_exti_mask = ((uint32_t)exti_port) << (EXTI_SS_MSTEP(exti_pin));
  83. switch(exti_pin/EXTI_SS_JSTEP){
  84. case EXTISS0:
  85. /* clear EXTI source line(0..3) */
  86. SYSCFG_EXTISS0 &= clear_exti_mask;
  87. /* configure EXTI soure line(0..3) */
  88. SYSCFG_EXTISS0 |= config_exti_mask;
  89. break;
  90. case EXTISS1:
  91. /* clear EXTI soure line(4..7) */
  92. SYSCFG_EXTISS1 &= clear_exti_mask;
  93. /* configure EXTI soure line(4..7) */
  94. SYSCFG_EXTISS1 |= config_exti_mask;
  95. break;
  96. case EXTISS2:
  97. /* clear EXTI soure line(8..11) */
  98. SYSCFG_EXTISS2 &= clear_exti_mask;
  99. /* configure EXTI soure line(8..11) */
  100. SYSCFG_EXTISS2 |= config_exti_mask;
  101. break;
  102. case EXTISS3:
  103. /* clear EXTI soure line(12..15) */
  104. SYSCFG_EXTISS3 &= clear_exti_mask;
  105. /* configure EXTI soure line(12..15) */
  106. SYSCFG_EXTISS3 |= config_exti_mask;
  107. break;
  108. default:
  109. break;
  110. }
  111. }
  112. /*!
  113. \brief configure the PHY interface for the ethernet MAC
  114. \param[in] syscfg_enet_phy_interface: specifies the media interface mode.
  115. \arg SYSCFG_ENET_PHY_MII: MII mode is selected
  116. \arg SYSCFG_ENET_PHY_RMII: RMII mode is selected
  117. \param[out] none
  118. \retval none
  119. */
  120. void syscfg_enet_phy_interface_config(uint32_t syscfg_enet_phy_interface)
  121. {
  122. uint32_t reg;
  123. reg = SYSCFG_CFG1;
  124. /* reset the ENET_PHY_SEL bit and set according to syscfg_enet_phy_interface */
  125. reg &= ~SYSCFG_CFG1_ENET_PHY_SEL;
  126. SYSCFG_CFG1 = (reg | syscfg_enet_phy_interface);
  127. }
  128. /*!
  129. \brief configure the I/O compensation cell
  130. \param[in] syscfg_compensation: specifies the I/O compensation cell mode
  131. \arg SYSCFG_COMPENSATION_ENABLE: I/O compensation cell is enabled
  132. \arg SYSCFG_COMPENSATION_DISABLE: I/O compensation cell is disabled
  133. \param[out] none
  134. \retval none
  135. */
  136. void syscfg_compensation_config(uint32_t syscfg_compensation)
  137. {
  138. uint32_t reg;
  139. reg = SYSCFG_CPSCTL;
  140. /* reset the SYSCFG_CPSCTL_CPS_EN bit and set according to syscfg_compensation */
  141. reg &= ~SYSCFG_CPSCTL_CPS_EN;
  142. SYSCFG_CPSCTL = (reg | syscfg_compensation);
  143. }
  144. /*!
  145. \brief checks whether the I/O compensation cell ready flag is set or not
  146. \param[in] none
  147. \param[out] none
  148. \retval FlagStatus: SET or RESET
  149. */
  150. FlagStatus syscfg_flag_get(void)
  151. {
  152. if(((uint32_t)RESET) != (SYSCFG_CPSCTL & SYSCFG_CPSCTL_CPS_RDY)){
  153. return SET;
  154. }else{
  155. return RESET;
  156. }
  157. }