1 /*
2 * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2022-04-28 CDT first version
9 */
10
11 #include <rtdevice.h>
12 #include "board_config.h"
13
14 /**
15 * The below functions will initialize HC32 board.
16 */
17
18 #if defined RT_USING_SERIAL
rt_hw_board_uart_init(CM_USART_TypeDef * USARTx)19 rt_err_t rt_hw_board_uart_init(CM_USART_TypeDef *USARTx)
20 {
21 rt_err_t result = RT_EOK;
22
23 switch ((rt_uint32_t)USARTx)
24 {
25 #if defined(BSP_USING_UART2)
26 case (rt_uint32_t)CM_USART2:
27 /* Configure USART RX/TX pin. */
28 GPIO_SetFunc(USART2_RX_PORT, USART2_RX_PIN, USART2_RX_FUNC);
29 GPIO_SetFunc(USART2_TX_PORT, USART2_TX_PIN, USART2_TX_FUNC);
30 break;
31 #endif
32 #if defined(BSP_USING_UART4)
33 case (rt_uint32_t)CM_USART4:
34 /* Configure USART RX/TX pin. */
35 GPIO_SetFunc(USART4_RX_PORT, USART4_RX_PIN, USART4_RX_FUNC);
36 GPIO_SetFunc(USART4_TX_PORT, USART4_TX_PIN, USART4_TX_FUNC);
37 break;
38 #endif
39 default:
40 result = -RT_ERROR;
41 break;
42 }
43
44 return result;
45 }
46 #endif
47
48 #if defined(RT_USING_I2C)
rt_hw_board_i2c_init(CM_I2C_TypeDef * I2Cx)49 rt_err_t rt_hw_board_i2c_init(CM_I2C_TypeDef *I2Cx)
50 {
51 rt_err_t result = RT_EOK;
52 stc_gpio_init_t stcGpioInit;
53 (void)GPIO_StructInit(&stcGpioInit);
54
55 switch ((rt_uint32_t)I2Cx)
56 {
57 #if defined(BSP_USING_I2C3)
58 case (rt_uint32_t)CM_I2C3:
59 /* Configure I2C3 SDA/SCL pin. */
60 GPIO_SetFunc(I2C3_SDA_PORT, I2C3_SDA_PIN, I2C3_SDA_FUNC);
61 GPIO_SetFunc(I2C3_SCL_PORT, I2C3_SCL_PIN, I2C3_SCL_FUNC);
62 break;
63 #endif
64 default:
65 result = -RT_ERROR;
66 break;
67 }
68 return result;
69 }
70 #endif
71
72 #if defined(RT_USING_ADC)
rt_hw_board_adc_init(CM_ADC_TypeDef * ADCx)73 rt_err_t rt_hw_board_adc_init(CM_ADC_TypeDef *ADCx)
74 {
75 rt_err_t result = RT_EOK;
76 stc_gpio_init_t stcGpioInit;
77
78 (void)GPIO_StructInit(&stcGpioInit);
79 stcGpioInit.u16PinAttr = PIN_ATTR_ANALOG;
80 switch ((rt_uint32_t)ADCx)
81 {
82 #if defined(BSP_USING_ADC1)
83 case (rt_uint32_t)CM_ADC1:
84 (void)GPIO_Init(ADC1_CH_PORT, ADC1_CH_PIN, &stcGpioInit);
85 break;
86 #endif
87 #if defined(BSP_USING_ADC2)
88 case (rt_uint32_t)CM_ADC2:
89 (void)GPIO_Init(ADC2_CH_PORT, ADC2_CH_PIN, &stcGpioInit);
90 break;
91 #endif
92 default:
93 result = -RT_ERROR;
94 break;
95 }
96
97 return result;
98 }
99 #endif
100
101 #if defined(RT_USING_CAN)
CanPhyEnable(void)102 void CanPhyEnable(void)
103 {
104 GPIO_ResetPins(CAN1_STB_PORT, CAN1_STB_PIN);
105 GPIO_OutputCmd(CAN1_STB_PORT, CAN1_STB_PIN, ENABLE);
106 }
107
rt_hw_board_can_init(CM_CAN_TypeDef * CANx)108 rt_err_t rt_hw_board_can_init(CM_CAN_TypeDef *CANx)
109 {
110 rt_err_t result = RT_EOK;
111
112 switch ((rt_uint32_t)CANx)
113 {
114 #if defined(BSP_USING_CAN1)
115 case (rt_uint32_t)CM_CAN:
116 GPIO_SetFunc(CAN1_TX_PORT, CAN1_TX_PIN, CAN1_TX_PIN_FUNC);
117 GPIO_SetFunc(CAN1_RX_PORT, CAN1_RX_PIN, CAN1_RX_PIN_FUNC);
118 break;
119 #endif
120 default:
121 result = -RT_ERROR;
122 break;
123 }
124
125 return result;
126 }
127 #endif
128
129
130 #if defined (RT_USING_SPI)
rt_hw_spi_board_init(CM_SPI_TypeDef * CM_SPIx)131 rt_err_t rt_hw_spi_board_init(CM_SPI_TypeDef *CM_SPIx)
132 {
133 rt_err_t result = RT_EOK;
134 #if defined(BSP_USING_SPI3)
135 stc_gpio_init_t stcGpioInit;
136 #endif
137
138 switch ((rt_uint32_t)CM_SPIx)
139 {
140 #if defined(BSP_USING_SPI3)
141 case (rt_uint32_t)CM_SPI3:
142 GPIO_StructInit(&stcGpioInit);
143 stcGpioInit.u16PinState = PIN_STAT_SET;
144 stcGpioInit.u16PinDir = PIN_DIR_OUT;
145 GPIO_Init(SPI3_WP_PORT, SPI3_WP_PIN, &stcGpioInit);
146 GPIO_Init(SPI3_HOLD_PORT, SPI3_HOLD_PIN, &stcGpioInit);
147
148 (void)GPIO_StructInit(&stcGpioInit);
149 stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
150 (void)GPIO_Init(SPI3_SCK_PORT, SPI3_SCK_PIN, &stcGpioInit);
151 (void)GPIO_Init(SPI3_MOSI_PORT, SPI3_MOSI_PIN, &stcGpioInit);
152 (void)GPIO_Init(SPI3_MISO_PORT, SPI3_MISO_PIN, &stcGpioInit);
153 GPIO_SetFunc(SPI3_SCK_PORT, SPI3_SCK_PIN, SPI3_SCK_FUNC);
154 GPIO_SetFunc(SPI3_MOSI_PORT, SPI3_MOSI_PIN, SPI3_MOSI_FUNC);
155 GPIO_SetFunc(SPI3_MISO_PORT, SPI3_MISO_PIN, SPI3_MISO_FUNC);
156 break;
157 #endif
158 default:
159 result = -RT_ERROR;
160 break;
161 }
162
163 return result;
164 }
165 #endif
166
167 #if defined (RT_USING_SDIO)
rt_hw_board_sdio_init(CM_SDIOC_TypeDef * SDIOCx)168 rt_err_t rt_hw_board_sdio_init(CM_SDIOC_TypeDef *SDIOCx)
169 {
170 rt_err_t result = RT_EOK;
171 stc_gpio_init_t stcGpioInit;
172
173 switch ((rt_uint32_t)SDIOCx)
174 {
175 #if defined(BSP_USING_SDIO1)
176 case (rt_uint32_t)CM_SDIOC1:
177 /************************* Set pin drive capacity *************************/
178 (void)GPIO_StructInit(&stcGpioInit);
179 stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
180 (void)GPIO_Init(SDIOC1_CK_PORT, SDIOC1_CK_PIN, &stcGpioInit);
181 (void)GPIO_Init(SDIOC1_CMD_PORT, SDIOC1_CMD_PIN, &stcGpioInit);
182 (void)GPIO_Init(SDIOC1_D0_PORT, SDIOC1_D0_PIN, &stcGpioInit);
183 (void)GPIO_Init(SDIOC1_D1_PORT, SDIOC1_D1_PIN, &stcGpioInit);
184 (void)GPIO_Init(SDIOC1_D2_PORT, SDIOC1_D2_PIN, &stcGpioInit);
185 (void)GPIO_Init(SDIOC1_D3_PORT, SDIOC1_D3_PIN, &stcGpioInit);
186
187 GPIO_SetFunc(SDIOC1_CK_PORT, SDIOC1_CK_PIN, SDIOC1_CK_FUNC);
188 GPIO_SetFunc(SDIOC1_CMD_PORT, SDIOC1_CMD_PIN, SDIOC1_CMD_FUNC);
189 GPIO_SetFunc(SDIOC1_D0_PORT, SDIOC1_D0_PIN, SDIOC1_D0_FUNC);
190 GPIO_SetFunc(SDIOC1_D1_PORT, SDIOC1_D1_PIN, SDIOC1_D1_FUNC);
191 GPIO_SetFunc(SDIOC1_D2_PORT, SDIOC1_D2_PIN, SDIOC1_D2_FUNC);
192 GPIO_SetFunc(SDIOC1_D3_PORT, SDIOC1_D3_PIN, SDIOC1_D3_FUNC);
193 break;
194 #endif
195 default:
196 result = -RT_ERROR;
197 break;
198 }
199
200 return result;
201 }
202 #endif
203
204 #if defined(RT_USING_PWM)
205 #if defined(BSP_USING_PWM_TMRA)
rt_hw_board_pwm_tmra_init(CM_TMRA_TypeDef * TMRAx)206 rt_err_t rt_hw_board_pwm_tmra_init(CM_TMRA_TypeDef *TMRAx)
207 {
208 rt_err_t result = RT_EOK;
209 switch ((rt_uint32_t)TMRAx)
210 {
211 #if defined(BSP_USING_PWM_TMRA_1)
212 case (rt_uint32_t)CM_TMRA_1:
213 #ifdef BSP_USING_PWM_TMRA_1_CH1
214 GPIO_SetFunc(PWM_TMRA_1_CH1_PORT, PWM_TMRA_1_CH1_PIN, PWM_TMRA_1_CH1_PIN_FUNC);
215 #endif
216 #ifdef BSP_USING_PWM_TMRA_1_CH2
217 GPIO_SetFunc(PWM_TMRA_1_CH2_PORT, PWM_TMRA_1_CH2_PIN, PWM_TMRA_1_CH2_PIN_FUNC);
218 #endif
219 #ifdef BSP_USING_PWM_TMRA_1_CH3
220 GPIO_SetFunc(PWM_TMRA_1_CH3_PORT, PWM_TMRA_1_CH3_PIN, PWM_TMRA_1_CH3_PIN_FUNC);
221 #endif
222 #ifdef BSP_USING_PWM_TMRA_1_CH4
223 GPIO_SetFunc(PWM_TMRA_1_CH4_PORT, PWM_TMRA_1_CH4_PIN, PWM_TMRA_1_CH4_PIN_FUNC);
224 #endif
225 break;
226 #endif
227
228 default:
229 result = -RT_ERROR;
230 break;
231 }
232
233 return result;
234 }
235 #endif
236
237 #if defined(BSP_USING_PWM_TMR4)
rt_hw_board_pwm_tmr4_init(CM_TMR4_TypeDef * TMR4x)238 rt_err_t rt_hw_board_pwm_tmr4_init(CM_TMR4_TypeDef *TMR4x)
239 {
240 rt_err_t result = RT_EOK;
241 switch ((rt_uint32_t)TMR4x)
242 {
243 #if defined(BSP_USING_PWM_TMR4_1)
244 case (rt_uint32_t)CM_TMR4_1:
245 #ifdef BSP_USING_PWM_TMR4_1_OUH
246 GPIO_SetFunc(PWM_TMR4_1_OUH_PORT, PWM_TMR4_1_OUH_PIN, PWM_TMR4_1_OUH_PIN_FUNC);
247 #endif
248 #ifdef BSP_USING_PWM_TMR4_1_OUL
249 GPIO_SetFunc(PWM_TMR4_1_OUL_PORT, PWM_TMR4_1_OUL_PIN, PWM_TMR4_1_OUL_PIN_FUNC);
250 #endif
251 #ifdef BSP_USING_PWM_TMR4_1_OVH
252 GPIO_SetFunc(PWM_TMR4_1_OVH_PORT, PWM_TMR4_1_OVH_PIN, PWM_TMR4_1_OVH_PIN_FUNC);
253 #endif
254 #ifdef BSP_USING_PWM_TMR4_1_OVL
255 GPIO_SetFunc(PWM_TMR4_1_OVL_PORT, PWM_TMR4_1_OVL_PIN, PWM_TMR4_1_OVL_PIN_FUNC);
256 #endif
257 #ifdef BSP_USING_PWM_TMR4_1_OWH
258 GPIO_SetFunc(PWM_TMR4_1_OWH_PORT, PWM_TMR4_1_OWH_PIN, PWM_TMR4_1_OWH_PIN_FUNC);
259 #endif
260 #ifdef BSP_USING_PWM_TMR4_1_OWL
261 GPIO_SetFunc(PWM_TMR4_1_OWL_PORT, PWM_TMR4_1_OWL_PIN, PWM_TMR4_1_OWL_PIN_FUNC);
262 #endif
263 break;
264 #endif
265
266 default:
267 result = -RT_ERROR;
268 break;
269 }
270 return result;
271 }
272 #endif
273
274 #if defined(BSP_USING_PWM_TMR6)
rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef * TMR6x)275 rt_err_t rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef *TMR6x)
276 {
277 rt_err_t result = RT_EOK;
278 switch ((rt_uint32_t)TMR6x)
279 {
280 #if defined(BSP_USING_PWM_TMR6_1)
281 case (rt_uint32_t)CM_TMR6_1:
282 #ifdef BSP_USING_PWM_TMR6_1_A
283 GPIO_SetFunc(PWM_TMR6_1_A_PORT, PWM_TMR6_1_A_PIN, PWM_TMR6_1_A_PIN_FUNC);
284 #endif
285 #ifdef BSP_USING_PWM_TMR6_1_B
286 GPIO_SetFunc(PWM_TMR6_1_B_PORT, PWM_TMR6_1_B_PIN, PWM_TMR6_1_B_PIN_FUNC);
287 #endif
288 break;
289 #endif
290
291 default:
292 result = -RT_ERROR;
293 break;
294 }
295
296 return result;
297 }
298 #endif
299 #endif
300
301 #if defined (BSP_USING_INPUT_CAPTURE)
rt_hw_board_input_capture_init(uint32_t * tmr_instance)302 rt_err_t rt_hw_board_input_capture_init(uint32_t *tmr_instance)
303 {
304 rt_err_t result = RT_EOK;
305
306 switch ((rt_uint32_t)tmr_instance)
307 {
308 #if defined (BSP_USING_INPUT_CAPTURE_TMR6_1)
309 case (rt_uint32_t)CM_TMR6_1:
310 GPIO_SetFunc(INPUT_CAPTURE_TMR6_1_PORT, INPUT_CAPTURE_TMR6_1_PIN, GPIO_FUNC_3);
311 break;
312 #endif
313 #if defined (BSP_USING_INPUT_CAPTURE_TMR6_2)
314 case (rt_uint32_t)CM_TMR6_2:
315 GPIO_SetFunc(INPUT_CAPTURE_TMR6_2_PORT, INPUT_CAPTURE_TMR6_2_PIN, GPIO_FUNC_3);
316 break;
317 #endif
318 #if defined (BSP_USING_INPUT_CAPTURE_TMR6_3)
319 case (rt_uint32_t)CM_TMR6_3:
320 GPIO_SetFunc(INPUT_CAPTURE_TMR6_3_PORT, INPUT_CAPTURE_TMR6_3_PIN, GPIO_FUNC_3);
321 break;
322 #endif
323 default:
324 result = -RT_ERROR;
325 break;
326 }
327 return result;
328 }
329 #endif
330 #ifdef RT_USING_PM
rt_hw_board_pm_sysclk_cfg(uint8_t run_mode)331 void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode)
332 {
333 switch (run_mode)
334 {
335 case PM_RUN_MODE_HIGH_SPEED:
336 case PM_RUN_MODE_NORMAL_SPEED:
337 CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
338 break;
339 case PM_RUN_MODE_LOW_SPEED:
340 /* Ensure that system clock less than 8M */
341 CLK_SetSysClockSrc(CLK_SYSCLK_SRC_XTAL);
342 break;
343 default:
344 break;
345 }
346 }
347 #endif
348
349 #if defined(BSP_USING_USBD) || defined(BSP_USING_USBH)
rt_hw_usbfs_board_init(void)350 rt_err_t rt_hw_usbfs_board_init(void)
351 {
352 stc_gpio_init_t stcGpioCfg;
353 (void)GPIO_StructInit(&stcGpioCfg);
354 #if defined(BSP_USING_USBFS)
355 stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG;
356 (void)GPIO_Init(USBF_DM_PORT, USBF_DM_PIN, &stcGpioCfg);
357 (void)GPIO_Init(USBF_DP_PORT, USBF_DP_PIN, &stcGpioCfg);
358 #if defined(BSP_USING_USBD)
359 GPIO_SetFunc(USBF_VBUS_PORT, USBF_VBUS_PIN, USBF_VBUS_FUNC); /* VBUS */
360 #endif
361 #if defined(BSP_USING_USBH)
362 GPIO_SetFunc(USBF_DRVVBUS_PORT, USBF_DRVVBUS_PIN, USBF_DRVVBUS_FUNC); /* DRV VBUS */
363 #endif
364 #endif
365 return RT_EOK;
366 }
367 #endif
368
369 #if defined(BSP_USING_QSPI)
rt_hw_qspi_board_init(void)370 rt_err_t rt_hw_qspi_board_init(void)
371 {
372 stc_gpio_init_t stcGpioInit;
373
374 (void)GPIO_StructInit(&stcGpioInit);
375 stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
376 #ifndef BSP_QSPI_USING_SOFT_CS
377 (void)GPIO_Init(QSPI_FLASH_CS_PORT, QSPI_FLASH_CS_PIN, &stcGpioInit);
378 GPIO_SetFunc(QSPI_FLASH_CS_PORT, QSPI_FLASH_CS_PIN, QSPI_FLASH_CS_FUNC);
379 #endif
380 (void)GPIO_Init(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, &stcGpioInit);
381 (void)GPIO_Init(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, &stcGpioInit);
382 (void)GPIO_Init(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, &stcGpioInit);
383 (void)GPIO_Init(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, &stcGpioInit);
384 (void)GPIO_Init(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, &stcGpioInit);
385 GPIO_SetFunc(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, QSPI_FLASH_SCK_FUNC);
386 GPIO_SetFunc(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, QSPI_FLASH_IO0_FUNC);
387 GPIO_SetFunc(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, QSPI_FLASH_IO1_FUNC);
388 GPIO_SetFunc(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, QSPI_FLASH_IO2_FUNC);
389 GPIO_SetFunc(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, QSPI_FLASH_IO3_FUNC);
390
391 return RT_EOK;
392 }
393 #endif
394
395 #if defined(BSP_USING_TMRA_PULSE_ENCODER)
rt_hw_board_pulse_encoder_tmra_init(void)396 rt_err_t rt_hw_board_pulse_encoder_tmra_init(void)
397 {
398 #if defined(BSP_USING_PULSE_ENCODER_TMRA_1)
399 GPIO_SetFunc(PULSE_ENCODER_TMRA_1_A_PORT, PULSE_ENCODER_TMRA_1_A_PIN, PULSE_ENCODER_TMRA_1_A_PIN_FUNC);
400 GPIO_SetFunc(PULSE_ENCODER_TMRA_1_B_PORT, PULSE_ENCODER_TMRA_1_B_PIN, PULSE_ENCODER_TMRA_1_B_PIN_FUNC);
401 #endif
402
403 return RT_EOK;
404 }
405 #endif
406
407 #if defined(BSP_USING_TMR6_PULSE_ENCODER)
rt_hw_board_pulse_encoder_tmr6_init(void)408 rt_err_t rt_hw_board_pulse_encoder_tmr6_init(void)
409 {
410 #if defined(BSP_USING_PULSE_ENCODER_TMR6_1)
411 GPIO_SetFunc(PULSE_ENCODER_TMR6_1_A_PORT, PULSE_ENCODER_TMR6_1_A_PIN, PULSE_ENCODER_TMR6_1_A_PIN_FUNC);
412 GPIO_SetFunc(PULSE_ENCODER_TMR6_1_B_PORT, PULSE_ENCODER_TMR6_1_B_PIN, PULSE_ENCODER_TMR6_1_B_PIN_FUNC);
413 #endif
414
415 return RT_EOK;
416 }
417 #endif
418