1
0

board.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-01-10 luobeihai first version
  9. */
  10. #include "board.h"
  11. void apm32_usart_init(void)
  12. {
  13. GPIO_Config_T GPIO_ConfigStruct;
  14. #ifdef BSP_USING_UART1
  15. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
  16. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
  17. GPIO_ConfigStruct.mode = GPIO_MODE_AF;
  18. GPIO_ConfigStruct.pin = GPIO_PIN_9;
  19. GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
  20. GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  21. GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  22. GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_USART1);
  23. GPIO_ConfigStruct.mode = GPIO_MODE_AF;
  24. GPIO_ConfigStruct.pin = GPIO_PIN_10;
  25. GPIO_ConfigStruct.pupd = GPIO_PUPD_UP;
  26. GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  27. GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  28. GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_USART1);
  29. #endif
  30. #ifdef BSP_USING_UART2
  31. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
  32. RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2);
  33. GPIO_ConfigStruct.mode = GPIO_MODE_AF;
  34. GPIO_ConfigStruct.pin = GPIO_PIN_2;
  35. GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
  36. GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  37. GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  38. GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_2, GPIO_AF_USART2);
  39. GPIO_ConfigStruct.mode = GPIO_MODE_AF;
  40. GPIO_ConfigStruct.pin = GPIO_PIN_3;
  41. GPIO_ConfigStruct.pupd = GPIO_PUPD_UP;
  42. GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  43. GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  44. GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_3, GPIO_AF_USART2);
  45. #endif
  46. }
  47. void apm32_msp_spi_init(void *Instance)
  48. {
  49. #ifdef BSP_USING_SPI
  50. GPIO_Config_T gpioConfig;
  51. SPI_T *spi_x = (SPI_T *)Instance;
  52. if(spi_x == SPI1)
  53. {
  54. /* Enable related Clock */
  55. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);
  56. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);
  57. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
  58. /* Config SPI1 PinAF */
  59. GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_3, GPIO_AF_SPI1);
  60. GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_4, GPIO_AF_SPI1);
  61. GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_5, GPIO_AF_SPI1);
  62. /* Config SPI GPIO, SCK=PB3, MISO=PB4, MOSI=PB5 */
  63. GPIO_ConfigStructInit(&gpioConfig);
  64. gpioConfig.pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;
  65. gpioConfig.speed = GPIO_SPEED_100MHz;
  66. gpioConfig.mode = GPIO_MODE_AF;
  67. gpioConfig.otype = GPIO_OTYPE_PP;
  68. gpioConfig.pupd = GPIO_PUPD_NOPULL;
  69. GPIO_Config(GPIOB, &gpioConfig);
  70. }
  71. #endif
  72. }
  73. void apm32_msp_timer_init(void *Instance)
  74. {
  75. #ifdef BSP_USING_PWM
  76. GPIO_Config_T gpio_config;
  77. TMR_T *tmr_x = (TMR_T *)Instance;
  78. if (tmr_x == TMR3)
  79. {
  80. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOC);
  81. RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);
  82. /* TMR3 channel 1 gpio init */
  83. GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_6, GPIO_AF_TMR3);
  84. gpio_config.pin = GPIO_PIN_6;
  85. gpio_config.mode = GPIO_MODE_AF;
  86. gpio_config.otype = GPIO_OTYPE_PP;
  87. gpio_config.speed = GPIO_SPEED_50MHz;
  88. GPIO_Config(GPIOC, &gpio_config);
  89. /* TMR3 channel 2 gpio init */
  90. GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_7, GPIO_AF_TMR3);
  91. gpio_config.pin = GPIO_PIN_7;
  92. GPIO_Config(GPIOC, &gpio_config);
  93. /* TMR3 channel 3 gpio init */
  94. GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_8, GPIO_AF_TMR3);
  95. gpio_config.pin = GPIO_PIN_8;
  96. GPIO_Config(GPIOC, &gpio_config);
  97. /* TMR3 channel 4 gpio init */
  98. GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_9, GPIO_AF_TMR3);
  99. gpio_config.pin = GPIO_PIN_9;
  100. GPIO_Config(GPIOC, &gpio_config);
  101. }
  102. #endif
  103. }
  104. /*
  105. * phy reset
  106. */
  107. void phy_reset(void)
  108. {
  109. #ifdef BSP_USING_ETH
  110. /* PHY RESET PIN: PD11 */
  111. GPIO_Config_T GPIO_ConfigStruct;
  112. GPIO_ConfigStruct.mode = GPIO_MODE_OUT;
  113. GPIO_ConfigStruct.speed = GPIO_SPEED_2MHz;
  114. GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
  115. GPIO_ConfigStruct.pupd = GPIO_PUPD_NOPULL;
  116. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOD);
  117. GPIO_ConfigStruct.pin = GPIO_PIN_11;
  118. GPIO_Config(GPIOD, &GPIO_ConfigStruct);
  119. GPIO_ResetBit(GPIOD, GPIO_PIN_11);
  120. rt_thread_delay(2);
  121. GPIO_SetBit(GPIOD, GPIO_PIN_11);
  122. rt_thread_delay(2);
  123. #endif
  124. }
  125. /*
  126. * GPIO Configuration for ETH
  127. */
  128. void apm32_msp_eth_init(void *instance)
  129. {
  130. #ifdef BSP_USING_ETH
  131. GPIO_Config_T GPIO_ConfigStruct;
  132. /* Enable SYSCFG clock */
  133. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
  134. /* Enable GPIOs clocks */
  135. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA | RCM_AHB1_PERIPH_GPIOC | RCM_AHB1_PERIPH_GPIOG);
  136. /* MII/RMII Media interface selection */
  137. SYSCFG_ConfigMediaInterface(SYSCFG_INTERFACE_RMII);
  138. /*********************** Ethernet pins configuration ***************************/
  139. /*
  140. ETH_MDIO -------------------------> PA2
  141. ETH_MDC --------------------------> PC1
  142. ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1
  143. ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7
  144. ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4
  145. ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5
  146. ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PG11
  147. ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13
  148. ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14
  149. */
  150. /* Configure PC1, PC4 and PC5 */
  151. GPIO_ConfigStruct.pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
  152. GPIO_ConfigStruct.speed = GPIO_SPEED_100MHz;
  153. GPIO_ConfigStruct.mode = GPIO_MODE_AF;
  154. GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
  155. GPIO_ConfigStruct.pupd = GPIO_PUPD_NOPULL;
  156. GPIO_Config(GPIOC, &GPIO_ConfigStruct);
  157. GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_1, GPIO_AF_ETH);
  158. GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_4, GPIO_AF_ETH);
  159. GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_5, GPIO_AF_ETH);
  160. /* Configure PG11, PG13 and PG14 */
  161. GPIO_ConfigStruct.pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
  162. GPIO_Config(GPIOG, &GPIO_ConfigStruct);
  163. GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_11, GPIO_AF_ETH);
  164. GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_13, GPIO_AF_ETH);
  165. GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_14, GPIO_AF_ETH);
  166. /* Configure PA1, PA2 and PA7 */
  167. GPIO_ConfigStruct.pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
  168. GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  169. GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_1, GPIO_AF_ETH);
  170. GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_2, GPIO_AF_ETH);
  171. GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_7, GPIO_AF_ETH);
  172. #endif
  173. }
  174. void apm32_msp_sdio_init(void *Instance)
  175. {
  176. #ifdef BSP_USING_SDIO
  177. GPIO_Config_T GPIO_InitStructure;
  178. /* Enable the GPIO Clock */
  179. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOC | RCM_AHB1_PERIPH_GPIOD);
  180. /* Enable the SDIO Clock */
  181. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SDIO);
  182. /* Enable the SDIO peripheral reset */
  183. RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_SDIO);
  184. /* Configure the GPIO pin */
  185. GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
  186. GPIO_InitStructure.mode = GPIO_MODE_AF;
  187. GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
  188. GPIO_InitStructure.otype = GPIO_OTYPE_PP;
  189. GPIO_InitStructure.pupd = GPIO_PUPD_UP;
  190. GPIO_Config(GPIOC, &GPIO_InitStructure);
  191. GPIO_InitStructure.pin = GPIO_PIN_2;
  192. GPIO_Config(GPIOD, &GPIO_InitStructure);
  193. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_8, GPIO_AF_SDIO);
  194. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_9, GPIO_AF_SDIO);
  195. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_10, GPIO_AF_SDIO);
  196. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_11, GPIO_AF_SDIO);
  197. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_12, GPIO_AF_SDIO);
  198. GPIO_ConfigPinAF(GPIOD,GPIO_PIN_SOURCE_2, GPIO_AF_SDIO);
  199. /* Disable the SDIO peripheral reset */
  200. RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_SDIO);
  201. #endif
  202. }
  203. void apm32_msp_can_init(void *Instance)
  204. {
  205. #if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2)
  206. GPIO_Config_T GPIO_InitStructure;
  207. CAN_T *CANx = (CAN_T *)Instance;
  208. if (CAN1 == CANx)
  209. {
  210. RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1);
  211. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);
  212. /* PB8: CAN1_RX, PB9: CAN1_TX */
  213. GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9;
  214. GPIO_InitStructure.mode = GPIO_MODE_AF;
  215. GPIO_InitStructure.otype = GPIO_OTYPE_PP;
  216. GPIO_InitStructure.speed = GPIO_SPEED_100MHz;
  217. GPIO_InitStructure.pupd = GPIO_PUPD_UP;
  218. GPIO_Config(GPIOB, &GPIO_InitStructure);
  219. GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_8, GPIO_AF_CAN1);
  220. GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_9, GPIO_AF_CAN1);
  221. }
  222. else if (CAN2 == CANx)
  223. {
  224. /* When using the CAN2 peripheral, the CAN1 clock must be turned on */
  225. RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1);
  226. RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2);
  227. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);
  228. /* PB12: CAN2_RX, PB13: CAN2_TX */
  229. GPIO_InitStructure.pin = GPIO_PIN_12 | GPIO_PIN_13;
  230. GPIO_InitStructure.mode = GPIO_MODE_AF;
  231. GPIO_InitStructure.otype = GPIO_OTYPE_PP;
  232. GPIO_InitStructure.speed = GPIO_SPEED_100MHz;
  233. GPIO_InitStructure.pupd = GPIO_PUPD_UP;
  234. GPIO_Config(GPIOB, &GPIO_InitStructure);
  235. GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_12, GPIO_AF_CAN2);
  236. GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_13, GPIO_AF_CAN2);
  237. }
  238. #endif
  239. }