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 "at32f421.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 /* 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_0);
90 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_0);
91 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);
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_0);
111 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_0);
112 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_0);
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_1);
140 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_1);
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_1);
156 gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_1);
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 /* tmr1 clock enable */
174 crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
175 /* gpioa clock enable */
176 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
177
178 /* gpioa configuration: tmr1 channel1 and channel4 as alternate function push-pull */
179 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
180 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
181 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
182 gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_11;
183 gpio_init(GPIOA, &gpio_init_struct);
184
185 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_2);
186 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_2);
187 }
188 /* add others */
189 }
190 #endif /* BSP_USING_PWM */
191
192 #ifdef BSP_USING_ADC
at32_msp_adc_init(void * instance)193 void at32_msp_adc_init(void *instance)
194 {
195 gpio_init_type gpio_init_struct;
196 adc_type *adc_x = (adc_type *)instance;
197
198 gpio_default_para_init(&gpio_init_struct);
199 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
200 #ifdef BSP_USING_ADC1
201 if(adc_x == ADC1)
202 {
203 /* adc1 & gpio clock enable */
204 crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
205 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
206
207 /* configure adc channel as analog input */
208 gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_4 | GPIO_PINS_5 | GPIO_PINS_6;
209 gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
210 gpio_init(GPIOA, &gpio_init_struct);
211 }
212 #endif
213 }
214 #endif /* BSP_USING_ADC */
215
216 #ifdef BSP_USING_HWTIMER
at32_msp_hwtmr_init(void * instance)217 void at32_msp_hwtmr_init(void *instance)
218 {
219 tmr_type *tmr_x = (tmr_type *)instance;
220
221 #ifdef BSP_USING_HWTMR3
222 if(tmr_x == TMR3)
223 {
224 /* tmr3 clock enable */
225 crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
226 }
227 #endif
228 }
229 #endif
230