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