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-01-31     shelton      first version
9  */
10 
11 #include <rtthread.h>
12 #include "at32f425.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_1);
39         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_1);
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_1);
58         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_1);
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_4);
77         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_4);
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_0);
109         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_0);
110         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);
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_0);
130         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_0);
131         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_0);
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_1);
159         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_1);
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_1);
175         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_1);
176     }
177 #endif
178     /* add others */
179 }
180 #endif /* BSP_USING_HARD_I2C */
181 
182 #ifdef BSP_USING_PWM
at32_msp_tmr_init(void * instance)183 void at32_msp_tmr_init(void *instance)
184 {
185     gpio_init_type gpio_init_struct;
186     tmr_type *tmr_x = (tmr_type *)instance;
187 
188     gpio_default_para_init(&gpio_init_struct);
189     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
190     if(tmr_x == TMR1)
191     {
192         /* tmr1 clock enable */
193         crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
194         /* gpioa clock enable */
195         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
196 
197         /* gpioa configuration: tmr1 channel1 and channel4 as alternate function push-pull */
198         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
199         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
200         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
201         gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_11;
202         gpio_init(GPIOA, &gpio_init_struct);
203 
204         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_2);
205         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_2);
206     }
207 
208     if(tmr_x == TMR2)
209     {
210         /* tmr2 clock enable */
211         crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
212         /* gpioa clock enable */
213         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
214 
215         /* gpioa configuration: tmr1 channel1 and channel2 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_0 | GPIO_PINS_1;
220         gpio_init(GPIOA, &gpio_init_struct);
221 
222         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE0, GPIO_MUX_2);
223         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE1, GPIO_MUX_2);
224     }
225     /* add others */
226 }
227 #endif /* BSP_USING_PWM */
228 
229 #ifdef BSP_USING_ADC
at32_msp_adc_init(void * instance)230 void at32_msp_adc_init(void *instance)
231 {
232     gpio_init_type gpio_init_struct;
233     adc_type *adc_x = (adc_type *)instance;
234 
235     gpio_default_para_init(&gpio_init_struct);
236     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
237 #ifdef BSP_USING_ADC1
238     if(adc_x == ADC1)
239     {
240         /* adc1 & gpio clock enable */
241         crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
242         crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
243 
244         /* configure adc channel as analog input */
245         gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5;
246         gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
247         gpio_init(GPIOC, &gpio_init_struct);
248     }
249 #endif
250 }
251 #endif /* BSP_USING_ADC */
252 
253 #ifdef BSP_USING_HWTIMER
at32_msp_hwtmr_init(void * instance)254 void at32_msp_hwtmr_init(void *instance)
255 {
256     tmr_type *tmr_x = (tmr_type *)instance;
257 
258 #ifdef BSP_USING_HWTMR3
259     if(tmr_x == TMR3)
260     {
261         /* tmr3 clock enable */
262         crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
263     }
264 #endif
265 }
266 #endif
267 
268 #ifdef BSP_USING_CAN
at32_msp_can_init(void * instance)269 void at32_msp_can_init(void *instance)
270 {
271     gpio_init_type gpio_init_struct;
272     can_type *can_x = (can_type *)instance;
273 
274     gpio_default_para_init(&gpio_init_struct);
275     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
276 #ifdef BSP_USING_CAN1
277     if(CAN1 == can_x)
278     {
279         crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE);
280         crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
281 
282         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
283         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
284         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
285         gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9;
286         gpio_init(GPIOB, &gpio_init_struct);
287 
288         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE8, GPIO_MUX_4);
289         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE9, GPIO_MUX_4);
290     }
291 #endif
292 }
293 #endif /* BSP_USING_CAN */
294 
295 #ifdef BSP_USING_USBOTG
at32_msp_usb_init(void * instance)296 void at32_msp_usb_init(void *instance)
297 {
298     /* defalut usb clock from hext */
299     usb_clk48_s clk_s = USB_CLK_HEXT;
300 
301     crm_periph_clock_enable(CRM_OTGFS1_PERIPH_CLOCK, TRUE);
302 
303     if(clk_s == USB_CLK_HICK)
304     {
305         crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);
306 
307         /* enable the acc calibration ready interrupt */
308         crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);
309 
310         /* update the c1\c2\c3 value */
311         acc_write_c1(7980);
312         acc_write_c2(8000);
313         acc_write_c3(8020);
314 
315         /* open acc calibration */
316         acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);
317     }
318     else
319     {
320         switch(system_core_clock)
321         {
322             /* 48MHz */
323             case 48000000:
324                 crm_usb_clock_div_set(CRM_USB_DIV_1);
325                 break;
326 
327             /* 72MHz */
328             case 72000000:
329                 crm_usb_clock_div_set(CRM_USB_DIV_1_5);
330                 break;
331 
332             /* 96MHz */
333             case 96000000:
334                 crm_usb_clock_div_set(CRM_USB_DIV_2);
335                 break;
336 
337             default:
338                 break;
339         }
340     }
341 }
342 
343 #endif /* BSP_USING_USBOTG */
344