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 * 2024-04-12 shelton first version
9 */
10
11 #include <rtthread.h>
12 #include "at32a423.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 #ifdef BSP_USING_HARD_I2C
at32_msp_i2c_init(void * instance)138 void at32_msp_i2c_init(void *instance)
139 {
140 gpio_init_type gpio_init_struct;
141 i2c_type *i2c_x = (i2c_type *)instance;
142
143 gpio_default_para_init(&gpio_init_struct);
144 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
145 #ifdef BSP_USING_HARD_I2C1
146 if(I2C1 == i2c_x)
147 {
148 crm_periph_clock_enable(CRM_I2C1_PERIPH_CLOCK, TRUE);
149 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
150
151 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
152 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
153 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
154 gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7;
155 gpio_init(GPIOB, &gpio_init_struct);
156
157 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_4);
158 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_4);
159 }
160 #endif
161 #ifdef BSP_USING_HARD_I2C2
162 if(I2C2 == i2c_x)
163 {
164 crm_periph_clock_enable(CRM_I2C2_PERIPH_CLOCK, TRUE);
165 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
166
167 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
168 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
169 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
170 gpio_init_struct.gpio_pins = GPIO_PINS_10 | GPIO_PINS_11;
171 gpio_init(GPIOB, &gpio_init_struct);
172
173 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE10, GPIO_MUX_4);
174 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_4);
175 }
176 #endif
177 #ifdef BSP_USING_HARD_I2C3
178 if(I2C3 == i2c_x)
179 {
180 crm_periph_clock_enable(CRM_I2C3_PERIPH_CLOCK, TRUE);
181 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
182 crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
183
184 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
185 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
186 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
187 gpio_init_struct.gpio_pins = GPIO_PINS_8;
188 gpio_init(GPIOA, &gpio_init_struct);
189 gpio_init_struct.gpio_pins = GPIO_PINS_9;
190 gpio_init(GPIOC, &gpio_init_struct);
191
192 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_4);
193 gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE9, GPIO_MUX_4);
194 }
195 #endif
196 /* add others */
197 }
198 #endif /* BSP_USING_HARD_I2C */
199
200 #ifdef BSP_USING_PWM
at32_msp_tmr_init(void * instance)201 void at32_msp_tmr_init(void *instance)
202 {
203 gpio_init_type gpio_init_struct;
204 tmr_type *tmr_x = (tmr_type *)instance;
205
206 gpio_default_para_init(&gpio_init_struct);
207 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
208 if(tmr_x == TMR1)
209 {
210 /* tmr1 clock enable */
211 crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
212 /* gpioa clock enable */
213 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
214
215 /* gpioa configuration: tmr1 channel1 and channel4 as alternate function push-pull */
216 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
217 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
218 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
219 gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_11;
220 gpio_init(GPIOA, &gpio_init_struct);
221
222 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_1);
223 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_1);
224 }
225
226 if(tmr_x == TMR2)
227 {
228 /* tmr2 clock enable */
229 crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
230 /* gpioa clock enable */
231 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
232
233 /* gpioa configuration: tmr1 channel1 and channel2 as alternate function push-pull */
234 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
235 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
236 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
237 gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;
238 gpio_init(GPIOA, &gpio_init_struct);
239
240 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE0, GPIO_MUX_1);
241 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE1, GPIO_MUX_1);
242 }
243 /* add others */
244 }
245 #endif /* BSP_USING_PWM */
246
247 #ifdef BSP_USING_ADC
at32_msp_adc_init(void * instance)248 void at32_msp_adc_init(void *instance)
249 {
250 gpio_init_type gpio_init_struct;
251 adc_type *adc_x = (adc_type *)instance;
252
253 gpio_default_para_init(&gpio_init_struct);
254 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
255 #ifdef BSP_USING_ADC1
256 if(adc_x == ADC1)
257 {
258 /* adc1 & gpio clock enable */
259 crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
260 crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
261
262 /* configure adc channel as analog input */
263 gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5;
264 gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
265 gpio_init(GPIOC, &gpio_init_struct);
266 }
267 #endif
268 }
269 #endif /* BSP_USING_ADC */
270
271 #ifdef BSP_USING_HWTIMER
at32_msp_hwtmr_init(void * instance)272 void at32_msp_hwtmr_init(void *instance)
273 {
274 tmr_type *tmr_x = (tmr_type *)instance;
275
276 #ifdef BSP_USING_HWTMR3
277 if(tmr_x == TMR3)
278 {
279 /* tmr3 clock enable */
280 crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
281 }
282 #endif
283 }
284 #endif
285
286 #ifdef BSP_USING_CAN
at32_msp_can_init(void * instance)287 void at32_msp_can_init(void *instance)
288 {
289 gpio_init_type gpio_init_struct;
290 can_type *can_x = (can_type *)instance;
291
292 gpio_default_para_init(&gpio_init_struct);
293 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
294 #ifdef BSP_USING_CAN1
295 if(can_x == CAN1)
296 {
297 crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE);
298 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
299
300 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
301 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
302 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
303 gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9;
304 gpio_init(GPIOB, &gpio_init_struct);
305
306 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE8, GPIO_MUX_9);
307 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE9, GPIO_MUX_9);
308 }
309 #endif
310 #ifdef BSP_USING_CAN2
311 if(can_x == CAN2)
312 {
313 crm_periph_clock_enable(CRM_CAN2_PERIPH_CLOCK, TRUE);
314 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
315
316 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
317 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
318 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
319 gpio_init_struct.gpio_pins = GPIO_PINS_5 | GPIO_PINS_6;
320 gpio_init(GPIOB, &gpio_init_struct);
321
322 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE5, GPIO_MUX_9);
323 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_9);
324 }
325 #endif
326 }
327 #endif /* BSP_USING_CAN */
328
329 #ifdef BSP_USING_USBOTG
at32_msp_usb_init(void * instance)330 void at32_msp_usb_init(void *instance)
331 {
332 /* defalut usb clock from hext */
333 usb_clk48_s clk_s = USB_CLK_HEXT;
334
335 crm_periph_clock_enable(CRM_OTGFS1_PERIPH_CLOCK, TRUE);
336
337 if(clk_s == USB_CLK_HICK)
338 {
339 crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);
340
341 /* enable the acc calibration ready interrupt */
342 crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);
343
344 /* update the c1\c2\c3 value */
345 acc_write_c1(7980);
346 acc_write_c2(8000);
347 acc_write_c3(8020);
348
349 /* open acc calibration */
350 acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);
351 }
352 else
353 {
354 switch(system_core_clock)
355 {
356 /* 48MHz */
357 case 48000000:
358 crm_usb_clock_div_set(CRM_USB_DIV_2);
359 break;
360 /* 72MHz */
361 case 72000000:
362 crm_usb_clock_div_set(CRM_USB_DIV_3);
363 break;
364 /* 96MHz */
365 case 96000000:
366 crm_usb_clock_div_set(CRM_USB_DIV_4);
367 break;
368 /* 120MHz */
369 case 120000000:
370 crm_usb_clock_div_set(CRM_USB_DIV_5);
371 break;
372 /* 144MHz */
373 case 144000000:
374 crm_usb_clock_div_set(CRM_USB_DIV_6);
375 break;
376 default:
377 break;
378 }
379 }
380 }
381 #endif /* BSP_USING_USBOTG */
382
383 #ifdef BSP_USING_DAC
at32_msp_dac_init(void * instance)384 void at32_msp_dac_init(void *instance)
385 {
386 gpio_init_type gpio_init_struct;
387 dac_type *dac_x = (dac_type *)instance;
388
389 gpio_default_para_init(&gpio_init_struct);
390 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
391 #ifdef BSP_USING_DAC1
392 if(dac_x == DAC)
393 {
394 /* dac & gpio clock enable */
395 crm_periph_clock_enable(CRM_DAC_PERIPH_CLOCK, TRUE);
396 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
397
398 /* configure adc channel as analog output */
399 gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_5;
400 gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
401 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
402 gpio_init(GPIOA, &gpio_init_struct);
403 }
404 #endif
405 }
406 #endif /* BSP_USING_DAC */
407