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