1 /*
2 * Copyright (c) 2006-2018, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2023-04-08 shelton first version
9 */
10
11 #include <rtthread.h>
12 #include "at32f423.h"
13 #include "at32_msp.h"
14
15 #ifdef BSP_USING_UART
at32_msp_usart_init(void * instance)16 void at32_msp_usart_init(void *instance)
17 {
18 gpio_init_type gpio_init_struct;
19 usart_type *usart_x = (usart_type *)instance;
20
21 gpio_default_para_init(&gpio_init_struct);
22 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
23 #ifdef BSP_USING_UART1
24 if(USART1 == usart_x)
25 {
26 crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
27 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
28
29 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
30 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
31 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
32 gpio_init_struct.gpio_pins = GPIO_PINS_9;
33 gpio_init(GPIOA, &gpio_init_struct);
34
35 gpio_init_struct.gpio_pins = GPIO_PINS_10;
36 gpio_init(GPIOA, &gpio_init_struct);
37
38 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_7);
39 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_7);
40 }
41 #endif
42 #ifdef BSP_USING_UART2
43 if(USART2 == usart_x)
44 {
45 crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, TRUE);
46 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
47
48 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
49 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
50 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
51 gpio_init_struct.gpio_pins = GPIO_PINS_2;
52 gpio_init(GPIOA, &gpio_init_struct);
53
54 gpio_init_struct.gpio_pins = GPIO_PINS_3;
55 gpio_init(GPIOA, &gpio_init_struct);
56
57 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_7);
58 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_7);
59 }
60 #endif
61 #ifdef BSP_USING_UART3
62 if(USART3 == usart_x)
63 {
64 crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE);
65 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
66
67 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
68 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
69 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
70 gpio_init_struct.gpio_pins = GPIO_PINS_10;
71 gpio_init(GPIOB, &gpio_init_struct);
72
73 gpio_init_struct.gpio_pins = GPIO_PINS_11;
74 gpio_init(GPIOB, &gpio_init_struct);
75
76 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE10, GPIO_MUX_7);
77 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_7);
78 }
79 #endif
80 /* add others */
81 }
82 #endif /* BSP_USING_SERIAL */
83
84 #ifdef BSP_USING_SPI
at32_msp_spi_init(void * instance)85 void at32_msp_spi_init(void *instance)
86 {
87 gpio_init_type gpio_init_struct;
88 spi_type *spi_x = (spi_type *)instance;
89
90 gpio_default_para_init(&gpio_init_struct);
91 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
92 #ifdef BSP_USING_SPI1
93 if(SPI1 == spi_x)
94 {
95 crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
96 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
97
98 gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
99 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
100 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
101 gpio_init_struct.gpio_pins = GPIO_PINS_4;
102 gpio_init(GPIOA, &gpio_init_struct);
103
104 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
105 gpio_init_struct.gpio_pins = GPIO_PINS_5 | GPIO_PINS_6 | GPIO_PINS_7;
106 gpio_init(GPIOA, &gpio_init_struct);
107
108 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_5);
109 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_5);
110 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_5);
111 }
112 #endif
113 #ifdef BSP_USING_SPI2
114 if(SPI2 == spi_x)
115 {
116 crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
117 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
118
119 gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
120 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
121 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
122 gpio_init_struct.gpio_pins = GPIO_PINS_12;
123 gpio_init(GPIOB, &gpio_init_struct);
124
125 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
126 gpio_init_struct.gpio_pins = GPIO_PINS_13 | GPIO_PINS_14 | GPIO_PINS_15;
127 gpio_init(GPIOB, &gpio_init_struct);
128
129 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_5);
130 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_5);
131 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_5);
132 }
133 #endif
134 /* add others */
135 }
136 #endif /* BSP_USING_SPI */
137
138 #ifdef BSP_USING_HARD_I2C
at32_msp_i2c_init(void * instance)139 void at32_msp_i2c_init(void *instance)
140 {
141 gpio_init_type gpio_init_struct;
142 i2c_type *i2c_x = (i2c_type *)instance;
143
144 gpio_default_para_init(&gpio_init_struct);
145 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
146 #ifdef BSP_USING_HARD_I2C1
147 if(I2C1 == i2c_x)
148 {
149 crm_periph_clock_enable(CRM_I2C1_PERIPH_CLOCK, TRUE);
150 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
151
152 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
153 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
154 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
155 gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7;
156 gpio_init(GPIOB, &gpio_init_struct);
157
158 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_4);
159 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_4);
160 }
161 #endif
162 #ifdef BSP_USING_HARD_I2C2
163 if(I2C2 == i2c_x)
164 {
165 crm_periph_clock_enable(CRM_I2C2_PERIPH_CLOCK, TRUE);
166 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
167
168 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
169 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
170 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
171 gpio_init_struct.gpio_pins = GPIO_PINS_10 | GPIO_PINS_11;
172 gpio_init(GPIOB, &gpio_init_struct);
173
174 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE10, GPIO_MUX_4);
175 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_4);
176 }
177 #endif
178 #ifdef BSP_USING_HARD_I2C3
179 if(I2C3 == i2c_x)
180 {
181 crm_periph_clock_enable(CRM_I2C3_PERIPH_CLOCK, TRUE);
182 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
183 crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
184
185 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
186 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
187 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
188 gpio_init_struct.gpio_pins = GPIO_PINS_8;
189 gpio_init(GPIOA, &gpio_init_struct);
190 gpio_init_struct.gpio_pins = GPIO_PINS_9;
191 gpio_init(GPIOC, &gpio_init_struct);
192
193 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_4);
194 gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE9, GPIO_MUX_4);
195 }
196 #endif
197 /* add others */
198 }
199 #endif /* BSP_USING_HARD_I2C */
200
201 #ifdef BSP_USING_PWM
at32_msp_tmr_init(void * instance)202 void at32_msp_tmr_init(void *instance)
203 {
204 gpio_init_type gpio_init_struct;
205 tmr_type *tmr_x = (tmr_type *)instance;
206
207 gpio_default_para_init(&gpio_init_struct);
208 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
209 if(tmr_x == TMR1)
210 {
211 /* tmr1 clock enable */
212 crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
213 /* gpioa clock enable */
214 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
215
216 /* gpioa configuration: tmr1 channel1 and channel4 as alternate function push-pull */
217 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
218 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
219 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
220 gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_11;
221 gpio_init(GPIOA, &gpio_init_struct);
222
223 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_1);
224 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_1);
225 }
226
227 if(tmr_x == TMR2)
228 {
229 /* tmr2 clock enable */
230 crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
231 /* gpioa clock enable */
232 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
233
234 /* gpioa configuration: tmr1 channel1 and channel2 as alternate function push-pull */
235 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
236 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
237 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
238 gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;
239 gpio_init(GPIOA, &gpio_init_struct);
240
241 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE0, GPIO_MUX_1);
242 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE1, GPIO_MUX_1);
243 }
244 /* add others */
245 }
246 #endif /* BSP_USING_PWM */
247
248 #ifdef BSP_USING_ADC
at32_msp_adc_init(void * instance)249 void at32_msp_adc_init(void *instance)
250 {
251 gpio_init_type gpio_init_struct;
252 adc_type *adc_x = (adc_type *)instance;
253
254 gpio_default_para_init(&gpio_init_struct);
255 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
256 #ifdef BSP_USING_ADC1
257 if(adc_x == ADC1)
258 {
259 /* adc1 & gpio clock enable */
260 crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
261 crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
262
263 /* configure adc channel as analog input */
264 gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5;
265 gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
266 gpio_init(GPIOC, &gpio_init_struct);
267 }
268 #endif
269 }
270 #endif /* BSP_USING_ADC */
271
272 #ifdef BSP_USING_HWTIMER
at32_msp_hwtmr_init(void * instance)273 void at32_msp_hwtmr_init(void *instance)
274 {
275 tmr_type *tmr_x = (tmr_type *)instance;
276
277 #ifdef BSP_USING_HWTMR3
278 if(tmr_x == TMR3)
279 {
280 /* tmr3 clock enable */
281 crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
282 }
283 #endif
284 }
285 #endif
286
287 #ifdef BSP_USING_CAN
at32_msp_can_init(void * instance)288 void at32_msp_can_init(void *instance)
289 {
290 gpio_init_type gpio_init_struct;
291 can_type *can_x = (can_type *)instance;
292
293 gpio_default_para_init(&gpio_init_struct);
294 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
295 #ifdef BSP_USING_CAN1
296 if(can_x == CAN1)
297 {
298 crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE);
299 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
300
301 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
302 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
303 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
304 gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9;
305 gpio_init(GPIOB, &gpio_init_struct);
306
307 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE8, GPIO_MUX_9);
308 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE9, GPIO_MUX_9);
309 }
310 #endif
311 #ifdef BSP_USING_CAN2
312 if(can_x == CAN2)
313 {
314 crm_periph_clock_enable(CRM_CAN2_PERIPH_CLOCK, TRUE);
315 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
316
317 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
318 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
319 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
320 gpio_init_struct.gpio_pins = GPIO_PINS_5 | GPIO_PINS_6;
321 gpio_init(GPIOB, &gpio_init_struct);
322
323 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE5, GPIO_MUX_9);
324 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_9);
325 }
326 #endif
327 }
328 #endif /* BSP_USING_CAN */
329
330 #ifdef BSP_USING_USBOTG
at32_msp_usb_init(void * instance)331 void at32_msp_usb_init(void *instance)
332 {
333 /* defalut usb clock from hext */
334 usb_clk48_s clk_s = USB_CLK_HEXT;
335
336 crm_periph_clock_enable(CRM_OTGFS1_PERIPH_CLOCK, TRUE);
337
338 if(clk_s == USB_CLK_HICK)
339 {
340 crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);
341
342 /* enable the acc calibration ready interrupt */
343 crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);
344
345 /* update the c1\c2\c3 value */
346 acc_write_c1(7980);
347 acc_write_c2(8000);
348 acc_write_c3(8020);
349
350 /* open acc calibration */
351 acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);
352 }
353 else
354 {
355 switch(system_core_clock)
356 {
357 /* 48MHz */
358 case 48000000:
359 crm_usb_clock_div_set(CRM_USB_DIV_2);
360 break;
361 /* 72MHz */
362 case 72000000:
363 crm_usb_clock_div_set(CRM_USB_DIV_3);
364 break;
365 /* 96MHz */
366 case 96000000:
367 crm_usb_clock_div_set(CRM_USB_DIV_4);
368 break;
369 /* 120MHz */
370 case 120000000:
371 crm_usb_clock_div_set(CRM_USB_DIV_5);
372 break;
373 /* 144MHz */
374 case 144000000:
375 crm_usb_clock_div_set(CRM_USB_DIV_6);
376 break;
377 default:
378 break;
379 }
380 }
381 }
382 #endif /* BSP_USING_USBOTG */
383
384 #ifdef BSP_USING_DAC
at32_msp_dac_init(void * instance)385 void at32_msp_dac_init(void *instance)
386 {
387 gpio_init_type gpio_init_struct;
388 dac_type *dac_x = (dac_type *)instance;
389
390 gpio_default_para_init(&gpio_init_struct);
391 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
392 #ifdef BSP_USING_DAC1
393 if(dac_x == DAC)
394 {
395 /* dac & gpio clock enable */
396 crm_periph_clock_enable(CRM_DAC_PERIPH_CLOCK, TRUE);
397 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
398
399 /* configure adc channel as analog output */
400 gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_5;
401 gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
402 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
403 gpio_init(GPIOA, &gpio_init_struct);
404 }
405 #endif
406 }
407 #endif /* BSP_USING_DAC */
408