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