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