1 /*
2 * Copyright (c) 2006-2025, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2024-04-08 QT-one first version
9 */
10
11 #include "ht32_msp.h"
12
13 /* GPIO configuration for UART */
14 #ifdef BSP_USING_UART
ht32_usart_gpio_init(void * instance)15 void ht32_usart_gpio_init(void *instance)
16 {
17 CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
18 HT_USART_TypeDef *usart_x = (HT_USART_TypeDef *)instance;
19 #ifdef BSP_USING_USART0
20 if(HT_USART0 == usart_x)
21 {
22 CKCUClock.Bit.HTCFG_USART0_TX_GPIO_CLK = 1;
23 CKCUClock.Bit.HTCFG_USART0_RX_GPIO_CLK = 1;
24 CKCU_PeripClockConfig(CKCUClock,ENABLE);
25 /* Turn on UxART Rx internal pull up resistor to prevent unknow state */
26 GPIO_PullResistorConfig(HTCFG_USART0_RX_GPIO_PORT,HTCFG_USART0_RX_GPIO_PIN,GPIO_PR_UP);
27 /* Config AFIO mode as UxART function */
28 AFIO_GPxConfig(HTCFG_USART0_TX_GPIO_ID,HTCFG_USART0_TX_GPIO_PIN,AFIO_FUN_USART_UART);
29 AFIO_GPxConfig(HTCFG_USART0_RX_GPIO_ID,HTCFG_USART0_RX_GPIO_PIN,AFIO_FUN_USART_UART);
30 }
31 #endif
32 #ifdef BSP_USING_USART1
33 if(HT_USART1 == usart_x)
34 {
35 CKCUClock.Bit.HTCFG_USART1_TX_GPIO_CLK = 1;
36 CKCUClock.Bit.HTCFG_USART1_RX_GPIO_CLK = 1;
37 CKCU_PeripClockConfig(CKCUClock,ENABLE);
38 /* Turn on UxART Rx internal pull up resistor to prevent unknow state */
39 GPIO_PullResistorConfig(HTCFG_USART1_RX_GPIO_PORT,HTCFG_USART1_RX_GPIO_PIN,GPIO_PR_UP);
40 /* Config AFIO mode as UxART function */
41 AFIO_GPxConfig(HTCFG_USART1_TX_GPIO_ID,HTCFG_USART1_TX_GPIO_PIN,AFIO_FUN_USART_UART);
42 AFIO_GPxConfig(HTCFG_USART1_RX_GPIO_ID,HTCFG_USART1_RX_GPIO_PIN,AFIO_FUN_USART_UART);
43 }
44 #endif
45 #ifdef BSP_USING_UART0
46 if(HT_UART0 == usart_x)
47 {
48 CKCUClock.Bit.HTCFG_UART0_TX_GPIO_CLK = 1;
49 CKCUClock.Bit.HTCFG_UART0_RX_GPIO_CLK = 1;
50 CKCU_PeripClockConfig(CKCUClock,ENABLE);
51 /* Turn on UxART Rx internal pull up resistor to prevent unknow state */
52 GPIO_PullResistorConfig(HTCFG_UART0_RX_GPIO_PORT,HTCFG_UART0_RX_GPIO_PIN,GPIO_PR_UP);
53 /* Config AFIO mode as UxART function */
54 AFIO_GPxConfig(HTCFG_UART0_TX_GPIO_ID,HTCFG_UART0_TX_GPIO_PIN,AFIO_FUN_USART_UART);
55 AFIO_GPxConfig(HTCFG_UART0_RX_GPIO_ID,HTCFG_UART0_RX_GPIO_PIN,AFIO_FUN_USART_UART);
56 }
57 #endif
58 #ifdef BSP_USING_UART1
59 if(HT_UART1 == usart_x)
60 {
61 CKCUClock.Bit.HTCFG_UART1_TX_GPIO_CLK = 1;
62 CKCUClock.Bit.HTCFG_UART1_RX_GPIO_CLK = 1;
63 CKCU_PeripClockConfig(CKCUClock,ENABLE);
64 /* Turn on UxART Rx internal pull up resistor to prevent unknow state */
65 GPIO_PullResistorConfig(HTCFG_UART1_RX_GPIO_PORT,HTCFG_UART1_RX_GPIO_PIN,GPIO_PR_UP);
66 /* Config AFIO mode as UxART function */
67 AFIO_GPxConfig(HTCFG_UART1_TX_GPIO_ID,HTCFG_UART1_TX_GPIO_PIN,AFIO_FUN_USART_UART);
68 AFIO_GPxConfig(HTCFG_UART1_RX_GPIO_ID,HTCFG_UART1_RX_GPIO_PIN,AFIO_FUN_USART_UART);
69 }
70 #endif
71 }
72 #endif /* BSP_USING_UART */
73
74 /* GPIO configuration for SPI */
75 #ifdef BSP_USING_SPI
ht32_spi_gpio_init(void * instance)76 void ht32_spi_gpio_init(void *instance)
77 {
78 CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
79 HT_SPI_TypeDef *spi_x = (HT_SPI_TypeDef *)instance;
80 #ifdef BSP_USING_SPI0
81 if(HT_SPI0 == spi_x)
82 {
83 CKCUClock.Bit.HTCFG_SPI0_SCK_GPIO_CLK = 1;
84 CKCUClock.Bit.HTCFG_SPI0_MISO_GPIO_CLK = 1;
85 CKCUClock.Bit.HTCFG_SPI0_MOSI_GPIO_CLK = 1;
86 CKCU_PeripClockConfig(CKCUClock,ENABLE);
87
88 AFIO_GPxConfig(HTCFG_SPI0_SCK_GPIO_ID, HTCFG_SPI0_SCK_GPIO_PIN, AFIO_FUN_SPI);
89 AFIO_GPxConfig(HTCFG_SPI0_MISO_GPIO_ID, HTCFG_SPI0_MISO_GPIO_PIN, AFIO_FUN_SPI);
90 AFIO_GPxConfig(HTCFG_SPI0_MOSI_GPIO_ID, HTCFG_SPI0_MOSI_GPIO_PIN, AFIO_FUN_SPI);
91 }
92 #endif
93 #ifdef BSP_USING_SPI1
94 if(HT_SPI1 == spi_x)
95 {
96 CKCUClock.Bit.HTCFG_SPI1_SCK_GPIO_CLK = 1;
97 CKCUClock.Bit.HTCFG_SPI1_MISO_GPIO_CLK = 1;
98 CKCUClock.Bit.HTCFG_SPI1_MOSI_GPIO_CLK = 1;
99 CKCU_PeripClockConfig(CKCUClock,ENABLE);
100
101 AFIO_GPxConfig(HTCFG_SPI1_SCK_GPIO_ID, HTCFG_SPI1_SCK_GPIO_PIN, AFIO_FUN_SPI);
102 AFIO_GPxConfig(HTCFG_SPI1_MISO_GPIO_ID, HTCFG_SPI1_MISO_GPIO_PIN, AFIO_FUN_SPI);
103 AFIO_GPxConfig(HTCFG_SPI1_MOSI_GPIO_ID, HTCFG_SPI1_MOSI_GPIO_PIN, AFIO_FUN_SPI);
104 }
105 #endif
106 }
107 #endif /* BSP_USING_SPI */
108
109 /* GPIO configuration for I2C */
110 #ifdef BSP_USING_I2C_HW
ht32_hardware_i2c_gpio_init(void * instance)111 void ht32_hardware_i2c_gpio_init(void *instance)
112 {
113 CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
114 HT_I2C_TypeDef *i2c_x = (HT_I2C_TypeDef *)instance;
115 #ifdef BSP_USING_I2C0_HW
116 if(HT_I2C0 == i2c_x)
117 {
118 CKCUClock.Bit.HTCFG_I2C0_SCL_GPIO_CLK = 1;
119 CKCUClock.Bit.HTCFG_I2C0_SDA_GPIO_CLK = 1;
120 CKCU_PeripClockConfig(CKCUClock,ENABLE);
121 /* Configure GPIO to I2C mode */
122 AFIO_GPxConfig(HTCFG_I2C0_SCL_GPIO_ID,HTCFG_I2C0_SCL_GPIO_PIN,AFIO_FUN_I2C);
123 AFIO_GPxConfig(HTCFG_I2C0_SDA_GPIO_ID,HTCFG_I2C0_SDA_GPIO_PIN,AFIO_FUN_I2C);
124 }
125 #endif
126 #ifdef BSP_USING_I2C1_HW
127 if(HT_I2C1 == i2c_x)
128 {
129 CKCUClock.Bit.HTCFG_I2C1_SCL_GPIO_CLK = 1;
130 CKCUClock.Bit.HTCFG_I2C1_SDA_GPIO_CLK = 1;
131 CKCU_PeripClockConfig(CKCUClock,ENABLE);
132 /* Configure GPIO to I2C mode */
133 AFIO_GPxConfig(HTCFG_I2C1_SCL_GPIO_ID,HTCFG_I2C1_SCL_GPIO_PIN,AFIO_FUN_I2C);
134 AFIO_GPxConfig(HTCFG_I2C1_SDA_GPIO_ID,HTCFG_I2C1_SDA_GPIO_PIN,AFIO_FUN_I2C);
135 }
136 #endif
137 }
138 #endif /* BSP_USING_I2C_HW */
139 /* GPIO configuration for ADC */
140 #ifdef BSP_USING_ADC
ht32_adc_gpio_init(void * instance,int8_t channel)141 void ht32_adc_gpio_init(void *instance,int8_t channel)
142 {
143 CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
144 HT_ADC_TypeDef *adc_x = (HT_ADC_TypeDef *)instance;
145 #ifdef BSP_USING_ADC0
146 if (HT_ADC0 == adc_x)
147 {
148 /* Enable peripheral clock */
149 CKCUClock.Bit.AFIO = 1;
150 CKCUClock.Bit.ADC0 = 1;
151 CKCU_PeripClockConfig(CKCUClock, ENABLE);
152
153 /* Configure AFIO mode as ADC function */
154 switch(channel)
155 {
156 case 0:
157 AFIO_GPxConfig(HTCFG_ADC0CH0_GPIO_ID, HTCFG_ADC0CH0_AFIO_PIN, AFIO_FUN_ADC0);
158 break;
159 case 1:
160 AFIO_GPxConfig(HTCFG_ADC0CH1_GPIO_ID, HTCFG_ADC0CH1_AFIO_PIN, AFIO_FUN_ADC0);
161 break;
162 case 2:
163 AFIO_GPxConfig(HTCFG_ADC0CH2_GPIO_ID, HTCFG_ADC0CH2_AFIO_PIN, AFIO_FUN_ADC0);
164 break;
165 case 3:
166 AFIO_GPxConfig(HTCFG_ADC0CH3_GPIO_ID, HTCFG_ADC0CH3_AFIO_PIN, AFIO_FUN_ADC0);
167 break;
168 case 4:
169 AFIO_GPxConfig(HTCFG_ADC0CH4_GPIO_ID, HTCFG_ADC0CH4_AFIO_PIN, AFIO_FUN_ADC0);
170 break;
171 case 5:
172 AFIO_GPxConfig(HTCFG_ADC0CH5_GPIO_ID, HTCFG_ADC0CH5_AFIO_PIN, AFIO_FUN_ADC0);
173 break;
174 case 6:
175 AFIO_GPxConfig(HTCFG_ADC0CH6_GPIO_ID, HTCFG_ADC0CH6_AFIO_PIN, AFIO_FUN_ADC0);
176 break;
177 case 7:
178 AFIO_GPxConfig(HTCFG_ADC0CH7_GPIO_ID, HTCFG_ADC0CH7_AFIO_PIN, AFIO_FUN_ADC0);
179 break;
180 case 8:
181 AFIO_GPxConfig(HTCFG_ADC0CH8_GPIO_ID, HTCFG_ADC0CH8_AFIO_PIN, AFIO_FUN_ADC0);
182 break;
183 case 9:
184 AFIO_GPxConfig(HTCFG_ADC0CH9_GPIO_ID, HTCFG_ADC0CH9_AFIO_PIN, AFIO_FUN_ADC0);
185 break;
186 case 10:
187 AFIO_GPxConfig(HTCFG_ADC0CH10_GPIO_ID, HTCFG_ADC0CH10_AFIO_PIN, AFIO_FUN_ADC0);
188 break;
189 case 11:
190 AFIO_GPxConfig(HTCFG_ADC0CH11_GPIO_ID, HTCFG_ADC0CH11_AFIO_PIN, AFIO_FUN_ADC0);
191 break;
192 case 12:
193 AFIO_GPxConfig(HTCFG_ADC0CH12_GPIO_ID, HTCFG_ADC0CH12_AFIO_PIN, AFIO_FUN_ADC0);
194 break;
195 case 13:
196 AFIO_GPxConfig(HTCFG_ADC0CH13_GPIO_ID, HTCFG_ADC0CH13_AFIO_PIN, AFIO_FUN_ADC0);
197 break;
198 case 14:
199 AFIO_GPxConfig(HTCFG_ADC0CH14_GPIO_ID, HTCFG_ADC0CH14_AFIO_PIN, AFIO_FUN_ADC0);
200 break;
201 case 15:
202 AFIO_GPxConfig(HTCFG_ADC0CH15_GPIO_ID, HTCFG_ADC0CH15_AFIO_PIN, AFIO_FUN_ADC0);
203 break;
204 default:
205 break;
206 }
207 }
208 #endif
209 #ifdef BSP_USING_ADC1
210 if (HT_ADC1 == adc_x)
211 {
212 /* Enable peripheral clock */
213 CKCUClock.Bit.AFIO = 1;
214 CKCUClock.Bit.ADC1 = 1;
215 CKCU_PeripClockConfig(CKCUClock, ENABLE);
216
217 /* Configure AFIO mode as ADC function */
218 switch(channel)
219 {
220 case 0:
221 AFIO_GPxConfig(HTCFG_ADC1CH0_GPIO_ID, HTCFG_ADC1CH0_AFIO_PIN, AFIO_FUN_ADC0);
222 break;
223 case 1:
224 AFIO_GPxConfig(HTCFG_ADC1CH1_GPIO_ID, HTCFG_ADC1CH1_AFIO_PIN, AFIO_FUN_ADC0);
225 break;
226 case 2:
227 AFIO_GPxConfig(HTCFG_ADC1CH2_GPIO_ID, HTCFG_ADC1CH2_AFIO_PIN, AFIO_FUN_ADC0);
228 break;
229 case 3:
230 AFIO_GPxConfig(HTCFG_ADC1CH3_GPIO_ID, HTCFG_ADC1CH3_AFIO_PIN, AFIO_FUN_ADC0);
231 break;
232 case 4:
233 AFIO_GPxConfig(HTCFG_ADC1CH4_GPIO_ID, HTCFG_ADC1CH4_AFIO_PIN, AFIO_FUN_ADC0);
234 break;
235 case 5:
236 AFIO_GPxConfig(HTCFG_ADC1CH5_GPIO_ID, HTCFG_ADC1CH5_AFIO_PIN, AFIO_FUN_ADC0);
237 break;
238 case 6:
239 AFIO_GPxConfig(HTCFG_ADC1CH6_GPIO_ID, HTCFG_ADC1CH6_AFIO_PIN, AFIO_FUN_ADC0);
240 break;
241 case 7:
242 AFIO_GPxConfig(HTCFG_ADC1CH7_GPIO_ID, HTCFG_ADC1CH7_AFIO_PIN, AFIO_FUN_ADC0);
243 break;
244 default:
245 break;
246 }
247 }
248 #endif
249 }
250 #endif /* BSP_USING_ADC */
251
252 /* GPIO configuration for SDIO */
253 #ifdef BSP_USING_SDIO
ht32_sdio_gpio_init(void * instance)254 void ht32_sdio_gpio_init(void *instance)
255 {
256 CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
257 HT_SDIO_TypeDef *sdio_x = (HT_SDIO_TypeDef *)instance;
258 if(HT_SDIO == sdio_x)
259 {
260 CKCUClock.Bit.HTCFG_SDIO_CLK_GPIO_CLK = 1;
261 CKCUClock.Bit.HTCFG_SDIO_CMD_GPIO_CLK = 1;
262 CKCUClock.Bit.HTCFG_SDIO_DAT0_GPIO_CLK = 1;
263 CKCUClock.Bit.HTCFG_SDIO_DAT1_GPIO_CLK = 1;
264 CKCUClock.Bit.HTCFG_SDIO_DAT2_GPIO_CLK = 1;
265 CKCUClock.Bit.HTCFG_SDIO_DAT3_GPIO_CLK = 1;
266 CKCUClock.Bit.SDIO = 1;
267 CKCUClock.Bit.PDMA = 1;
268 CKCUClock.Bit.AFIO = 1;
269 CKCU_PeripClockConfig(CKCUClock, ENABLE);
270
271 /* Configure SDIO pins */
272 AFIO_GPxConfig(HTCFG_SDIO_CLK_GPIO_ID, HTCFG_SDIO_CLK_GPIO_PIN, AFIO_FUN_SDIO);
273 AFIO_GPxConfig(HTCFG_SDIO_CMD_GPIO_ID, HTCFG_SDIO_CMD_GPIO_PIN, AFIO_FUN_SDIO);
274 AFIO_GPxConfig(HTCFG_SDIO_DAT0_GPIO_ID, HTCFG_SDIO_DAT0_GPIO_PIN, AFIO_FUN_SDIO);
275 AFIO_GPxConfig(HTCFG_SDIO_DAT1_GPIO_ID, HTCFG_SDIO_DAT1_GPIO_PIN, AFIO_FUN_SDIO);
276 AFIO_GPxConfig(HTCFG_SDIO_DAT2_GPIO_ID, HTCFG_SDIO_DAT2_GPIO_PIN, AFIO_FUN_SDIO);
277 AFIO_GPxConfig(HTCFG_SDIO_DAT3_GPIO_ID, HTCFG_SDIO_DAT3_GPIO_PIN, AFIO_FUN_SDIO);
278 /* 配置SDIO引脚驱动能力 */
279 GPIO_DriveConfig(HTCFG_SDIO_CLK_GPIO_PORT, HTCFG_SDIO_CLK_GPIO_PIN, GPIO_DV_8MA);
280 GPIO_DriveConfig(HTCFG_SDIO_CMD_GPIO_PORT, HTCFG_SDIO_CMD_GPIO_PIN, GPIO_DV_8MA);
281 GPIO_DriveConfig(HTCFG_SDIO_DAT0_GPIO_PORT, HTCFG_SDIO_DAT0_GPIO_PIN, GPIO_DV_8MA);
282 GPIO_DriveConfig(HTCFG_SDIO_DAT1_GPIO_PORT, HTCFG_SDIO_DAT1_GPIO_PIN, GPIO_DV_8MA);
283 GPIO_DriveConfig(HTCFG_SDIO_DAT2_GPIO_PORT, HTCFG_SDIO_DAT2_GPIO_PIN, GPIO_DV_8MA);
284 GPIO_DriveConfig(HTCFG_SDIO_DAT3_GPIO_PORT, HTCFG_SDIO_DAT3_GPIO_PIN, GPIO_DV_8MA);
285
286 }
287 }
288 #endif /* BSP_USING_SDIO */
289