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