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