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-08-30     shelton      first version
9  */
10 
11 #include <rtthread.h>
12 #include "at32m412_416.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     /* add others */
62 }
63 #endif /* BSP_USING_SERIAL */
64 
65 #ifdef BSP_USING_SPI
at32_msp_spi_init(void * instance)66 void at32_msp_spi_init(void *instance)
67 {
68     gpio_init_type gpio_init_struct;
69     spi_type *spi_x = (spi_type *)instance;
70 
71     gpio_default_para_init(&gpio_init_struct);
72     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
73 #ifdef BSP_USING_SPI1
74     if(SPI1 == spi_x)
75     {
76         crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
77         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
78 
79         gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
80         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
81         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
82         gpio_init_struct.gpio_pins = GPIO_PINS_4;
83         gpio_init(GPIOA, &gpio_init_struct);
84 
85         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
86         gpio_init_struct.gpio_pins = GPIO_PINS_5 | GPIO_PINS_6 | GPIO_PINS_7;
87         gpio_init(GPIOA, &gpio_init_struct);
88 
89         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_5);
90         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_5);
91         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_5);
92     }
93 #endif
94 #ifdef BSP_USING_SPI2
95     if(SPI2 == spi_x)
96     {
97         crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
98         crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
99 
100         gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
101         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
102         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
103         gpio_init_struct.gpio_pins = GPIO_PINS_12;
104         gpio_init(GPIOB, &gpio_init_struct);
105 
106         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
107         gpio_init_struct.gpio_pins = GPIO_PINS_13 | GPIO_PINS_14 | GPIO_PINS_15;
108         gpio_init(GPIOB, &gpio_init_struct);
109 
110         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_5);
111         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_5);
112         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_5);
113     }
114 #endif
115     /* add others */
116 }
117 #endif /* BSP_USING_SPI */
118 
119 #ifdef BSP_USING_HARD_I2C
at32_msp_i2c_init(void * instance)120 void at32_msp_i2c_init(void *instance)
121 {
122     gpio_init_type gpio_init_struct;
123     i2c_type *i2c_x = (i2c_type *)instance;
124 
125     gpio_default_para_init(&gpio_init_struct);
126     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
127 #ifdef BSP_USING_HARD_I2C1
128     if(I2C1 == i2c_x)
129     {
130         crm_periph_clock_enable(CRM_I2C1_PERIPH_CLOCK, TRUE);
131         crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
132 
133         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
134         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
135         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
136         gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7;
137         gpio_init(GPIOB, &gpio_init_struct);
138 
139         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_4);
140         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_4);
141     }
142 #endif
143 #ifdef BSP_USING_HARD_I2C2
144     if(I2C2 == i2c_x)
145     {
146         crm_periph_clock_enable(CRM_I2C2_PERIPH_CLOCK, TRUE);
147         crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
148 
149         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
150         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
151         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
152         gpio_init_struct.gpio_pins = GPIO_PINS_10 | GPIO_PINS_11;
153         gpio_init(GPIOB, &gpio_init_struct);
154 
155         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE10, GPIO_MUX_4);
156         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_4);
157     }
158 #endif
159     /* add others */
160 }
161 #endif /* BSP_USING_HARD_I2C */
162 
163 #ifdef BSP_USING_PWM
at32_msp_tmr_init(void * instance)164 void at32_msp_tmr_init(void *instance)
165 {
166     gpio_init_type gpio_init_struct;
167     tmr_type *tmr_x = (tmr_type *)instance;
168 
169     gpio_default_para_init(&gpio_init_struct);
170     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
171     if(tmr_x == TMR1)
172     {
173         crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
174         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
175 
176         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
177         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
178         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
179         gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_11;
180         gpio_init(GPIOA, &gpio_init_struct);
181 
182         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_1);
183         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_1);
184     }
185     /* add others */
186 }
187 #endif /* BSP_USING_PWM */
188 
189 #ifdef BSP_USING_ADC
at32_msp_adc_init(void * instance)190 void at32_msp_adc_init(void *instance)
191 {
192     gpio_init_type gpio_init_struct;
193     adc_type *adc_x = (adc_type *)instance;
194 
195     gpio_default_para_init(&gpio_init_struct);
196     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
197 #ifdef BSP_USING_ADC1
198     if(adc_x == ADC1)
199     {
200         crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
201         crm_periph_clock_enable(CRM_GPIOF_PERIPH_CLOCK, TRUE);
202 
203         gpio_init_struct.gpio_pins = GPIO_PINS_10 | GPIO_PINS_12;
204         gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
205         gpio_init(GPIOF, &gpio_init_struct);
206     }
207 #endif
208 }
209 #endif /* BSP_USING_ADC */
210 
211 #ifdef BSP_USING_HWTIMER
at32_msp_hwtmr_init(void * instance)212 void at32_msp_hwtmr_init(void *instance)
213 {
214     tmr_type *tmr_x = (tmr_type *)instance;
215 
216 #ifdef BSP_USING_HWTMR3
217     if(tmr_x == TMR3)
218     {
219         crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
220     }
221 #endif
222 }
223 #endif
224 
225 #ifdef BSP_USING_CAN_V2
at32_msp_can_init(void * instance)226 void at32_msp_can_init(void *instance)
227 {
228     gpio_init_type gpio_init_struct;
229     can_type *can_x = (can_type *)instance;
230 
231     gpio_default_para_init(&gpio_init_struct);
232     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
233 #ifdef BSP_USING_CAN1
234     if(can_x == CAN1)
235     {
236         crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE);
237         crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
238         crm_can_clock_select(CRM_CAN1, CRM_CAN_CLOCK_SOURCE_PCLK);
239 
240         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
241         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
242         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
243         gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9;
244         gpio_init(GPIOB, &gpio_init_struct);
245 
246         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE8, GPIO_MUX_9);
247         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE9, GPIO_MUX_9);
248     }
249 #endif
250 }
251 #endif /* BSP_USING_CAN_V2 */
252 
253 #ifdef BSP_USING_DAC
at32_msp_dac_init(void * instance)254 void at32_msp_dac_init(void *instance)
255 {
256     gpio_init_type gpio_init_struct;
257     dac_type *dac_x = (dac_type *)instance;
258 
259     gpio_default_para_init(&gpio_init_struct);
260     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
261 #ifdef BSP_USING_DAC1
262     if(dac_x == DAC)
263     {
264         crm_periph_clock_enable(CRM_DAC_PERIPH_CLOCK, TRUE);
265         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
266 
267         gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_5;
268         gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
269         gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
270         gpio_init(GPIOA, &gpio_init_struct);
271     }
272 #endif
273 }
274 #endif /* BSP_USING_DAC */
275