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