From 6fe69d7431ed54fcea863ed68d7c4f9746e771b0 Mon Sep 17 00:00:00 2001
From: skllii <48580851+skllii@users.noreply.github.com>
Date: Fri, 23 Feb 2024 01:34:35 +0800
Subject: [PATCH] [bsp][hc32] support hc32f448
---
.github/workflows/bsp_buildings.yml | 1 +
bsp/hc32/README.md | 1 +
bsp/hc32/ev_hc32f448_lqfp80/.config | 1095 +
bsp/hc32/ev_hc32f448_lqfp80/.cproject | 214 +
bsp/hc32/ev_hc32f448_lqfp80/.gitignore | 42 +
bsp/hc32/ev_hc32f448_lqfp80/.project | 68 +
bsp/hc32/ev_hc32f448_lqfp80/Kconfig | 21 +
bsp/hc32/ev_hc32f448_lqfp80/README.md | 128 +
bsp/hc32/ev_hc32f448_lqfp80/SConscript | 15 +
bsp/hc32/ev_hc32f448_lqfp80/SConstruct | 62 +
.../applications/SConscript | 15 +
.../ev_hc32f448_lqfp80/applications/main.c | 32 +
.../applications/xtal32_fcm.c | 99 +
bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig | 652 +
bsp/hc32/ev_hc32f448_lqfp80/board/SConscript | 37 +
bsp/hc32/ev_hc32f448_lqfp80/board/board.c | 113 +
bsp/hc32/ev_hc32f448_lqfp80/board/board.h | 54 +
.../ev_hc32f448_lqfp80/board/board_config.c | 497 +
.../ev_hc32f448_lqfp80/board/board_config.h | 310 +
.../board/config/adc_config.h | 155 +
.../board/config/can_config.h | 139 +
.../board/config/dac_config.h | 43 +
.../board/config/dma_config.h | 263 +
.../board/config/gpio_config.h | 176 +
.../board/config/i2c_config.h | 332 +
.../board/config/irq_config.h | 200 +
.../board/config/pm_config.h | 100 +
.../board/config/pulse_encoder_config.h | 545 +
.../board/config/pwm_tmr_config.h | 882 +
.../board/config/qspi_config.h | 75 +
.../board/config/spi_config.h | 377 +
.../board/config/timer_config.h | 115 +
.../board/config/uart_config.h | 449 +
.../ev_hc32f448_lqfp80/board/drv_config.h | 39 +
.../ev_hc32f448_lqfp80/board/hc32f4xx_conf.h | 136 +
.../board/linker_scripts/link.icf | 103 +
.../board/linker_scripts/link.ld | 270 +
.../board/linker_scripts/link.sct | 22 +
.../ev_hc32f448_lqfp80/board/ports/SConscript | 12 +
.../board/ports/drv_spi_flash.c | 123 +
.../board/ports/fal/SConscript | 20 +
.../board/ports/fal/fal_cfg.h | 43 +
.../board/ports/fal/fal_flash_sfud_port.c | 85 +
.../ev_hc32f448_lqfp80/board/ports/tca9539.c | 320 +
.../ev_hc32f448_lqfp80/board/ports/tca9539.h | 133 +
bsp/hc32/ev_hc32f448_lqfp80/figures/board.png | Bin 0 -> 7822856 bytes
.../jlink/ev_hc32f448_lqfp80 Debug.launch | 80 +
bsp/hc32/ev_hc32f448_lqfp80/project.ewd | 2974 +
bsp/hc32/ev_hc32f448_lqfp80/project.ewp | 2224 +
bsp/hc32/ev_hc32f448_lqfp80/project.eww | 10 +
bsp/hc32/ev_hc32f448_lqfp80/project.uvoptx | 189 +
bsp/hc32/ev_hc32f448_lqfp80/project.uvprojx | 867 +
bsp/hc32/ev_hc32f448_lqfp80/rtconfig.h | 276 +
bsp/hc32/ev_hc32f448_lqfp80/rtconfig.py | 150 +
bsp/hc32/ev_hc32f448_lqfp80/template.ewp | 1927 +
bsp/hc32/ev_hc32f448_lqfp80/template.eww | 10 +
bsp/hc32/ev_hc32f448_lqfp80/template.uvoptx | 189 +
bsp/hc32/ev_hc32f448_lqfp80/template.uvprojx | 391 +
bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig | 46 +-
.../board/ports/sdram_port.h | 19 +-
bsp/hc32/libraries/.ignore_format.yml | 1 +
bsp/hc32/libraries/hc32_drivers/drv_adc.c | 151 +-
bsp/hc32/libraries/hc32_drivers/drv_adc.h | 21 +-
bsp/hc32/libraries/hc32_drivers/drv_gpio.c | 3 +
bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c | 79 +-
bsp/hc32/libraries/hc32_drivers/drv_i2c.c | 2 +
bsp/hc32/libraries/hc32_drivers/drv_irq.c | 22 +
bsp/hc32/libraries/hc32_drivers/drv_irq.h | 4 +
bsp/hc32/libraries/hc32_drivers/drv_pm.c | 2 +-
bsp/hc32/libraries/hc32_drivers/drv_sdram.c | 18 +-
bsp/hc32/libraries/hc32_drivers/drv_spi.c | 75 +-
bsp/hc32/libraries/hc32_drivers/drv_usart.c | 422 +-
bsp/hc32/libraries/hc32_drivers/drv_usart.h | 12 +-
.../libraries/hc32_drivers/drv_usart_v2.c | 472 +-
.../libraries/hc32_drivers/drv_usart_v2.h | 8 +
bsp/hc32/libraries/hc32_drivers/drv_wktm.c | 4 +-
bsp/hc32/libraries/hc32_drivers/drv_wktm.h | 2 +-
bsp/hc32/libraries/hc32f448_ddl/ChangeLog.md | 362 +
bsp/hc32/libraries/hc32f448_ddl/LICENSE | 29 +
bsp/hc32/libraries/hc32f448_ddl/SConscript | 97 +
.../config/flashloader/FlashHC32F448.mac | 16 +
.../config/flashloader/FlashHC32F448.out | Bin 0 -> 48368 bytes
.../flashloader/FlashHC32F448_otp.flash | 10 +
.../config/flashloader/FlashHC32F448_otp.out | Bin 0 -> 47664 bytes
.../flashloader/FlashHC32F448_qspi.flash | 9 +
.../config/flashloader/FlashHC32F448_qspi.out | Bin 0 -> 53876 bytes
.../config/flashloader/FlashHC32F448xA.board | 16 +
.../config/flashloader/FlashHC32F448xA.flash | 10 +
.../config/flashloader/FlashHC32F448xC.board | 16 +
.../config/flashloader/FlashHC32F448xC.flash | 10 +
.../drivers/bsp/components/24cxx/24cxx.c | 278 +
.../drivers/bsp/components/24cxx/24cxx.h | 121 +
.../drivers/bsp/components/gt9xx/gt9xx.c | 183 +
.../drivers/bsp/components/gt9xx/gt9xx.h | 150 +
.../drivers/bsp/components/nt35510/nt35510.c | 2078 +
.../drivers/bsp/components/nt35510/nt35510.h | 202 +
.../drivers/bsp/components/tca9539/tca9539.c | 337 +
.../drivers/bsp/components/tca9539/tca9539.h | 193 +
.../drivers/bsp/components/w25qxx/w25qxx.c | 596 +
.../drivers/bsp/components/w25qxx/w25qxx.h | 199 +
.../ev_hc32f448_lqfp80/ev_hc32f448_lqfp80.c | 672 +
.../ev_hc32f448_lqfp80/ev_hc32f448_lqfp80.h | 249 +
.../ev_hc32f448_lqfp80_24cxx.c | 290 +
.../ev_hc32f448_lqfp80_24cxx.h | 126 +
.../ev_hc32f448_lqfp80_bsp.h | 91 +
.../ev_hc32f448_lqfp80_gt9xx.c | 261 +
.../ev_hc32f448_lqfp80_gt9xx.h | 135 +
.../ev_hc32f448_lqfp80_is61lv6416.c | 321 +
.../ev_hc32f448_lqfp80_is61lv6416.h | 203 +
.../ev_hc32f448_lqfp80_nt35510.c | 535 +
.../ev_hc32f448_lqfp80_nt35510.h | 205 +
.../ev_hc32f448_lqfp80_tca9539.c | 387 +
.../ev_hc32f448_lqfp80_tca9539.h | 290 +
.../ev_hc32f448_lqfp80_w25qxx.c | 324 +
.../ev_hc32f448_lqfp80_w25qxx.h | 162 +
.../Device/HDSC/hc32f4xx/Include/hc32f448.h | 13622 ++++
.../Device/HDSC/hc32f4xx/Include/hc32f4xx.h | 66 +
.../HDSC/hc32f4xx/Include/system_hc32f448.h | 140 +
.../Source/ARM/flashloader/HC32F448_128K.FLM | Bin 0 -> 32976 bytes
.../Source/ARM/flashloader/HC32F448_256K.FLM | Bin 0 -> 32972 bytes
.../Source/ARM/flashloader/HC32F448_RAM.FLM | Bin 0 -> 13664 bytes
.../Source/ARM/flashloader/HC32F448_otp.FLM | Bin 0 -> 32496 bytes
.../hc32f4xx/Source/ARM/flashloader/ram.ini | 16 +
.../HDSC/hc32f4xx/Source/ARM/sfr/HC32F448.SFR | Bin 0 -> 1640452 bytes
.../hc32f4xx/Source/ARM/startup_hc32f448.s | 559 +
.../hc32f4xx/Source/GCC/linker/HC32F448xA.ld | 216 +
.../hc32f4xx/Source/GCC/linker/HC32F448xC.ld | 216 +
.../hc32f4xx/Source/GCC/startup_hc32f448.S | 510 +
.../HDSC/hc32f4xx/Source/GCC/svd/HC32F448.svd | 56794 ++++++++++++++++
.../Source/IAR/flashloader/FlashHC32F448.mac | 16 +
.../Source/IAR/flashloader/FlashHC32F448.out | Bin 0 -> 48368 bytes
.../IAR/flashloader/FlashHC32F448_otp.out | Bin 0 -> 47664 bytes
.../Source/IAR/linker/HC32F448_RAM.icf | 55 +
.../hc32f4xx/Source/IAR/linker/HC32F448xA.icf | 52 +
.../hc32f4xx/Source/IAR/linker/HC32F448xC.icf | 52 +
.../hc32f4xx/Source/IAR/startup_hc32f448.s | 902 +
.../HDSC/hc32f4xx/Source/IAR/svd/HC32F448.svd | 56794 ++++++++++++++++
.../HDSC/hc32f4xx/Source/system_hc32f448.c | 205 +
.../drivers/cmsis/Include/arm_common_tables.h | 517 +
.../drivers/cmsis/Include/arm_const_structs.h | 76 +
.../drivers/cmsis/Include/arm_helium_utils.h | 348 +
.../drivers/cmsis/Include/arm_math.h | 8970 +++
.../drivers/cmsis/Include/arm_mve_tables.h | 235 +
.../drivers/cmsis/Include/arm_vec_math.h | 372 +
.../drivers/cmsis/Include/cachel1_armv7.h | 411 +
.../drivers/cmsis/Include/cmsis_armcc.h | 885 +
.../drivers/cmsis/Include/cmsis_armclang.h | 1467 +
.../cmsis/Include/cmsis_armclang_ltm.h | 1893 +
.../drivers/cmsis/Include/cmsis_compiler.h | 283 +
.../drivers/cmsis/Include/cmsis_gcc.h | 2177 +
.../drivers/cmsis/Include/cmsis_iccarm.h | 968 +
.../drivers/cmsis/Include/cmsis_version.h | 39 +
.../drivers/cmsis/Include/core_armv81mml.h | 4191 ++
.../drivers/cmsis/Include/core_armv8mbl.h | 2222 +
.../drivers/cmsis/Include/core_armv8mml.h | 3196 +
.../drivers/cmsis/Include/core_cm0.h | 952 +
.../drivers/cmsis/Include/core_cm0plus.h | 1087 +
.../drivers/cmsis/Include/core_cm1.h | 979 +
.../drivers/cmsis/Include/core_cm23.h | 2297 +
.../drivers/cmsis/Include/core_cm3.h | 1943 +
.../drivers/cmsis/Include/core_cm33.h | 3264 +
.../drivers/cmsis/Include/core_cm35p.h | 3264 +
.../drivers/cmsis/Include/core_cm4.h | 2129 +
.../drivers/cmsis/Include/core_cm55.h | 4215 ++
.../drivers/cmsis/Include/core_cm7.h | 2362 +
.../drivers/cmsis/Include/core_sc000.h | 1030 +
.../drivers/cmsis/Include/core_sc300.h | 1917 +
.../drivers/cmsis/Include/mpu_armv7.h | 275 +
.../drivers/cmsis/Include/mpu_armv8.h | 352 +
.../drivers/cmsis/Include/pmu_armv8.h | 337 +
.../drivers/cmsis/Include/tz_context.h | 70 +
.../drivers/hc32_ll_driver/inc/hc32_ll.h | 337 +
.../drivers/hc32_ll_driver/inc/hc32_ll_adc.h | 524 +
.../drivers/hc32_ll_driver/inc/hc32_ll_aes.h | 117 +
.../drivers/hc32_ll_driver/inc/hc32_ll_aos.h | 247 +
.../drivers/hc32_ll_driver/inc/hc32_ll_clk.h | 681 +
.../drivers/hc32_ll_driver/inc/hc32_ll_cmp.h | 484 +
.../drivers/hc32_ll_driver/inc/hc32_ll_crc.h | 163 +
.../drivers/hc32_ll_driver/inc/hc32_ll_ctc.h | 249 +
.../drivers/hc32_ll_driver/inc/hc32_ll_dac.h | 190 +
.../drivers/hc32_ll_driver/inc/hc32_ll_dbgc.h | 148 +
.../drivers/hc32_ll_driver/inc/hc32_ll_dcu.h | 298 +
.../drivers/hc32_ll_driver/inc/hc32_ll_def.h | 390 +
.../drivers/hc32_ll_driver/inc/hc32_ll_dma.h | 587 +
.../drivers/hc32_ll_driver/inc/hc32_ll_efm.h | 511 +
.../drivers/hc32_ll_driver/inc/hc32_ll_emb.h | 528 +
.../hc32_ll_driver/inc/hc32_ll_event_port.h | 231 +
.../drivers/hc32_ll_driver/inc/hc32_ll_fcg.h | 198 +
.../drivers/hc32_ll_driver/inc/hc32_ll_fcm.h | 290 +
.../drivers/hc32_ll_driver/inc/hc32_ll_gpio.h | 451 +
.../drivers/hc32_ll_driver/inc/hc32_ll_hash.h | 94 +
.../drivers/hc32_ll_driver/inc/hc32_ll_i2c.h | 396 +
.../drivers/hc32_ll_driver/inc/hc32_ll_icg.h | 428 +
.../hc32_ll_driver/inc/hc32_ll_interrupts.h | 472 +
.../hc32_ll_driver/inc/hc32_ll_keyscan.h | 240 +
.../drivers/hc32_ll_driver/inc/hc32_ll_mcan.h | 1126 +
.../drivers/hc32_ll_driver/inc/hc32_ll_mpu.h | 451 +
.../drivers/hc32_ll_driver/inc/hc32_ll_pwc.h | 664 +
.../drivers/hc32_ll_driver/inc/hc32_ll_qspi.h | 446 +
.../drivers/hc32_ll_driver/inc/hc32_ll_rmu.h | 208 +
.../drivers/hc32_ll_driver/inc/hc32_ll_rtc.h | 366 +
.../drivers/hc32_ll_driver/inc/hc32_ll_smc.h | 361 +
.../drivers/hc32_ll_driver/inc/hc32_ll_spi.h | 509 +
.../drivers/hc32_ll_driver/inc/hc32_ll_sram.h | 234 +
.../drivers/hc32_ll_driver/inc/hc32_ll_swdt.h | 227 +
.../drivers/hc32_ll_driver/inc/hc32_ll_tmr0.h | 231 +
.../drivers/hc32_ll_driver/inc/hc32_ll_tmr4.h | 849 +
.../drivers/hc32_ll_driver/inc/hc32_ll_tmr6.h | 873 +
.../drivers/hc32_ll_driver/inc/hc32_ll_tmra.h | 574 +
.../drivers/hc32_ll_driver/inc/hc32_ll_trng.h | 128 +
.../hc32_ll_driver/inc/hc32_ll_usart.h | 543 +
.../hc32_ll_driver/inc/hc32_ll_utility.h | 131 +
.../drivers/hc32_ll_driver/inc/hc32_ll_wdt.h | 228 +
.../drivers/hc32_ll_driver/src/hc32_ll.c | 182 +
.../drivers/hc32_ll_driver/src/hc32_ll_adc.c | 1153 +
.../drivers/hc32_ll_driver/src/hc32_ll_aes.c | 315 +
.../drivers/hc32_ll_driver/src/hc32_ll_aos.c | 316 +
.../drivers/hc32_ll_driver/src/hc32_ll_clk.c | 1507 +
.../drivers/hc32_ll_driver/src/hc32_ll_cmp.c | 1002 +
.../drivers/hc32_ll_driver/src/hc32_ll_crc.c | 565 +
.../drivers/hc32_ll_driver/src/hc32_ll_ctc.c | 524 +
.../drivers/hc32_ll_driver/src/hc32_ll_dac.c | 560 +
.../drivers/hc32_ll_driver/src/hc32_ll_dbgc.c | 176 +
.../drivers/hc32_ll_driver/src/hc32_ll_dcu.c | 607 +
.../drivers/hc32_ll_driver/src/hc32_ll_dma.c | 1355 +
.../drivers/hc32_ll_driver/src/hc32_ll_efm.c | 1479 +
.../drivers/hc32_ll_driver/src/hc32_ll_emb.c | 696 +
.../hc32_ll_driver/src/hc32_ll_event_port.c | 442 +
.../drivers/hc32_ll_driver/src/hc32_ll_fcg.c | 194 +
.../drivers/hc32_ll_driver/src/hc32_ll_fcm.c | 394 +
.../drivers/hc32_ll_driver/src/hc32_ll_gpio.c | 751 +
.../drivers/hc32_ll_driver/src/hc32_ll_hash.c | 350 +
.../drivers/hc32_ll_driver/src/hc32_ll_i2c.c | 1379 +
.../drivers/hc32_ll_driver/src/hc32_ll_icg.c | 138 +
.../hc32_ll_driver/src/hc32_ll_interrupts.c | 764 +
.../hc32_ll_driver/src/hc32_ll_keyscan.c | 257 +
.../drivers/hc32_ll_driver/src/hc32_ll_mcan.c | 2883 +
.../drivers/hc32_ll_driver/src/hc32_ll_mpu.c | 1193 +
.../drivers/hc32_ll_driver/src/hc32_ll_pwc.c | 1257 +
.../drivers/hc32_ll_driver/src/hc32_ll_qspi.c | 495 +
.../drivers/hc32_ll_driver/src/hc32_ll_rmu.c | 290 +
.../drivers/hc32_ll_driver/src/hc32_ll_rtc.c | 943 +
.../drivers/hc32_ll_driver/src/hc32_ll_smc.c | 520 +
.../drivers/hc32_ll_driver/src/hc32_ll_spi.c | 1148 +
.../drivers/hc32_ll_driver/src/hc32_ll_sram.c | 359 +
.../drivers/hc32_ll_driver/src/hc32_ll_swdt.c | 257 +
.../drivers/hc32_ll_driver/src/hc32_ll_tmr0.c | 624 +
.../drivers/hc32_ll_driver/src/hc32_ll_tmr4.c | 2455 +
.../drivers/hc32_ll_driver/src/hc32_ll_tmr6.c | 1849 +
.../drivers/hc32_ll_driver/src/hc32_ll_tmra.c | 1206 +
.../drivers/hc32_ll_driver/src/hc32_ll_trng.c | 257 +
.../hc32_ll_driver/src/hc32_ll_usart.c | 2177 +
.../hc32_ll_driver/src/hc32_ll_utility.c | 439 +
.../drivers/hc32_ll_driver/src/hc32_ll_wdt.c | 257 +
.../hc32/iec60730_class_b_stl/stl_common.h | 145 +
.../hc32/iec60730_class_b_stl/stl_conf.h | 106 +
.../stl_test_item/inc/stl_sw_crc32.h | 93 +
.../stl_test_item/inc/stl_test_cpu.h | 85 +
.../stl_test_item/inc/stl_test_flash.h | 85 +
.../stl_test_item/inc/stl_test_interrupt.h | 99 +
.../stl_test_item/inc/stl_test_pc.h | 84 +
.../stl_test_item/inc/stl_test_ram.h | 88 +
.../src/EWARM/stl_test_cpu_cm0_startup.s | 372 +
.../src/EWARM/stl_test_cpu_cm4_startup.s | 420 +
.../src/EWARM/stl_test_cpu_runtime.s | 245 +
.../src/EWARM/stl_test_full_ram_startup.s | 186 +
.../stl_test_item/src/EWARM/stl_test_pc.s | 148 +
.../src/MDK/stl_test_cpu_cm0_startup.s | 378 +
.../src/MDK/stl_test_cpu_cm4_startup.s | 426 +
.../src/MDK/stl_test_cpu_runtime.s | 251 +
.../src/MDK/stl_test_full_ram_startup.s | 191 +
.../stl_test_item/src/MDK/stl_test_pc.s | 147 +
.../stl_test_item/src/stl_sw_crc32.c | 154 +
.../stl_test_item/src/stl_test_flash.c | 179 +
.../stl_test_item/src/stl_test_interrupt.c | 165 +
.../stl_test_item/src/stl_test_ram_runtime.c | 269 +
.../iec60730_class_b_stl/stl_test_runtime.c | 145 +
.../iec60730_class_b_stl/stl_test_runtime.h | 114 +
.../iec60730_class_b_stl/stl_test_startup.c | 120 +
.../iec60730_class_b_stl/stl_test_startup.h | 111 +
.../hc32/iec60730_class_b_stl/stl_utility.c | 236 +
.../hc32/iec60730_class_b_stl/stl_utility.h | 107 +
282 files changed, 268408 insertions(+), 223 deletions(-)
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/.config
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/.cproject
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/.gitignore
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/.project
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/Kconfig
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/README.md
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/SConscript
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/SConstruct
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/applications/SConscript
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/applications/main.c
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/applications/xtal32_fcm.c
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/SConscript
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/board.c
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/board.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/adc_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/can_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/dac_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/dma_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/gpio_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/i2c_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/pm_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/pulse_encoder_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/pwm_tmr_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/qspi_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/spi_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/timer_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/config/uart_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/hc32f4xx_conf.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.icf
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.ld
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.sct
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/SConscript
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/drv_spi_flash.c
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/SConscript
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_cfg.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_flash_sfud_port.c
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.c
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/figures/board.png
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/jlink/ev_hc32f448_lqfp80 Debug.launch
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/project.ewd
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/project.ewp
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/project.eww
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/project.uvoptx
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/project.uvprojx
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/rtconfig.h
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/rtconfig.py
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/template.ewp
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/template.eww
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/template.uvoptx
create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/template.uvprojx
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/ChangeLog.md
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/LICENSE
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/SConscript
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448.mac
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448.out
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448_otp.flash
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448_otp.out
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448_qspi.flash
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448_qspi.out
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448xA.board
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448xA.flash
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448xC.board
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448xC.flash
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/24cxx/24cxx.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/24cxx/24cxx.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/gt9xx/gt9xx.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/gt9xx/gt9xx.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/nt35510/nt35510.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/nt35510/nt35510.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/tca9539/tca9539.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/tca9539/tca9539.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/w25qxx/w25qxx.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/w25qxx/w25qxx.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_24cxx.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_24cxx.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_bsp.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_gt9xx.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_gt9xx.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_is61lv6416.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_is61lv6416.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_nt35510.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_nt35510.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_tca9539.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_tca9539.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_w25qxx.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_w25qxx.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/hc32f448.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4xx.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/system_hc32f448.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F448_128K.FLM
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F448_256K.FLM
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F448_RAM.FLM
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F448_otp.FLM
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/ram.ini
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HC32F448.SFR
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f448.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F448xA.ld
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F448xC.ld
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f448.S
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HC32F448.svd
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448.mac
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448.out
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448_otp.out
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F448_RAM.icf
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F448xA.icf
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F448xC.icf
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f448.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HC32F448.svd
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f448.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/arm_common_tables.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/arm_const_structs.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/arm_helium_utils.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/arm_math.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/arm_mve_tables.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/arm_vec_math.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/cachel1_armv7.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/cmsis_armcc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/cmsis_armclang.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/cmsis_armclang_ltm.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/cmsis_compiler.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/cmsis_gcc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/cmsis_iccarm.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/cmsis_version.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_armv81mml.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_armv8mbl.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_armv8mml.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm0.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm0plus.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm1.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm23.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm3.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm33.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm35p.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm4.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm55.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_cm7.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_sc000.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/core_sc300.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/mpu_armv7.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/mpu_armv8.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/pmu_armv8.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Include/tz_context.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_adc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aes.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aos.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_clk.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_cmp.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_crc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_ctc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dac.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dbgc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dcu.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_def.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dma.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_efm.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_emb.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_event_port.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcg.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcm.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_gpio.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_hash.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2c.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_icg.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_interrupts.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_keyscan.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_mcan.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_mpu.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_pwc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_qspi.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rmu.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rtc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_smc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_spi.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sram.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_swdt.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr0.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr4.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr6.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmra.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_trng.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usart.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_utility.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/inc/hc32_ll_wdt.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_adc.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_aes.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_aos.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_clk.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_cmp.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_crc.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_ctc.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_dac.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_dbgc.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_dcu.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_dma.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_efm.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_emb.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_event_port.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcg.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcm.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_gpio.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_hash.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2c.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_icg.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_interrupts.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_keyscan.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_mcan.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_mpu.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_pwc.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_qspi.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_rmu.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_rtc.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_smc.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_spi.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_sram.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_swdt.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr0.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr4.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr6.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmra.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_trng.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_usart.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_utility.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/hc32_ll_driver/src/hc32_ll_wdt.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_common.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_conf.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/inc/stl_sw_crc32.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/inc/stl_test_cpu.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/inc/stl_test_flash.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/inc/stl_test_interrupt.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/inc/stl_test_pc.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/inc/stl_test_ram.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/EWARM/stl_test_cpu_cm0_startup.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/EWARM/stl_test_cpu_cm4_startup.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/EWARM/stl_test_cpu_runtime.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/EWARM/stl_test_full_ram_startup.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/EWARM/stl_test_pc.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/MDK/stl_test_cpu_cm0_startup.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/MDK/stl_test_cpu_cm4_startup.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/MDK/stl_test_cpu_runtime.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/MDK/stl_test_full_ram_startup.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/MDK/stl_test_pc.s
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/stl_sw_crc32.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/stl_test_flash.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/stl_test_interrupt.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_item/src/stl_test_ram_runtime.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_runtime.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_runtime.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_startup.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_test_startup.h
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_utility.c
create mode 100644 bsp/hc32/libraries/hc32f448_ddl/midwares/hc32/iec60730_class_b_stl/stl_utility.h
diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml
index 348cb690ec..4314224a60 100644
--- a/.github/workflows/bsp_buildings.yml
+++ b/.github/workflows/bsp_buildings.yml
@@ -76,6 +76,7 @@ jobs:
- "at32/at32f437-start"
- "yichip/yc3122-pos"
- "hc32/ev_hc32f4a0_lqfp176"
+ - "hc32/ev_hc32f448_lqfp80"
- "hc32/ev_hc32f460_lqfp100_v2"
- "hc32l196"
- "mm32/mm32f3270-100ask-pitaya"
diff --git a/bsp/hc32/README.md b/bsp/hc32/README.md
index 36bd07cdbd..e815037a35 100644
--- a/bsp/hc32/README.md
+++ b/bsp/hc32/README.md
@@ -9,6 +9,7 @@ HC32 系列 BSP 目前支持情况如下表所示:
| **F4 系列** | |
| [ev_hc32f460_lqfp100_v2](ev_hc32f460_lqfp100_v2) | 小华 官方 EV_F460_LQ100_V2 开发板 |
| [ev_hc32f4a0_lqfp176](ev_hc32f4a0_lqfp176) | 小华 官方 EV_F4A0_LQ176 开发板 |
+| [ev_hc32f448_lqfp80](ev_hc32f448_lqfp80) | 小华 官方 EV_F448_LQ80 开发板 |
| **M1 系列** | |
| **M4 系列** | |
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/.config b/bsp/hc32/ev_hc32f448_lqfp80/.config
new file mode 100644
index 0000000000..248d745eb4
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/.config
@@ -0,0 +1,1095 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# RT-Thread Configuration
+#
+
+#
+# RT-Thread Kernel
+#
+CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
+# CONFIG_RT_USING_NANO is not set
+# CONFIG_RT_USING_AMP is not set
+# CONFIG_RT_USING_SMP is not set
+CONFIG_RT_CPUS_NR=1
+CONFIG_RT_ALIGN_SIZE=8
+# CONFIG_RT_THREAD_PRIORITY_8 is not set
+CONFIG_RT_THREAD_PRIORITY_32=y
+# CONFIG_RT_THREAD_PRIORITY_256 is not set
+CONFIG_RT_THREAD_PRIORITY_MAX=32
+CONFIG_RT_TICK_PER_SECOND=1000
+CONFIG_RT_USING_OVERFLOW_CHECK=y
+CONFIG_RT_USING_HOOK=y
+CONFIG_RT_HOOK_USING_FUNC_PTR=y
+# CONFIG_RT_USING_HOOKLIST is not set
+CONFIG_RT_USING_IDLE_HOOK=y
+CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
+CONFIG_IDLE_THREAD_STACK_SIZE=256
+# CONFIG_RT_USING_TIMER_SOFT is not set
+
+#
+# kservice optimization
+#
+# CONFIG_RT_KSERVICE_USING_STDLIB is not set
+# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set
+# CONFIG_RT_USING_TINY_FFS is not set
+# CONFIG_RT_KPRINTF_USING_LONGLONG is not set
+CONFIG_RT_USING_DEBUG=y
+CONFIG_RT_DEBUGING_COLOR=y
+CONFIG_RT_DEBUGING_CONTEXT=y
+# CONFIG_RT_DEBUGING_AUTO_INIT is not set
+
+#
+# Inter-Thread communication
+#
+CONFIG_RT_USING_SEMAPHORE=y
+CONFIG_RT_USING_MUTEX=y
+CONFIG_RT_USING_EVENT=y
+CONFIG_RT_USING_MAILBOX=y
+CONFIG_RT_USING_MESSAGEQUEUE=y
+# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set
+# CONFIG_RT_USING_SIGNALS is not set
+
+#
+# Memory Management
+#
+CONFIG_RT_USING_MEMPOOL=y
+CONFIG_RT_USING_SMALL_MEM=y
+# CONFIG_RT_USING_SLAB is not set
+# CONFIG_RT_USING_MEMHEAP is not set
+CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y
+# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set
+# CONFIG_RT_USING_SLAB_AS_HEAP is not set
+# CONFIG_RT_USING_USERHEAP is not set
+# CONFIG_RT_USING_NOHEAP is not set
+# CONFIG_RT_USING_MEMTRACE is not set
+# CONFIG_RT_USING_HEAP_ISR is not set
+CONFIG_RT_USING_HEAP=y
+CONFIG_RT_USING_DEVICE=y
+# CONFIG_RT_USING_DEVICE_OPS is not set
+# CONFIG_RT_USING_INTERRUPT_INFO is not set
+# CONFIG_RT_USING_THREDSAFE_PRINTF is not set
+CONFIG_RT_USING_CONSOLE=y
+CONFIG_RT_CONSOLEBUF_SIZE=128
+CONFIG_RT_CONSOLE_DEVICE_NAME="uart2"
+CONFIG_RT_VER_NUM=0x50100
+# CONFIG_RT_USING_STDC_ATOMIC is not set
+CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
+# CONFIG_RT_USING_CACHE is not set
+CONFIG_RT_USING_HW_ATOMIC=y
+# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_RT_USING_CPU_FFS=y
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_CORTEX_M=y
+CONFIG_ARCH_ARM_CORTEX_M4=y
+
+#
+# RT-Thread Components
+#
+CONFIG_RT_USING_COMPONENTS_INIT=y
+CONFIG_RT_USING_USER_MAIN=y
+CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048
+CONFIG_RT_MAIN_THREAD_PRIORITY=10
+# CONFIG_RT_USING_LEGACY is not set
+CONFIG_RT_USING_MSH=y
+CONFIG_RT_USING_FINSH=y
+CONFIG_FINSH_USING_MSH=y
+CONFIG_FINSH_THREAD_NAME="tshell"
+CONFIG_FINSH_THREAD_PRIORITY=20
+CONFIG_FINSH_THREAD_STACK_SIZE=4096
+CONFIG_FINSH_USING_HISTORY=y
+CONFIG_FINSH_HISTORY_LINES=5
+CONFIG_FINSH_USING_SYMTAB=y
+CONFIG_FINSH_CMD_SIZE=80
+CONFIG_MSH_USING_BUILT_IN_COMMANDS=y
+CONFIG_FINSH_USING_DESCRIPTION=y
+# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
+# CONFIG_FINSH_USING_AUTH is not set
+CONFIG_FINSH_ARG_MAX=10
+CONFIG_FINSH_USING_OPTION_COMPLETION=y
+
+#
+# DFS: device virtual file system
+#
+# CONFIG_RT_USING_DFS is not set
+# CONFIG_RT_USING_FAL is not set
+
+#
+# Device Drivers
+#
+# CONFIG_RT_USING_DM is not set
+CONFIG_RT_USING_DEVICE_IPC=y
+CONFIG_RT_UNAMED_PIPE_NUMBER=64
+CONFIG_RT_USING_SYSTEM_WORKQUEUE=y
+CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048
+CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23
+CONFIG_RT_USING_SERIAL=y
+CONFIG_RT_USING_SERIAL_V1=y
+# CONFIG_RT_USING_SERIAL_V2 is not set
+CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
+# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_HWTIMER is not set
+# CONFIG_RT_USING_CPUTIME is not set
+# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY is not set
+CONFIG_RT_USING_PIN=y
+# CONFIG_RT_USING_ADC is not set
+# CONFIG_RT_USING_DAC is not set
+# CONFIG_RT_USING_NULL is not set
+# CONFIG_RT_USING_ZERO is not set
+# CONFIG_RT_USING_RANDOM is not set
+# CONFIG_RT_USING_PWM is not set
+# CONFIG_RT_USING_MTD_NOR is not set
+# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
+# CONFIG_RT_USING_RTC is not set
+# CONFIG_RT_USING_SDIO is not set
+# CONFIG_RT_USING_SPI is not set
+# CONFIG_RT_USING_WDT is not set
+# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_LCD is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
+# CONFIG_RT_USING_DEV_BUS is not set
+# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_VIRTIO is not set
+# CONFIG_RT_USING_KTIME is not set
+
+#
+# Using USB
+#
+# CONFIG_RT_USING_USB is not set
+# CONFIG_RT_USING_USB_HOST is not set
+# CONFIG_RT_USING_USB_DEVICE is not set
+
+#
+# C/C++ and POSIX layer
+#
+
+#
+# ISO-ANSI C layer
+#
+
+#
+# Timezone and Daylight Saving Time
+#
+# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set
+CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y
+CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8
+CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0
+CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
+
+#
+# POSIX (Portable Operating System Interface) layer
+#
+# CONFIG_RT_USING_POSIX_FS is not set
+# CONFIG_RT_USING_POSIX_DELAY is not set
+# CONFIG_RT_USING_POSIX_CLOCK is not set
+# CONFIG_RT_USING_POSIX_TIMER is not set
+# CONFIG_RT_USING_PTHREADS is not set
+# CONFIG_RT_USING_MODULE is not set
+
+#
+# Interprocess Communication (IPC)
+#
+# CONFIG_RT_USING_POSIX_PIPE is not set
+# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set
+# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set
+
+#
+# Socket is in the 'Network' category
+#
+# CONFIG_RT_USING_CPLUSPLUS is not set
+
+#
+# Network
+#
+# CONFIG_RT_USING_SAL is not set
+# CONFIG_RT_USING_NETDEV is not set
+# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_AT is not set
+
+#
+# Memory protection
+#
+# CONFIG_RT_USING_MEM_PROTECTION is not set
+# CONFIG_RT_USING_HW_STACK_GUARD is not set
+
+#
+# Utilities
+#
+# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_VAR_EXPORT is not set
+# CONFIG_RT_USING_RESOURCE_ID is not set
+# CONFIG_RT_USING_ADT is not set
+# CONFIG_RT_USING_RT_LINK is not set
+# CONFIG_RT_USING_VBUS is not set
+
+#
+# RT-Thread Utestcases
+#
+# CONFIG_RT_USING_UTESTCASES is not set
+
+#
+# RT-Thread online packages
+#
+
+#
+# IoT - internet of things
+#
+# CONFIG_PKG_USING_LWIP is not set
+# CONFIG_PKG_USING_LORAWAN_DRIVER is not set
+# CONFIG_PKG_USING_PAHOMQTT is not set
+# CONFIG_PKG_USING_UMQTT is not set
+# CONFIG_PKG_USING_WEBCLIENT is not set
+# CONFIG_PKG_USING_WEBNET is not set
+# CONFIG_PKG_USING_MONGOOSE is not set
+# CONFIG_PKG_USING_MYMQTT is not set
+# CONFIG_PKG_USING_KAWAII_MQTT is not set
+# CONFIG_PKG_USING_BC28_MQTT is not set
+# CONFIG_PKG_USING_WEBTERMINAL is not set
+# CONFIG_PKG_USING_FREEMODBUS is not set
+# CONFIG_PKG_USING_NANOPB is not set
+
+#
+# Wi-Fi
+#
+
+#
+# Marvell WiFi
+#
+# CONFIG_PKG_USING_WLANMARVELL is not set
+
+#
+# Wiced WiFi
+#
+# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
+
+#
+# CYW43012 WiFi
+#
+# CONFIG_PKG_USING_WLAN_CYW43012 is not set
+
+#
+# BL808 WiFi
+#
+# CONFIG_PKG_USING_WLAN_BL808 is not set
+
+#
+# CYW43439 WiFi
+#
+# CONFIG_PKG_USING_WLAN_CYW43439 is not set
+# CONFIG_PKG_USING_COAP is not set
+# CONFIG_PKG_USING_NOPOLL is not set
+# CONFIG_PKG_USING_NETUTILS is not set
+# CONFIG_PKG_USING_CMUX is not set
+# CONFIG_PKG_USING_PPP_DEVICE is not set
+# CONFIG_PKG_USING_AT_DEVICE is not set
+# CONFIG_PKG_USING_ATSRV_SOCKET is not set
+# CONFIG_PKG_USING_WIZNET is not set
+# CONFIG_PKG_USING_ZB_COORDINATOR is not set
+
+#
+# IoT Cloud
+#
+# CONFIG_PKG_USING_ONENET is not set
+# CONFIG_PKG_USING_GAGENT_CLOUD is not set
+# CONFIG_PKG_USING_ALI_IOTKIT is not set
+# CONFIG_PKG_USING_AZURE is not set
+# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set
+# CONFIG_PKG_USING_JIOT-C-SDK is not set
+# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set
+# CONFIG_PKG_USING_JOYLINK is not set
+# CONFIG_PKG_USING_IOTSHARP_SDK is not set
+# CONFIG_PKG_USING_NIMBLE is not set
+# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set
+# CONFIG_PKG_USING_OTA_DOWNLOADER is not set
+# CONFIG_PKG_USING_IPMSG is not set
+# CONFIG_PKG_USING_LSSDP is not set
+# CONFIG_PKG_USING_AIRKISS_OPEN is not set
+# CONFIG_PKG_USING_LIBRWS is not set
+# CONFIG_PKG_USING_TCPSERVER is not set
+# CONFIG_PKG_USING_PROTOBUF_C is not set
+# CONFIG_PKG_USING_DLT645 is not set
+# CONFIG_PKG_USING_QXWZ is not set
+# CONFIG_PKG_USING_SMTP_CLIENT is not set
+# CONFIG_PKG_USING_ABUP_FOTA is not set
+# CONFIG_PKG_USING_LIBCURL2RTT is not set
+# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_AGILE_TELNET is not set
+# CONFIG_PKG_USING_NMEALIB is not set
+# CONFIG_PKG_USING_PDULIB is not set
+# CONFIG_PKG_USING_BTSTACK is not set
+# CONFIG_PKG_USING_BT_CYW43012 is not set
+# CONFIG_PKG_USING_CYW43XX is not set
+# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
+# CONFIG_PKG_USING_WAYZ_IOTKIT is not set
+# CONFIG_PKG_USING_MAVLINK is not set
+# CONFIG_PKG_USING_BSAL is not set
+# CONFIG_PKG_USING_AGILE_MODBUS is not set
+# CONFIG_PKG_USING_AGILE_FTP is not set
+# CONFIG_PKG_USING_EMBEDDEDPROTO is not set
+# CONFIG_PKG_USING_RT_LINK_HW is not set
+# CONFIG_PKG_USING_RYANMQTT is not set
+# CONFIG_PKG_USING_RYANW5500 is not set
+# CONFIG_PKG_USING_LORA_PKT_FWD is not set
+# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set
+# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set
+# CONFIG_PKG_USING_HM is not set
+# CONFIG_PKG_USING_SMALL_MODBUS is not set
+# CONFIG_PKG_USING_NET_SERVER is not set
+# CONFIG_PKG_USING_ZFTP is not set
+# CONFIG_PKG_USING_WOL is not set
+# CONFIG_PKG_USING_ZEPHYR_POLLING is not set
+# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set
+# CONFIG_PKG_USING_LHC_MODBUS is not set
+
+#
+# security packages
+#
+# CONFIG_PKG_USING_MBEDTLS is not set
+# CONFIG_PKG_USING_LIBSODIUM is not set
+# CONFIG_PKG_USING_LIBHYDROGEN is not set
+# CONFIG_PKG_USING_TINYCRYPT is not set
+# CONFIG_PKG_USING_TFM is not set
+# CONFIG_PKG_USING_YD_CRYPTO is not set
+
+#
+# language packages
+#
+
+#
+# JSON: JavaScript Object Notation, a lightweight data-interchange format
+#
+# CONFIG_PKG_USING_CJSON is not set
+# CONFIG_PKG_USING_LJSON is not set
+# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
+# CONFIG_PKG_USING_RAPIDJSON is not set
+# CONFIG_PKG_USING_JSMN is not set
+# CONFIG_PKG_USING_AGILE_JSMN is not set
+# CONFIG_PKG_USING_PARSON is not set
+
+#
+# XML: Extensible Markup Language
+#
+# CONFIG_PKG_USING_SIMPLE_XML is not set
+# CONFIG_PKG_USING_EZXML is not set
+# CONFIG_PKG_USING_LUATOS_SOC is not set
+# CONFIG_PKG_USING_LUA is not set
+# CONFIG_PKG_USING_JERRYSCRIPT is not set
+# CONFIG_PKG_USING_MICROPYTHON is not set
+# CONFIG_PKG_USING_PIKASCRIPT is not set
+# CONFIG_PKG_USING_RTT_RUST is not set
+
+#
+# multimedia packages
+#
+
+#
+# LVGL: powerful and easy-to-use embedded GUI library
+#
+# CONFIG_PKG_USING_LVGL is not set
+# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set
+# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set
+
+#
+# u8g2: a monochrome graphic library
+#
+# CONFIG_PKG_USING_U8G2_OFFICIAL is not set
+# CONFIG_PKG_USING_U8G2 is not set
+# CONFIG_PKG_USING_OPENMV is not set
+# CONFIG_PKG_USING_MUPDF is not set
+# CONFIG_PKG_USING_STEMWIN is not set
+# CONFIG_PKG_USING_WAVPLAYER is not set
+# CONFIG_PKG_USING_TJPGD is not set
+# CONFIG_PKG_USING_PDFGEN is not set
+# CONFIG_PKG_USING_HELIX is not set
+# CONFIG_PKG_USING_AZUREGUIX is not set
+# CONFIG_PKG_USING_TOUCHGFX2RTT is not set
+# CONFIG_PKG_USING_NUEMWIN is not set
+# CONFIG_PKG_USING_MP3PLAYER is not set
+# CONFIG_PKG_USING_TINYJPEG is not set
+# CONFIG_PKG_USING_UGUI is not set
+# CONFIG_PKG_USING_MCURSES is not set
+# CONFIG_PKG_USING_TERMBOX is not set
+# CONFIG_PKG_USING_VT100 is not set
+# CONFIG_PKG_USING_QRCODE is not set
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON is not set
+# CONFIG_PKG_USING_3GPP_AMRNB is not set
+
+#
+# tools packages
+#
+# CONFIG_PKG_USING_CMBACKTRACE is not set
+# CONFIG_PKG_USING_EASYFLASH is not set
+# CONFIG_PKG_USING_EASYLOGGER is not set
+# CONFIG_PKG_USING_SYSTEMVIEW is not set
+# CONFIG_PKG_USING_SEGGER_RTT is not set
+# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set
+# CONFIG_PKG_USING_RDB is not set
+# CONFIG_PKG_USING_ULOG_EASYFLASH is not set
+# CONFIG_PKG_USING_LOGMGR is not set
+# CONFIG_PKG_USING_ADBD is not set
+# CONFIG_PKG_USING_COREMARK is not set
+# CONFIG_PKG_USING_DHRYSTONE is not set
+# CONFIG_PKG_USING_MEMORYPERF is not set
+# CONFIG_PKG_USING_NR_MICRO_SHELL is not set
+# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set
+# CONFIG_PKG_USING_LUNAR_CALENDAR is not set
+# CONFIG_PKG_USING_BS8116A is not set
+# CONFIG_PKG_USING_GPS_RMC is not set
+# CONFIG_PKG_USING_URLENCODE is not set
+# CONFIG_PKG_USING_UMCN is not set
+# CONFIG_PKG_USING_LWRB2RTT is not set
+# CONFIG_PKG_USING_CPU_USAGE is not set
+# CONFIG_PKG_USING_GBK2UTF8 is not set
+# CONFIG_PKG_USING_VCONSOLE is not set
+# CONFIG_PKG_USING_KDB is not set
+# CONFIG_PKG_USING_WAMR is not set
+# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
+# CONFIG_PKG_USING_LWLOG is not set
+# CONFIG_PKG_USING_ANV_TRACE is not set
+# CONFIG_PKG_USING_ANV_MEMLEAK is not set
+# CONFIG_PKG_USING_ANV_TESTSUIT is not set
+# CONFIG_PKG_USING_ANV_BENCH is not set
+# CONFIG_PKG_USING_DEVMEM is not set
+# CONFIG_PKG_USING_REGEX is not set
+# CONFIG_PKG_USING_MEM_SANDBOX is not set
+# CONFIG_PKG_USING_SOLAR_TERMS is not set
+# CONFIG_PKG_USING_GAN_ZHI is not set
+# CONFIG_PKG_USING_FDT is not set
+# CONFIG_PKG_USING_CBOX is not set
+# CONFIG_PKG_USING_SNOWFLAKE is not set
+# CONFIG_PKG_USING_HASH_MATCH is not set
+# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set
+# CONFIG_PKG_USING_VOFA_PLUS is not set
+# CONFIG_PKG_USING_RT_TRACE is not set
+# CONFIG_PKG_USING_ZDEBUG is not set
+
+#
+# system packages
+#
+
+#
+# enhanced kernel services
+#
+# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
+# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
+# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set
+
+#
+# acceleration: Assembly language or algorithmic acceleration packages
+#
+# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
+# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
+# CONFIG_PKG_USING_QFPLIB_M3 is not set
+
+#
+# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard
+#
+# CONFIG_PKG_USING_CMSIS_5 is not set
+# CONFIG_PKG_USING_CMSIS_RTOS1 is not set
+# CONFIG_PKG_USING_CMSIS_RTOS2 is not set
+
+#
+# Micrium: Micrium software products porting for RT-Thread
+#
+# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set
+# CONFIG_PKG_USING_UCOSII_WRAPPER is not set
+# CONFIG_PKG_USING_UC_CRC is not set
+# CONFIG_PKG_USING_UC_CLK is not set
+# CONFIG_PKG_USING_UC_COMMON is not set
+# CONFIG_PKG_USING_UC_MODBUS is not set
+# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set
+# CONFIG_PKG_USING_LITEOS_SDK is not set
+# CONFIG_PKG_USING_TZ_DATABASE is not set
+# CONFIG_PKG_USING_CAIRO is not set
+# CONFIG_PKG_USING_PIXMAN is not set
+# CONFIG_PKG_USING_PARTITION is not set
+# CONFIG_PKG_USING_PERF_COUNTER is not set
+# CONFIG_PKG_USING_FILEX is not set
+# CONFIG_PKG_USING_FLASHDB is not set
+# CONFIG_PKG_USING_SQLITE is not set
+# CONFIG_PKG_USING_RTI is not set
+# CONFIG_PKG_USING_DFS_YAFFS is not set
+# CONFIG_PKG_USING_LITTLEFS is not set
+# CONFIG_PKG_USING_DFS_JFFS2 is not set
+# CONFIG_PKG_USING_DFS_UFFS is not set
+# CONFIG_PKG_USING_LWEXT4 is not set
+# CONFIG_PKG_USING_THREAD_POOL is not set
+# CONFIG_PKG_USING_ROBOTS is not set
+# CONFIG_PKG_USING_EV is not set
+# CONFIG_PKG_USING_SYSWATCH is not set
+# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set
+# CONFIG_PKG_USING_PLCCORE is not set
+# CONFIG_PKG_USING_RAMDISK is not set
+# CONFIG_PKG_USING_MININI is not set
+# CONFIG_PKG_USING_QBOOT is not set
+# CONFIG_PKG_USING_PPOOL is not set
+# CONFIG_PKG_USING_OPENAMP is not set
+# CONFIG_PKG_USING_RPMSG_LITE is not set
+# CONFIG_PKG_USING_LPM is not set
+# CONFIG_PKG_USING_TLSF is not set
+# CONFIG_PKG_USING_EVENT_RECORDER is not set
+# CONFIG_PKG_USING_ARM_2D is not set
+# CONFIG_PKG_USING_MCUBOOT is not set
+# CONFIG_PKG_USING_TINYUSB is not set
+# CONFIG_PKG_USING_CHERRYUSB is not set
+# CONFIG_PKG_USING_KMULTI_RTIMER is not set
+# CONFIG_PKG_USING_TFDB is not set
+# CONFIG_PKG_USING_QPC is not set
+# CONFIG_PKG_USING_AGILE_UPGRADE is not set
+# CONFIG_PKG_USING_FLASH_BLOB is not set
+# CONFIG_PKG_USING_MLIBC is not set
+# CONFIG_PKG_USING_TASK_MSG_BUS is not set
+# CONFIG_PKG_USING_SFDB is not set
+# CONFIG_PKG_USING_RTP is not set
+# CONFIG_PKG_USING_REB is not set
+# CONFIG_PKG_USING_R_RHEALSTONE is not set
+
+#
+# peripheral libraries and drivers
+#
+
+#
+# sensors drivers
+#
+# CONFIG_PKG_USING_LSM6DSM is not set
+# CONFIG_PKG_USING_LSM6DSL is not set
+# CONFIG_PKG_USING_LPS22HB is not set
+# CONFIG_PKG_USING_HTS221 is not set
+# CONFIG_PKG_USING_LSM303AGR is not set
+# CONFIG_PKG_USING_BME280 is not set
+# CONFIG_PKG_USING_BME680 is not set
+# CONFIG_PKG_USING_BMA400 is not set
+# CONFIG_PKG_USING_BMI160_BMX160 is not set
+# CONFIG_PKG_USING_SPL0601 is not set
+# CONFIG_PKG_USING_MS5805 is not set
+# CONFIG_PKG_USING_DA270 is not set
+# CONFIG_PKG_USING_DF220 is not set
+# CONFIG_PKG_USING_HSHCAL001 is not set
+# CONFIG_PKG_USING_BH1750 is not set
+# CONFIG_PKG_USING_MPU6XXX is not set
+# CONFIG_PKG_USING_AHT10 is not set
+# CONFIG_PKG_USING_AP3216C is not set
+# CONFIG_PKG_USING_TSL4531 is not set
+# CONFIG_PKG_USING_DS18B20 is not set
+# CONFIG_PKG_USING_DHT11 is not set
+# CONFIG_PKG_USING_DHTXX is not set
+# CONFIG_PKG_USING_GY271 is not set
+# CONFIG_PKG_USING_GP2Y10 is not set
+# CONFIG_PKG_USING_SGP30 is not set
+# CONFIG_PKG_USING_HDC1000 is not set
+# CONFIG_PKG_USING_BMP180 is not set
+# CONFIG_PKG_USING_BMP280 is not set
+# CONFIG_PKG_USING_SHTC1 is not set
+# CONFIG_PKG_USING_BMI088 is not set
+# CONFIG_PKG_USING_HMC5883 is not set
+# CONFIG_PKG_USING_MAX6675 is not set
+# CONFIG_PKG_USING_TMP1075 is not set
+# CONFIG_PKG_USING_SR04 is not set
+# CONFIG_PKG_USING_CCS811 is not set
+# CONFIG_PKG_USING_PMSXX is not set
+# CONFIG_PKG_USING_RT3020 is not set
+# CONFIG_PKG_USING_MLX90632 is not set
+# CONFIG_PKG_USING_MLX90393 is not set
+# CONFIG_PKG_USING_MLX90392 is not set
+# CONFIG_PKG_USING_MLX90397 is not set
+# CONFIG_PKG_USING_MS5611 is not set
+# CONFIG_PKG_USING_MAX31865 is not set
+# CONFIG_PKG_USING_VL53L0X is not set
+# CONFIG_PKG_USING_INA260 is not set
+# CONFIG_PKG_USING_MAX30102 is not set
+# CONFIG_PKG_USING_INA226 is not set
+# CONFIG_PKG_USING_LIS2DH12 is not set
+# CONFIG_PKG_USING_HS300X is not set
+# CONFIG_PKG_USING_ZMOD4410 is not set
+# CONFIG_PKG_USING_ISL29035 is not set
+# CONFIG_PKG_USING_MMC3680KJ is not set
+# CONFIG_PKG_USING_QMP6989 is not set
+# CONFIG_PKG_USING_BALANCE is not set
+# CONFIG_PKG_USING_SHT2X is not set
+# CONFIG_PKG_USING_SHT3X is not set
+# CONFIG_PKG_USING_SHT4X is not set
+# CONFIG_PKG_USING_AD7746 is not set
+# CONFIG_PKG_USING_ADT74XX is not set
+# CONFIG_PKG_USING_MAX17048 is not set
+# CONFIG_PKG_USING_AS7341 is not set
+# CONFIG_PKG_USING_CW2015 is not set
+# CONFIG_PKG_USING_ICM20608 is not set
+# CONFIG_PKG_USING_PAJ7620 is not set
+# CONFIG_PKG_USING_STHS34PF80 is not set
+
+#
+# touch drivers
+#
+# CONFIG_PKG_USING_GT9147 is not set
+# CONFIG_PKG_USING_GT1151 is not set
+# CONFIG_PKG_USING_GT917S is not set
+# CONFIG_PKG_USING_GT911 is not set
+# CONFIG_PKG_USING_FT6206 is not set
+# CONFIG_PKG_USING_FT5426 is not set
+# CONFIG_PKG_USING_FT6236 is not set
+# CONFIG_PKG_USING_XPT2046_TOUCH is not set
+# CONFIG_PKG_USING_CST816X is not set
+# CONFIG_PKG_USING_REALTEK_AMEBA is not set
+# CONFIG_PKG_USING_STM32_SDIO is not set
+# CONFIG_PKG_USING_ESP_IDF is not set
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# CONFIG_PKG_USING_SX12XX is not set
+# CONFIG_PKG_USING_SIGNAL_LED is not set
+# CONFIG_PKG_USING_LEDBLINK is not set
+# CONFIG_PKG_USING_LITTLED is not set
+# CONFIG_PKG_USING_LKDGUI is not set
+# CONFIG_PKG_USING_NRF5X_SDK is not set
+# CONFIG_PKG_USING_NRFX is not set
+
+#
+# Kendryte SDK
+#
+# CONFIG_PKG_USING_K210_SDK is not set
+# CONFIG_PKG_USING_KENDRYTE_SDK is not set
+# CONFIG_PKG_USING_INFRARED is not set
+# CONFIG_PKG_USING_MULTI_INFRARED is not set
+# CONFIG_PKG_USING_AGILE_BUTTON is not set
+# CONFIG_PKG_USING_AGILE_LED is not set
+# CONFIG_PKG_USING_AT24CXX is not set
+# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set
+# CONFIG_PKG_USING_PCA9685 is not set
+# CONFIG_PKG_USING_ILI9341 is not set
+# CONFIG_PKG_USING_I2C_TOOLS is not set
+# CONFIG_PKG_USING_NRF24L01 is not set
+# CONFIG_PKG_USING_RPLIDAR is not set
+# CONFIG_PKG_USING_AS608 is not set
+# CONFIG_PKG_USING_RC522 is not set
+# CONFIG_PKG_USING_WS2812B is not set
+# CONFIG_PKG_USING_EMBARC_BSP is not set
+# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set
+# CONFIG_PKG_USING_MULTI_RTIMER is not set
+# CONFIG_PKG_USING_MAX7219 is not set
+# CONFIG_PKG_USING_BEEP is not set
+# CONFIG_PKG_USING_EASYBLINK is not set
+# CONFIG_PKG_USING_PMS_SERIES is not set
+# CONFIG_PKG_USING_CAN_YMODEM is not set
+# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set
+# CONFIG_PKG_USING_QLED is not set
+# CONFIG_PKG_USING_AGILE_CONSOLE is not set
+# CONFIG_PKG_USING_LD3320 is not set
+# CONFIG_PKG_USING_WK2124 is not set
+# CONFIG_PKG_USING_LY68L6400 is not set
+# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_SSD1306 is not set
+# CONFIG_PKG_USING_QKEY is not set
+# CONFIG_PKG_USING_RS485 is not set
+# CONFIG_PKG_USING_RS232 is not set
+# CONFIG_PKG_USING_NES is not set
+# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
+# CONFIG_PKG_USING_VDEVICE is not set
+# CONFIG_PKG_USING_SGM706 is not set
+# CONFIG_PKG_USING_STM32WB55_SDK is not set
+# CONFIG_PKG_USING_RDA58XX is not set
+# CONFIG_PKG_USING_LIBNFC is not set
+# CONFIG_PKG_USING_MFOC is not set
+# CONFIG_PKG_USING_TMC51XX is not set
+# CONFIG_PKG_USING_TCA9534 is not set
+# CONFIG_PKG_USING_KOBUKI is not set
+# CONFIG_PKG_USING_ROSSERIAL is not set
+# CONFIG_PKG_USING_MICRO_ROS is not set
+# CONFIG_PKG_USING_MCP23008 is not set
+# CONFIG_PKG_USING_BLUETRUM_SDK is not set
+# CONFIG_PKG_USING_MISAKA_AT24CXX is not set
+# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set
+# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set
+# CONFIG_PKG_USING_SOFT_SERIAL is not set
+# CONFIG_PKG_USING_MB85RS16 is not set
+# CONFIG_PKG_USING_RFM300 is not set
+# CONFIG_PKG_USING_IO_INPUT_FILTER is not set
+# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
+# CONFIG_PKG_USING_LRF_NV7LIDAR is not set
+# CONFIG_PKG_USING_AIP650 is not set
+# CONFIG_PKG_USING_FINGERPRINT is not set
+# CONFIG_PKG_USING_BT_ECB02C is not set
+# CONFIG_PKG_USING_UAT is not set
+# CONFIG_PKG_USING_ST7789 is not set
+# CONFIG_PKG_USING_VS1003 is not set
+# CONFIG_PKG_USING_X9555 is not set
+# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set
+# CONFIG_PKG_USING_BT_MX01 is not set
+# CONFIG_PKG_USING_SPI_TOOLS is not set
+
+#
+# AI packages
+#
+# CONFIG_PKG_USING_LIBANN is not set
+# CONFIG_PKG_USING_NNOM is not set
+# CONFIG_PKG_USING_ONNX_BACKEND is not set
+# CONFIG_PKG_USING_ONNX_PARSER is not set
+# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
+# CONFIG_PKG_USING_ELAPACK is not set
+# CONFIG_PKG_USING_ULAPACK is not set
+# CONFIG_PKG_USING_QUEST is not set
+# CONFIG_PKG_USING_NAXOS is not set
+# CONFIG_PKG_USING_R_TINYMAIX is not set
+
+#
+# Signal Processing and Control Algorithm Packages
+#
+# CONFIG_PKG_USING_FIRE_PID_CURVE is not set
+# CONFIG_PKG_USING_QPID is not set
+# CONFIG_PKG_USING_UKAL is not set
+# CONFIG_PKG_USING_DIGITALCTRL is not set
+# CONFIG_PKG_USING_KISSFFT is not set
+# CONFIG_PKG_USING_CMSIS_DSP is not set
+
+#
+# miscellaneous packages
+#
+
+#
+# project laboratory
+#
+
+#
+# samples: kernel and components samples
+#
+# CONFIG_PKG_USING_KERNEL_SAMPLES is not set
+# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
+# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
+# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
+
+#
+# entertainment: terminal games and other interesting software packages
+#
+# CONFIG_PKG_USING_CMATRIX is not set
+# CONFIG_PKG_USING_SL is not set
+# CONFIG_PKG_USING_CAL is not set
+# CONFIG_PKG_USING_ACLOCK is not set
+# CONFIG_PKG_USING_THREES is not set
+# CONFIG_PKG_USING_2048 is not set
+# CONFIG_PKG_USING_SNAKE is not set
+# CONFIG_PKG_USING_TETRIS is not set
+# CONFIG_PKG_USING_DONUT is not set
+# CONFIG_PKG_USING_COWSAY is not set
+# CONFIG_PKG_USING_MORSE is not set
+# CONFIG_PKG_USING_TINYSQUARE is not set
+# CONFIG_PKG_USING_LIBCSV is not set
+# CONFIG_PKG_USING_OPTPARSE is not set
+# CONFIG_PKG_USING_FASTLZ is not set
+# CONFIG_PKG_USING_MINILZO is not set
+# CONFIG_PKG_USING_QUICKLZ is not set
+# CONFIG_PKG_USING_LZMA is not set
+# CONFIG_PKG_USING_RALARAM is not set
+# CONFIG_PKG_USING_MULTIBUTTON is not set
+# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
+# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_ZLIB is not set
+# CONFIG_PKG_USING_MINIZIP is not set
+# CONFIG_PKG_USING_HEATSHRINK is not set
+# CONFIG_PKG_USING_DSTR is not set
+# CONFIG_PKG_USING_TINYFRAME is not set
+# CONFIG_PKG_USING_KENDRYTE_DEMO is not set
+# CONFIG_PKG_USING_UPACKER is not set
+# CONFIG_PKG_USING_UPARAM is not set
+# CONFIG_PKG_USING_HELLO is not set
+# CONFIG_PKG_USING_VI is not set
+# CONFIG_PKG_USING_KI is not set
+# CONFIG_PKG_USING_ARMv7M_DWT is not set
+# CONFIG_PKG_USING_CRCLIB is not set
+# CONFIG_PKG_USING_LWGPS is not set
+# CONFIG_PKG_USING_STATE_MACHINE is not set
+# CONFIG_PKG_USING_DESIGN_PATTERN is not set
+# CONFIG_PKG_USING_CONTROLLER is not set
+# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set
+# CONFIG_PKG_USING_MFBD is not set
+# CONFIG_PKG_USING_SLCAN2RTT is not set
+# CONFIG_PKG_USING_SOEM is not set
+# CONFIG_PKG_USING_QPARAM is not set
+# CONFIG_PKG_USING_CorevMCU_CLI is not set
+
+#
+# Arduino libraries
+#
+# CONFIG_PKG_USING_RTDUINO is not set
+
+#
+# Projects and Demos
+#
+# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set
+# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set
+# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set
+# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set
+# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set
+# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set
+
+#
+# Sensors
+#
+# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set
+# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set
+
+#
+# Display
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set
+# CONFIG_PKG_USING_ARDUINO_U8G2 is not set
+# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set
+# CONFIG_PKG_USING_SEEED_TM1637 is not set
+
+#
+# Timing
+#
+# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set
+# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set
+# CONFIG_PKG_USING_ARDUINO_TICKER is not set
+# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set
+
+#
+# Data Processing
+#
+# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set
+# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set
+# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set
+
+#
+# Data Storage
+#
+
+#
+# Communication
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set
+
+#
+# Device Control
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set
+
+#
+# Other
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set
+
+#
+# Signal IO
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set
+
+#
+# Uncategorized
+#
+CONFIG_SOC_FAMILY_HC32=y
+CONFIG_SOC_SERIES_HC32F4=y
+
+#
+# Hardware Drivers Config
+#
+CONFIG_SOC_HC32F448MC=y
+
+#
+# On-chip Drivers
+#
+CONFIG_BSP_USING_ON_CHIP_FLASH_CACHE=y
+CONFIG_BSP_USING_ON_CHIP_FLASH_ICODE_CACHE=y
+CONFIG_BSP_USING_ON_CHIP_FLASH_DCODE_CACHE=y
+CONFIG_BSP_USING_ON_CHIP_FLASH_ICODE_PREFETCH=y
+
+#
+# Onboard Peripheral Drivers
+#
+# CONFIG_BSP_USING_TCA9539 is not set
+# CONFIG_BSP_USING_SPI_FLASH is not set
+
+#
+# On-chip Peripheral Drivers
+#
+CONFIG_BSP_USING_GPIO=y
+CONFIG_BSP_USING_UART=y
+# CONFIG_BSP_USING_UART1 is not set
+CONFIG_BSP_USING_UART2=y
+CONFIG_BSP_UART2_RX_USING_DMA=y
+CONFIG_BSP_UART2_TX_USING_DMA=y
+# CONFIG_BSP_USING_UART3 is not set
+# CONFIG_BSP_USING_UART4 is not set
+# CONFIG_BSP_USING_UART5 is not set
+# CONFIG_BSP_USING_UART6 is not set
+# CONFIG_BSP_USING_I2C is not set
+# CONFIG_BSP_USING_ON_CHIP_FLASH is not set
+# CONFIG_BSP_USING_SPI is not set
+# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_DAC is not set
+# CONFIG_BSP_USING_CAN is not set
+# CONFIG_BSP_USING_WDT_TMR is not set
+# CONFIG_BSP_USING_RTC is not set
+# CONFIG_BSP_USING_PM is not set
+# CONFIG_BSP_USING_HWCRYPTO is not set
+# CONFIG_BSP_USING_PWM is not set
+# CONFIG_BSP_USING_QSPI is not set
+# CONFIG_BSP_USING_PULSE_ENCODER is not set
+# CONFIG_BSP_USING_HWTIMER is not set
+# CONFIG_BSP_USING_SENSOR is not set
+
+#
+# Board extended module Drivers
+#
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/.cproject b/bsp/hc32/ev_hc32f448_lqfp80/.cproject
new file mode 100644
index 0000000000..5cfcd3d9d9
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/.cproject
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/.gitignore b/bsp/hc32/ev_hc32f448_lqfp80/.gitignore
new file mode 100644
index 0000000000..7221bde019
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/.gitignore
@@ -0,0 +1,42 @@
+*.pyc
+*.map
+*.dblite
+*.elf
+*.bin
+*.hex
+*.axf
+*.exe
+*.pdb
+*.idb
+*.ilk
+*.old
+build
+Debug
+documentation/html
+packages/
+*~
+*.o
+*.obj
+*.out
+*.bak
+*.dep
+*.lib
+*.i
+*.d
+.DS_Stor*
+.config 3
+.config 4
+.config 5
+Midea-X1
+*.uimg
+GPATH
+GRTAGS
+GTAGS
+.vscode
+JLinkLog.txt
+JLinkSettings.ini
+DebugConfig/
+RTE/
+settings/
+*.uvguix*
+cconfig.h
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/.project b/bsp/hc32/ev_hc32f448_lqfp80/.project
new file mode 100644
index 0000000000..d8904aee72
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/.project
@@ -0,0 +1,68 @@
+
+
+ project
+
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
+
+ rt-thread
+ 2
+ virtual:/virtual
+
+
+ rt-thread/bsp
+ 2
+ virtual:/virtual
+
+
+ rt-thread/components
+ 2
+ $%7BPARENT-3-PROJECT_LOC%7D/components
+
+
+ rt-thread/include
+ 2
+ $%7BPARENT-3-PROJECT_LOC%7D/include
+
+
+ rt-thread/libcpu
+ 2
+ $%7BPARENT-3-PROJECT_LOC%7D/libcpu
+
+
+ rt-thread/src
+ 2
+ $%7BPARENT-3-PROJECT_LOC%7D/src
+
+
+ rt-thread/bsp/hc32
+ 2
+ virtual:/virtual
+
+
+ rt-thread/bsp/hc32/libraries
+ 2
+ $%7BPARENT-1-PROJECT_LOC%7D/libraries
+
+
+
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/Kconfig b/bsp/hc32/ev_hc32f448_lqfp80/Kconfig
new file mode 100644
index 0000000000..79b160b856
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/Kconfig
@@ -0,0 +1,21 @@
+mainmenu "RT-Thread Configuration"
+
+config BSP_DIR
+ string
+ option env="BSP_ROOT"
+ default "."
+
+config RTT_DIR
+ string
+ option env="RTT_ROOT"
+ default "../../.."
+
+config PKGS_DIR
+ string
+ option env="PKGS_ROOT"
+ default "packages"
+
+source "$RTT_DIR/Kconfig"
+source "$PKGS_DIR/Kconfig"
+source "../libraries/Kconfig"
+source "board/Kconfig"
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/README.md b/bsp/hc32/ev_hc32f448_lqfp80/README.md
new file mode 100644
index 0000000000..8fb4018734
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/README.md
@@ -0,0 +1,128 @@
+# XHSC EV_F448_LQ80_Rev1.0 开发板 BSP 说明
+
+## 简介
+
+本文档为小华半导体为 EV_F448_LQ80_Rev1.0 开发板提供的 BSP (板级支持包) 说明。
+
+主要内容如下:
+
+- 开发板资源介绍
+- BSP 快速上手
+- 进阶使用方法
+
+通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。
+
+## 开发板介绍
+
+EV_F448_LQ80_Rev1.0 是 XHSC 官方推出的开发板,搭载 HC32F448MCTI 芯片,基于 ARM Cortex-M4 内核,最高主频 200 MHz,具有丰富的板载资源,可以充分发挥 HC32F448MCTI 的芯片性能。
+
+开发板外观如下图所示:
+
+ 
+
+EV_F448_LQ80_Rev1.0 开发板常用 **板载资源** 如下:
+
+- **MCU**
+ - HC32F448MCTI
+ - 主频200MHz
+ - 256KB FLASH
+ - 68KB RAM
+- **外部Memory**
+ - BL24C256(EEPROM, 256Kbits)
+ - W25Q64(SPI NOR,64MB)
+ - IS62WV51216(SRAM, 1MB)
+- **常用外设**
+ - LED: 4 个,User LED(LED0,LED1,LED2,LED3)。
+ - 按键: 5 个,矩阵键盘(K1~K4), WAKEUP(K5),RESET(K0)
+- **常用接口**
+ - USB转串口
+ - CAN DB9接口 * 2
+ - TFT接口
+ - SmartCard接口
+ - I2C/USART/SPI接口
+- **调试接口**
+ - 板载DAP调试器
+ - 标准JTAG/SWD/Trace
+
+开发板更多详细信息请参考小华半导体半导体[EV_F448_LQ80_Rev1.0](https://www.xhsc.com.cn)
+
+## 外设支持
+
+本 BSP 目前对外设的支持情况如下:
+
+| **板载外设** | **支持情况** | **备注** |
+| :------------ | :-----------: | :-----------------------------------: |
+| USB 转串口 | 支持 | 使用 UART2 |
+| LED | 支持 | LED1~4 |
+
+| **片上外设** | **支持情况** | **备注** |
+| :------------ | :-----------: | :-----------------------------------: |
+| ADC | 支持 | ADC1: CH10, CH11,
ADC3: CH1 |
+| CAN | 支持 | CAN1、CAN2 |
+| GPIO | 支持 | PA0, PA1... PH2 ---> PIN: 0, 1...82 |
+| I2C | 支持 | 软件模拟
硬件I2C1~2
I2C1支持EEPROM(BL24C256) |
+| Hwtimer | 支持 | Hwtimer1~5 |
+| SPI | 支持 | SPI1~3
SPI1支持W25Q |
+| UART | 支持 | UART1~6
UART2为console使用 |
+
+
+## 使用说明
+
+使用说明分为如下两个章节:
+
+- 快速上手
+
+ 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。
+
+- 进阶使用
+
+ 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。
+
+
+### 快速上手
+
+本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。
+
+#### 硬件连接
+
+使用Type-A to MircoUSB线连接开发板和PC供电。
+
+#### 编译下载
+
+双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。
+
+> 工程默认配置使用板载 DAP 下载程序,点击下载按钮即可下载程序到开发板。
+
+#### 运行结果
+
+下载程序成功之后,系统会自动运行,观察开发板上LED的运行效果,绿色LED3会周期性闪烁。
+
+USB虚拟COM端口默认连接串口2,在终端工具里打开相应的串口,复位设备后,可以看到 RT-Thread 的输出信息:
+
+```
+ \ | /
+- RT - Thread Operating System
+ / | \ 5.0.1 build Feb 4 2024 16:44:26
+ 2006 - 2022 Copyright by RT-Thread team
+msh >
+```
+
+### 进阶使用
+
+此 BSP 默认只开启了 GPIO 和 串口 2 的功能,更多高级功能需要利用 env 工具对 BSP 进行配置,步骤如下:
+
+1. 在 bsp 下打开 env 工具。
+
+2. 输入`menuconfig`命令配置工程,配置好之后保存退出。
+
+3. 输入`pkgs --update`命令更新软件包。
+
+4. 输入`scons --target=mdk5/iar` 命令重新生成工程。
+
+## 注意事项
+无
+## 联系人信息
+
+维护人:
+
+- [小华半导体MCU](https://www.xhsc.com.cn),邮箱:
\ No newline at end of file
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/SConscript b/bsp/hc32/ev_hc32f448_lqfp80/SConscript
new file mode 100644
index 0000000000..20f7689c53
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/SConscript
@@ -0,0 +1,15 @@
+# for module compiling
+import os
+Import('RTT_ROOT')
+from building import *
+
+cwd = GetCurrentDir()
+objs = []
+list = os.listdir(cwd)
+
+for d in list:
+ path = os.path.join(cwd, d)
+ if os.path.isfile(os.path.join(path, 'SConscript')):
+ objs = objs + SConscript(os.path.join(d, 'SConscript'))
+
+Return('objs')
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/SConstruct b/bsp/hc32/ev_hc32f448_lqfp80/SConstruct
new file mode 100644
index 0000000000..ded3f4c66f
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/SConstruct
@@ -0,0 +1,62 @@
+import os
+import sys
+import rtconfig
+
+if os.getenv('RTT_ROOT'):
+ RTT_ROOT = os.getenv('RTT_ROOT')
+else:
+ RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
+
+sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+try:
+ from building import *
+except:
+ print('Cannot found RT-Thread root directory, please check RTT_ROOT')
+ print(RTT_ROOT)
+ exit(-1)
+
+TARGET = 'rtthread.' + rtconfig.TARGET_EXT
+
+DefaultEnvironment(tools=[])
+env = Environment(tools = ['mingw'],
+ AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+ CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+ AR = rtconfig.AR, ARFLAGS = '-rc',
+ CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
+ LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
+env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
+
+if rtconfig.PLATFORM in ['iccarm']:
+ env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+ env.Replace(ARFLAGS = [''])
+ env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')
+
+Export('RTT_ROOT')
+Export('rtconfig')
+
+SDK_ROOT = os.path.abspath('./')
+
+if os.path.exists(SDK_ROOT + '/libraries'):
+ libraries_path_prefix = SDK_ROOT + '/libraries'
+else:
+ libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries'
+
+SDK_LIB = libraries_path_prefix
+Export('SDK_LIB')
+
+# prepare building environment
+objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
+
+hc32_library = 'hc32f448_ddl'
+rtconfig.BSP_LIBRARY_TYPE = hc32_library
+
+# include libraries
+objs.extend(SConscript(os.path.join(libraries_path_prefix, hc32_library, 'SConscript')))
+
+# include drivers
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'hc32_drivers', 'SConscript')))
+
+objs.extend(SConscript(os.path.join(os.getcwd(), 'board', 'ports', 'SConscript')))
+
+# make a building
+DoBuilding(TARGET, objs)
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/applications/SConscript b/bsp/hc32/ev_hc32f448_lqfp80/applications/SConscript
new file mode 100644
index 0000000000..9bb9abae89
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/applications/SConscript
@@ -0,0 +1,15 @@
+from building import *
+import os
+
+cwd = GetCurrentDir()
+src = Glob('*.c')
+CPPPATH = [cwd]
+
+group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
+
+list = os.listdir(cwd)
+for item in list:
+ if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
+ group = group + SConscript(os.path.join(item, 'SConscript'))
+
+Return('group')
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/applications/main.c b/bsp/hc32/ev_hc32f448_lqfp80/applications/main.c
new file mode 100644
index 0000000000..07080dcd0d
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/applications/main.c
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2006-2024, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#include
+#include
+#include
+
+/* defined the LED_GREEN pin: PA2 */
+#define LED_GREEN_PIN GET_PIN(A, 2)
+
+int main(void)
+{
+ /* set LED_GREEN_PIN pin mode to output */
+ rt_pin_mode(LED_GREEN_PIN, PIN_MODE_OUTPUT);
+
+ while (1)
+ {
+ rt_pin_write(LED_GREEN_PIN, PIN_HIGH);
+ rt_thread_mdelay(500);
+ rt_pin_write(LED_GREEN_PIN, PIN_LOW);
+ rt_thread_mdelay(500);
+ }
+}
+
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/applications/xtal32_fcm.c b/bsp/hc32/ev_hc32f448_lqfp80/applications/xtal32_fcm.c
new file mode 100644
index 0000000000..0e35671323
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/applications/xtal32_fcm.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+/*******************************************************************************
+ * Include files
+ ******************************************************************************/
+
+#include
+#include
+#include
+
+#if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM)
+
+#define XTAL32_FCM_THREAD_STACK_SIZE (1024)
+
+/**
+ * @brief This thread is used to monitor whether XTAL32 is stable.
+ * This thread only runs once after the system starts.
+ * When stability is detected or 2s times out, the thread will end.
+ * (When a timeout occurs it will be prompted via rt_kprintf)
+ */
+void xtal32_fcm_thread_entry(void *parameter)
+{
+ stc_fcm_init_t stcFcmInit;
+ uint32_t u32TimeOut = 0UL;
+ uint32_t u32Time = 200UL; /* 200*10ms = 2s */
+
+ /* FCM config */
+ FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_FCM, ENABLE);
+ (void)FCM_StructInit(&stcFcmInit);
+ stcFcmInit.u32RefClock = FCM_REF_CLK_MRC;
+ stcFcmInit.u32RefClockDiv = FCM_REF_CLK_DIV8192; /* ~1ms cycle */
+ stcFcmInit.u32RefClockEdge = FCM_REF_CLK_RISING;
+ stcFcmInit.u32TargetClock = FCM_TARGET_CLK_XTAL32;
+ stcFcmInit.u32TargetClockDiv = FCM_TARGET_CLK_DIV1;
+ stcFcmInit.u16LowerLimit = (uint16_t)((XTAL32_VALUE / (MRC_VALUE / 8192U)) * 96UL / 100UL);
+ stcFcmInit.u16UpperLimit = (uint16_t)((XTAL32_VALUE / (MRC_VALUE / 8192U)) * 104UL / 100UL);
+ (void)FCM_Init(&stcFcmInit);
+ /* Enable FCM, to ensure xtal32 stable */
+ FCM_Cmd(ENABLE);
+
+ while (1)
+ {
+ if (SET == FCM_GetStatus(FCM_FLAG_END))
+ {
+ FCM_ClearStatus(FCM_FLAG_END);
+ if ((SET == FCM_GetStatus(FCM_FLAG_ERR)) || (SET == FCM_GetStatus(FCM_FLAG_OVF)))
+ {
+ FCM_ClearStatus(FCM_FLAG_ERR | FCM_FLAG_OVF);
+ }
+ else
+ {
+ (void)FCM_DeInit();
+ FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_FCM, DISABLE);
+ /* XTAL32 stabled */
+ break;
+ }
+ }
+ u32TimeOut++;
+ if (u32TimeOut > u32Time)
+ {
+ (void)FCM_DeInit();
+ FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_FCM, DISABLE);
+ rt_kprintf("Error: XTAL32 still unstable, timeout.\n");
+ break;
+ }
+ rt_thread_mdelay(10);
+ }
+}
+
+int xtal32_fcm_thread_create(void)
+{
+ rt_thread_t tid;
+
+ tid = rt_thread_create("xtal32_fcm", xtal32_fcm_thread_entry, RT_NULL,
+ XTAL32_FCM_THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX - 2, 10);
+ if (tid != RT_NULL)
+ {
+ rt_thread_startup(tid);
+ }
+ else
+ {
+ rt_kprintf("create xtal32_fcm thread err!");
+ }
+ return RT_EOK;
+}
+INIT_APP_EXPORT(xtal32_fcm_thread_create);
+
+#endif
+
+
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig b/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig
new file mode 100644
index 0000000000..5af9b90959
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig
@@ -0,0 +1,652 @@
+menu "Hardware Drivers Config"
+
+config SOC_HC32F448MC
+ bool
+ select SOC_SERIES_HC32F4
+ select RT_USING_COMPONENTS_INIT
+ select RT_USING_USER_MAIN
+ default y
+
+menu "On-chip Drivers"
+ menuconfig BSP_USING_ON_CHIP_FLASH_CACHE
+ bool "Enable on-chip Flash Cache"
+ default y
+ if BSP_USING_ON_CHIP_FLASH_CACHE
+ config BSP_USING_ON_CHIP_FLASH_ICODE_CACHE
+ bool "Enable on-chip Flash ICODE Cache"
+ default y
+ config BSP_USING_ON_CHIP_FLASH_DCODE_CACHE
+ bool "Enable on-chip Flash DCODE Cache"
+ default y
+ config BSP_USING_ON_CHIP_FLASH_ICODE_PREFETCH
+ bool "Enable on-chip Flash ICODE Prefetch"
+ default y
+ endif
+endmenu
+
+menu "Onboard Peripheral Drivers"
+ config BSP_USING_TCA9539
+ bool "Enable TCA9539"
+ select BSP_USING_I2C
+ select BSP_USING_I2C1
+ default n
+
+ config BSP_USING_SPI_FLASH
+ bool "Enable SPI FLASH (w25q64 spi1)"
+ select BSP_USING_SPI
+ select BSP_USING_SPI1
+ select BSP_USING_ON_CHIP_FLASH
+ select RT_USING_SFUD
+ select RT_USING_DFS
+ select RT_USING_FAL
+ select RT_USING_MTD_NOR
+ default n
+
+endmenu
+
+menu "On-chip Peripheral Drivers"
+ config BSP_USING_GPIO
+ bool "Enable GPIO"
+ select RT_USING_PIN
+ default y
+
+ menuconfig BSP_USING_UART
+ bool "Enable UART"
+ default y
+ select RT_USING_SERIAL
+ if BSP_USING_UART
+ menuconfig BSP_USING_UART1
+ bool "Enable UART1"
+ default y
+ if BSP_USING_UART1
+ config BSP_UART1_RX_USING_DMA
+ bool "Enable UART1 RX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_UART1_TX_USING_DMA
+ bool "Enable UART1 TX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_UART1_RX_BUFSIZE
+ int "Set UART1 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+
+ config BSP_UART1_TX_BUFSIZE
+ int "Set UART1 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+ endif
+
+ menuconfig BSP_USING_UART2
+ bool "Enable UART2"
+ default n
+ if BSP_USING_UART2
+ config BSP_UART2_RX_USING_DMA
+ bool "Enable UART2 RX DMA"
+ depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_UART2_TX_USING_DMA
+ bool "Enable UART2 TX DMA"
+ depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_UART2_RX_BUFSIZE
+ int "Set UART2 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+
+ config BSP_UART2_TX_BUFSIZE
+ int "Set UART2 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ endif
+
+ menuconfig BSP_USING_UART3
+ bool "Enable UART3"
+ default n
+ if BSP_USING_UART3
+ config BSP_UART3_RX_BUFSIZE
+ int "Set UART3 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+
+ config BSP_UART3_TX_BUFSIZE
+ int "Set UART3 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ endif
+
+ menuconfig BSP_USING_UART4
+ bool "Enable UART4"
+ default n
+ if BSP_USING_UART4
+ config BSP_UART4_RX_USING_DMA
+ bool "Enable UART4 RX DMA"
+ depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_UART4_TX_USING_DMA
+ bool "Enable UART4 TX DMA"
+ depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_UART4_RX_BUFSIZE
+ int "Set UART4 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+
+ config BSP_UART4_TX_BUFSIZE
+ int "Set UART4 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+ endif
+
+ menuconfig BSP_USING_UART5
+ bool "Enable UART5"
+ default n
+ if BSP_USING_UART5
+ config BSP_UART5_RX_USING_DMA
+ bool "Enable UART5 RX DMA"
+ depends on BSP_USING_UART5 && RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_UART5_TX_USING_DMA
+ bool "Enable UART5 TX DMA"
+ depends on BSP_USING_UART5 && RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_UART5_RX_BUFSIZE
+ int "Set UART5 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+
+ config BSP_UART5_TX_BUFSIZE
+ int "Set UART5 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+ endif
+
+ menuconfig BSP_USING_UART6
+ bool "Enable UART6"
+ default n
+ if BSP_USING_UART6
+ config BSP_UART6_RX_BUFSIZE
+ int "Set UART6 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 256
+
+ config BSP_UART6_TX_BUFSIZE
+ int "Set UART6 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ endif
+ endif
+
+ menuconfig BSP_USING_I2C
+ bool "Enable I2C BUS"
+ default n
+ select RT_USING_I2C
+
+ if BSP_USING_I2C
+ menuconfig BSP_USING_I2C1_SW
+ bool "Enable I2C1 BUS (software simulation)"
+ default n
+ select RT_USING_I2C_BITOPS
+ select RT_USING_PIN
+ if BSP_USING_I2C1_SW
+ config BSP_I2C1_SCL_PIN
+ int "i2c1 scl pin number"
+ range 1 176
+ default 51
+ config BSP_I2C1_SDA_PIN
+ int "I2C1 sda pin number"
+ range 1 176
+ default 90
+ endif
+ endif
+
+ if BSP_USING_I2C
+ config BSP_I2C_USING_DMA
+ bool
+ default n
+ config BSP_USING_I2C_HW
+ bool
+ default n
+
+ menuconfig BSP_USING_I2C1
+ bool "Enable I2C1 BUS"
+ default n
+ select BSP_USING_I2C_HW
+ if BSP_USING_I2C1
+ config BSP_I2C1_USING_DMA
+ bool
+ default n
+ config BSP_I2C1_TX_USING_DMA
+ bool "Enable I2C1 TX DMA"
+ default n
+ select BSP_I2C_USING_DMA
+ select BSP_I2C1_USING_DMA
+ config BSP_I2C1_RX_USING_DMA
+ bool "Enable I2C1 RX DMA"
+ default n
+ select BSP_I2C_USING_DMA
+ select BSP_I2C1_USING_DMA
+ endif
+
+ menuconfig BSP_USING_I2C2
+ bool "Enable I2C2 BUS"
+ default n
+ select BSP_USING_I2C_HW
+ if BSP_USING_I2C2
+ config BSP_I2C2_USING_DMA
+ bool
+ default n
+ config BSP_I2C2_TX_USING_DMA
+ bool "Enable I2C2 TX DMA"
+ default n
+ select BSP_I2C_USING_DMA
+ select BSP_I2C2_USING_DMA
+ config BSP_I2C2_RX_USING_DMA
+ bool "Enable I2C2 RX DMA"
+ default n
+ select BSP_I2C_USING_DMA
+ select BSP_I2C2_USING_DMA
+ endif
+ endif
+
+ config BSP_USING_ON_CHIP_FLASH
+ bool "Enable on-chip FLASH"
+ default n
+
+ menuconfig BSP_USING_SPI
+ bool "Enable SPI BUS"
+ default n
+ select RT_USING_SPI
+ if BSP_USING_SPI
+ config BSP_SPI_USING_DMA
+ bool
+ default n
+
+ menuconfig BSP_USING_SPI1
+ bool "Enable SPI1 BUS"
+ default n
+ if BSP_USING_SPI1
+ config BSP_SPI1_TX_USING_DMA
+ bool "Enable SPI1 TX DMA"
+ select BSP_SPI_USING_DMA
+ default n
+ config BSP_SPI1_RX_USING_DMA
+ bool "Enable SPI1 RX DMA"
+ select BSP_SPI_USING_DMA
+ select BSP_SPI1_TX_USING_DMA
+ default n
+ endif
+
+ menuconfig BSP_USING_SPI2
+ bool "Enable SPI2 BUS"
+ default n
+ if BSP_USING_SPI2
+ config BSP_SPI2_TX_USING_DMA
+ bool "Enable SPI2 TX DMA"
+ select BSP_SPI_USING_DMA
+ default n
+ config BSP_SPI2_RX_USING_DMA
+ bool "Enable SPI2 RX DMA"
+ select BSP_SPI_USING_DMA
+ select BSP_SPI2_TX_USING_DMA
+ default n
+ endif
+
+ menuconfig BSP_USING_SPI3
+ bool "Enable SPI3 BUS"
+ default n
+ if BSP_USING_SPI3
+ config BSP_SPI3_TX_USING_DMA
+ bool "Enable SPI3 TX DMA"
+ select BSP_SPI_USING_DMA
+ default n
+ config BSP_SPI3_RX_USING_DMA
+ bool "Enable SPI3 RX DMA"
+ select BSP_SPI_USING_DMA
+ select BSP_SPI3_TX_USING_DMA
+ default n
+ endif
+ endif
+
+ menuconfig BSP_USING_ADC
+ bool "Enable ADC"
+ default n
+ select RT_USING_ADC
+ if BSP_USING_ADC
+ menuconfig BSP_USING_ADC1
+ bool "Enable ADC1"
+ default n
+ if BSP_USING_ADC1
+ config BSP_ADC1_USING_DMA
+ bool "using adc1 dma"
+ default n
+ endif
+ menuconfig BSP_USING_ADC2
+ bool "Enable ADC2"
+ default n
+ if BSP_USING_ADC2
+ config BSP_ADC2_USING_DMA
+ bool "using adc2 dma"
+ default n
+ endif
+ menuconfig BSP_USING_ADC3
+ bool "Enable ADC3"
+ default n
+ if BSP_USING_ADC3
+ config BSP_ADC3_USING_DMA
+ bool "using adc3 dma"
+ default n
+ endif
+ endif
+
+ menuconfig BSP_USING_DAC
+ bool "Enable DAC"
+ default n
+ select RT_USING_DAC
+ if BSP_USING_DAC
+ config BSP_USING_DAC1
+ bool "using dac1"
+ default n
+ config BSP_USING_DAC2
+ bool "using dac2"
+ default n
+ endif
+
+ menuconfig BSP_USING_CAN
+ bool "Enable CAN"
+ default n
+ select RT_USING_CAN
+ select RT_CAN_USING_HDR
+ select BSP_USING_TCA9539
+ if BSP_USING_CAN
+ config BSP_USING_CAN1
+ bool "using can1"
+ default n
+ config BSP_USING_CAN2
+ bool "using can2"
+ default n
+ endif
+
+ menuconfig BSP_USING_WDT_TMR
+ bool "Enable Watchdog Timer"
+ default n
+ select RT_USING_WDT
+ if BSP_USING_WDT_TMR
+ choice
+ prompt "Select SWDT/WDT"
+ default BSP_USING_SWDT
+
+ config BSP_USING_SWDT
+ bool "SWDT(3.72hour(max))"
+ config BSP_USING_WDT
+ bool "WDT(10.7s(max))"
+ endchoice
+
+ config BSP_WDT_CONTINUE_COUNT
+ bool "Low Power Mode Keeps Counting"
+ default n
+ endif
+
+ menuconfig BSP_USING_RTC
+ bool "Enable RTC"
+ select RT_USING_RTC
+ default n
+ if BSP_USING_RTC
+ choice
+ prompt "Select clock source"
+ default BSP_RTC_USING_XTAL32
+
+ config BSP_RTC_USING_XTAL32
+ bool "RTC USING XTAL32"
+
+ config BSP_RTC_USING_LRC
+ bool "RTC USING LRC"
+ endchoice
+ endif
+
+ menuconfig BSP_USING_PM
+ bool "Enable PM"
+ default n
+ select RT_USING_PM
+ if BSP_USING_PM
+ choice
+ prompt "Select WKTM Clock Src"
+ default BSP_USING_WKTM_LRC
+
+ config BSP_USING_WKTM_XTAL32
+ bool "Using Xtal32"
+ config BSP_USING_WKTM_LRC
+ bool "Using LRC"
+ if BSP_RTC_USING_XTAL32
+ config BSP_USING_WKTM_64HZ
+ bool "Using 64HZ(Note:must use XTAL32 and run RTC)"
+ endif
+ endchoice
+ endif
+
+ menuconfig BSP_USING_HWCRYPTO
+ bool "Using Hardware Crypto drivers"
+ default n
+ select RT_USING_HWCRYPTO
+ if BSP_USING_HWCRYPTO
+ config BSP_USING_UQID
+ bool "Enable UQID (unique id)"
+ default n
+
+ config BSP_USING_RNG
+ bool "Using Hardware RNG"
+ default n
+ select RT_HWCRYPTO_USING_RNG
+
+ config BSP_USING_CRC
+ bool "Using Hardware CRC"
+ default n
+ select RT_HWCRYPTO_USING_CRC
+
+ config BSP_USING_AES
+ bool "Using Hardware AES"
+ default n
+ select RT_HWCRYPTO_USING_AES
+ if BSP_USING_AES
+ choice
+ prompt "Select AES Mode"
+ default BSP_USING_AES_ECB
+
+ config BSP_USING_AES_ECB
+ bool "ECB mode"
+ select RT_HWCRYPTO_USING_AES_ECB
+ endchoice
+ endif
+
+ config BSP_USING_HASH
+ bool "Using Hardware Hash"
+ default n
+ select RT_HWCRYPTO_USING_SHA2
+ if BSP_USING_HASH
+ choice
+ prompt "Select Hash Mode"
+ default BSP_USING_SHA2_256
+
+ config BSP_USING_SHA2_256
+ bool "SHA2_256 Mode"
+ select RT_HWCRYPTO_USING_SHA2_256
+ endchoice
+ endif
+
+ endif
+
+ menuconfig BSP_USING_PWM
+ bool "Enable output PWM"
+ default n
+ select RT_USING_PWM
+ if BSP_USING_PWM
+ menuconfig BSP_USING_PWM_TMRA
+ bool "Enable timerA output PWM"
+ default n
+ if BSP_USING_PWM_TMRA
+ menuconfig BSP_USING_PWM_TMRA_1
+ bool "Enable timerA-1 output PWM"
+ default n
+ if BSP_USING_PWM_TMRA_1
+ config BSP_USING_PWM_TMRA_1_CH1
+ bool "Enable timerA-1 channel1"
+ default n
+ config BSP_USING_PWM_TMRA_1_CH2
+ bool "Enable timerA-1 channel2"
+ default n
+ endif
+ menuconfig BSP_USING_PWM_TMRA_2
+ bool "Enable timerA-2 output PWM"
+ default n
+ if BSP_USING_PWM_TMRA_2
+ config BSP_USING_PWM_TMRA_2_CH1
+ bool "Enable timerA-2 channel1"
+ default n
+ config BSP_USING_PWM_TMRA_2_CH2
+ bool "Enable timerA-2 channel2"
+ default n
+ endif
+ endif
+ menuconfig BSP_USING_PWM_TMR4
+ bool "Enable timer4 output PWM"
+ default n
+ if BSP_USING_PWM_TMR4
+ menuconfig BSP_USING_PWM_TMR4_1
+ bool "Enable timer4-1 output PWM"
+ default n
+ if BSP_USING_PWM_TMR4_1
+ config BSP_USING_PWM_TMR4_1_OUH
+ bool "Enable TMR4_1_OUH channel0"
+ default n
+ config BSP_USING_PWM_TMR4_1_OUL
+ bool "Enable TMR4_1_OUL channel1"
+ default n
+ config BSP_USING_PWM_TMR4_1_OVH
+ bool "Enable TMR4_1_OVH channel2"
+ default n
+ config BSP_USING_PWM_TMR4_1_OVL
+ bool "Enable TMR4_1_OVL channel3"
+ default n
+ config BSP_USING_PWM_TMR4_1_OWH
+ bool "Enable TMR4_1_OWH channel4"
+ default n
+ config BSP_USING_PWM_TMR4_1_OWL
+ bool "Enable TMR4_1_OWL channel5"
+ default n
+ endif
+ endif
+ menuconfig BSP_USING_PWM_TMR6
+ bool "Enable timer6 output PWM"
+ default n
+ if BSP_USING_PWM_TMR6
+ menuconfig BSP_USING_PWM_TMR6_1
+ bool "Enable timer6-1 output PWM"
+ default n
+ if BSP_USING_PWM_TMR6_1
+ config BSP_USING_PWM_TMR6_1_A
+ bool "Enable TMR6_1_A channel0"
+ default n
+ config BSP_USING_PWM_TMR6_1_B
+ bool "Enable TMR6_1_B channel1"
+ default n
+ endif
+ endif
+ endif
+
+ menuconfig BSP_USING_QSPI
+ bool "Enable QSPI BUS"
+ select RT_USING_QSPI
+ select RT_USING_SPI
+ default n
+ if BSP_USING_QSPI
+ config BSP_QSPI_USING_DMA
+ bool "Enable QSPI DMA support"
+ default n
+ config BSP_QSPI_USING_SOFT_CS
+ bool "Enable QSPI Soft CS Pin"
+ default n
+ endif
+
+ menuconfig BSP_USING_PULSE_ENCODER
+ bool "Enable Pulse Encoder"
+ default n
+ select RT_USING_PULSE_ENCODER
+ if BSP_USING_PULSE_ENCODER
+ menuconfig BSP_USING_TMRA_PULSE_ENCODER
+ bool "Use TIMERA As The Pulse Encoder"
+ default n
+ if BSP_USING_TMRA_PULSE_ENCODER
+ config BSP_USING_PULSE_ENCODER_TMRA_1
+ bool "Use TIMERA_1 As The Pulse Encoder"
+ default n
+ endif
+ menuconfig BSP_USING_TMR6_PULSE_ENCODER
+ bool "Use TIMER6 As The Pulse Encoder"
+ default n
+ if BSP_USING_TMR6_PULSE_ENCODER
+ config BSP_USING_PULSE_ENCODER_TMR6_1
+ bool "Use TIMER6_1 As The Pulse Encoder"
+ default n
+ endif
+ endif
+
+ menuconfig BSP_USING_HWTIMER
+ bool "Enable Hw Timer"
+ default n
+ select RT_USING_HWTIMER
+ if BSP_USING_HWTIMER
+ config BSP_USING_TMRA_1
+ bool "Use Timer_a1 As The Hw Timer"
+ default n
+ config BSP_USING_TMRA_2
+ bool "Use Timer_a2 As The Hw Timer"
+ default n
+ config BSP_USING_TMRA_3
+ bool "Use Timer_a3 As The Hw Timer"
+ default n
+ config BSP_USING_TMRA_4
+ bool "Use Timer_a4 As The Hw Timer"
+ default n
+ config BSP_USING_TMRA_5
+ bool "Use Timer_a5 As The Hw Timer"
+ default n
+ endif
+
+ menuconfig BSP_USING_SENSOR
+ bool "Enable SENSOR"
+ default n
+ select RT_USING_HWTIMER
+ if BSP_USING_SENSOR
+ config BSP_USING_TMR0_2B
+ bool "Use KEYSCAN"
+ select RT_USING_KEYSCAN
+ default n
+ endif
+endmenu
+
+menu "Board extended module Drivers"
+
+endmenu
+
+endmenu
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/SConscript b/bsp/hc32/ev_hc32f448_lqfp80/board/SConscript
new file mode 100644
index 0000000000..2062a20a60
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/SConscript
@@ -0,0 +1,37 @@
+import os
+import rtconfig
+from building import *
+
+Import('SDK_LIB')
+
+cwd = GetCurrentDir()
+
+# add general drivers
+src = Split('''
+board.c
+board_config.c
+''')
+
+if GetDepend(['BSP_USING_TCA9539']):
+ src += Glob('ports/tca9539.c')
+
+if GetDepend(['BSP_USING_SPI_FLASH']):
+ src += Glob('ports/drv_spi_flash.c')
+
+path = [cwd]
+path += [cwd + '/ports']
+path += [cwd + '/config']
+
+startup_path_prefix = SDK_LIB
+
+if rtconfig.PLATFORM in ['gcc']:
+ src += [startup_path_prefix + '/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f448.S']
+elif rtconfig.PLATFORM in ['armcc', 'armclang']:
+ src += [startup_path_prefix + '/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f448.s']
+elif rtconfig.PLATFORM in ['iccarm']:
+ src += [startup_path_prefix + '/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f448.s']
+
+CPPDEFINES = ['HC32F448', '__DEBUG']
+group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)
+
+Return('group')
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board.c b/bsp/hc32/ev_hc32f448_lqfp80/board/board.c
new file mode 100644
index 0000000000..13dd21c597
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#include "board.h"
+#include "board_config.h"
+
+/* unlock/lock peripheral */
+#define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \
+ LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM)
+#define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM)
+
+/** System Base Configuration
+*/
+void SystemBase_Config(void)
+{
+#if defined(BSP_USING_ON_CHIP_FLASH_ICODE_CACHE)
+ EFM_ICacheCmd(ENABLE);
+#endif
+#if defined(BSP_USING_ON_CHIP_FLASH_DCODE_CACHE)
+ EFM_DCacheCmd(ENABLE);
+#endif
+#if defined(BSP_USING_ON_CHIP_FLASH_ICODE_PREFETCH)
+ EFM_PrefetchCmd(ENABLE);
+#endif
+}
+
+/** System Clock Configuration
+*/
+void SystemClock_Config(void)
+{
+ stc_clock_xtal_init_t stcXtalInit;
+ stc_clock_pll_init_t stcPLLHInit;
+#if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM)
+ stc_clock_xtal32_init_t stcXtal32Init;
+#endif
+
+ /* PCLK0, HCLK Max 200MHz */
+ /* PCLK1, PCLK4 Max 100MHz */
+ /* PCLK2, EXCLK Max 60MHz */
+ /* PCLK3 Max 50MHz */
+ CLK_SetClockDiv(CLK_BUS_CLK_ALL,
+ (CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | CLK_PCLK2_DIV4 |
+ CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2 | CLK_EXCLK_DIV4 |
+ CLK_HCLK_DIV1));
+
+ GPIO_AnalogCmd(XTAL_PORT, XTAL_IN_PIN | XTAL_OUT_PIN, ENABLE);
+ (void)CLK_XtalStructInit(&stcXtalInit);
+ /* Config Xtal and enable Xtal */
+ stcXtalInit.u8Mode = CLK_XTAL_MD_OSC;
+ stcXtalInit.u8Drv = CLK_XTAL_DRV_ULOW;
+ stcXtalInit.u8State = CLK_XTAL_ON;
+ stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS;
+ (void)CLK_XtalInit(&stcXtalInit);
+
+ (void)CLK_PLLStructInit(&stcPLLHInit);
+ /* VCO = (8/1)*100 = 800MHz*/
+ stcPLLHInit.u8PLLState = CLK_PLL_ON;
+ stcPLLHInit.PLLCFGR = 0UL;
+ stcPLLHInit.PLLCFGR_f.PLLM = 1UL - 1UL;
+ stcPLLHInit.PLLCFGR_f.PLLN = 100UL - 1UL;
+ stcPLLHInit.PLLCFGR_f.PLLP = 4UL - 1UL;
+ stcPLLHInit.PLLCFGR_f.PLLQ = 4UL - 1UL;
+ stcPLLHInit.PLLCFGR_f.PLLR = 4UL - 1UL;
+ stcPLLHInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL;
+ (void)CLK_PLLInit(&stcPLLHInit);
+
+ /* 3 cycles for 150 ~ 200MHz */
+ (void)EFM_SetWaitCycle(EFM_WAIT_CYCLE3);
+ /* 3 cycles for 150 ~ 200MHz */
+ GPIO_SetReadWaitCycle(GPIO_RD_WAIT3);
+ CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
+
+#if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM)
+ /* Xtal32 config */
+ GPIO_AnalogCmd(XTAL32_PORT, XTAL32_IN_PIN | XTAL32_OUT_PIN, ENABLE);
+ (void)CLK_Xtal32StructInit(&stcXtal32Init);
+ stcXtal32Init.u8State = CLK_XTAL32_ON;
+ stcXtal32Init.u8Drv = CLK_XTAL32_DRV_HIGH;
+ stcXtal32Init.u8Filter = CLK_XTAL32_FILTER_RUN_MD;
+ (void)CLK_Xtal32Init(&stcXtal32Init);
+#endif
+}
+
+/** Peripheral Clock Configuration
+*/
+void PeripheralClock_Config(void)
+{
+#if defined(BSP_USING_CAN1)
+ CLK_SetCANClockSrc(CLK_CAN1, CLK_CANCLK_SYSCLK_DIV6);
+#endif
+#if defined(BSP_USING_CAN2)
+ CLK_SetCANClockSrc(CLK_CAN2, CLK_CANCLK_SYSCLK_DIV6);
+#endif
+
+#if defined(RT_USING_ADC)
+ CLK_SetPeriClockSrc(CLK_PERIPHCLK_PCLK);
+#endif
+}
+
+/** Peripheral Registers Unlock
+*/
+void PeripheralRegister_Unlock(void)
+{
+ LL_PERIPH_WE(EXAMPLE_PERIPH_WE);
+}
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board.h b/bsp/hc32/ev_hc32f448_lqfp80/board/board.h
new file mode 100644
index 0000000000..19ac6e3525
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __BOARD_H__
+#define __BOARD_H__
+
+#include
+#include "hc32_ll.h"
+#include "drv_gpio.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define HC32_FLASH_SIZE_GRANULARITY (8 * 1024)
+#define HC32_FLASH_SIZE (256 * 1024)
+#define HC32_FLASH_START_ADDRESS (0)
+#define HC32_FLASH_END_ADDRESS (HC32_FLASH_START_ADDRESS + HC32_FLASH_SIZE)
+
+#define HC32_SRAM_SIZE (64)
+#define HC32_SRAM_END (0x1FFF8000 + HC32_SRAM_SIZE * 1024)
+
+#ifdef __ARMCC_VERSION
+extern int Image$$RW_IRAM2$$ZI$$Limit;
+#define HEAP_BEGIN (&Image$$RW_IRAM2$$ZI$$Limit)
+#elif __ICCARM__
+#pragma section="HEAP"
+#define HEAP_BEGIN (__segment_end("HEAP"))
+#else
+extern int __bss_end;
+#define HEAP_BEGIN (&__bss_end)
+#endif
+
+#define HEAP_END HC32_SRAM_END
+
+void PeripheralRegister_Unlock(void);
+void PeripheralClock_Config(void);
+void SystemBase_Config(void);
+void SystemClock_Config(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c
new file mode 100644
index 0000000000..486db6c828
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c
@@ -0,0 +1,497 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#include
+#include "board_config.h"
+#include "tca9539.h"
+
+/**
+ * The below functions will initialize HC32 board.
+ */
+
+#if defined RT_USING_SERIAL
+rt_err_t rt_hw_board_uart_init(CM_USART_TypeDef *USARTx)
+{
+ rt_err_t result = RT_EOK;
+
+ switch ((rt_uint32_t)USARTx)
+ {
+#if defined(BSP_USING_UART1)
+ case (rt_uint32_t)CM_USART1:
+ /* Configure USART RX/TX pin. */
+ GPIO_SetFunc(USART1_RX_PORT, USART1_RX_PIN, USART1_RX_FUNC);
+ GPIO_SetFunc(USART1_TX_PORT, USART1_TX_PIN, USART1_TX_FUNC);
+ break;
+#endif
+#if defined(BSP_USING_UART2)
+ case (rt_uint32_t)CM_USART2:
+ /* Configure USART RX/TX pin. */
+ GPIO_SetFunc(USART2_RX_PORT, USART2_RX_PIN, USART2_RX_FUNC);
+ GPIO_SetFunc(USART2_TX_PORT, USART2_TX_PIN, USART2_TX_FUNC);
+ break;
+#endif
+#if defined(BSP_USING_UART6)
+ case (rt_uint32_t)CM_USART6:
+ /* Configure USART RX/TX pin. */
+ GPIO_SetFunc(USART6_RX_PORT, USART6_RX_PIN, USART6_RX_FUNC);
+ GPIO_SetFunc(USART6_TX_PORT, USART6_TX_PIN, USART6_TX_FUNC);
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+
+ return result;
+}
+#endif
+
+#if defined(RT_USING_I2C)
+rt_err_t rt_hw_board_i2c_init(CM_I2C_TypeDef *I2Cx)
+{
+ rt_err_t result = RT_EOK;
+ stc_gpio_init_t stcGpioInit;
+ (void)GPIO_StructInit(&stcGpioInit);
+
+ switch ((rt_uint32_t)I2Cx)
+ {
+#if defined(BSP_USING_I2C1)
+ case (rt_uint32_t)CM_I2C1:
+ /* Configure I2C1 SDA/SCL pin. */
+ GPIO_SetFunc(I2C1_SDA_PORT, I2C1_SDA_PIN, I2C1_SDA_FUNC);
+ GPIO_SetFunc(I2C1_SCL_PORT, I2C1_SCL_PIN, I2C1_SCL_FUNC);
+ break;
+#endif
+#if defined(BSP_USING_I2C2) // TODO, ch2 for test only
+ case (rt_uint32_t)CM_I2C2:
+ /* Configure I2C2 SDA/SCL pin. */
+ GPIO_SetFunc(I2C2_SDA_PORT, I2C2_SDA_PIN, I2C2_SDA_FUNC);
+ GPIO_SetFunc(I2C2_SCL_PORT, I2C2_SCL_PIN, I2C2_SCL_FUNC);
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+ return result;
+}
+#endif
+
+#if defined(RT_USING_ADC)
+rt_err_t rt_hw_board_adc_init(CM_ADC_TypeDef *ADCx)
+{
+ rt_err_t result = RT_EOK;
+ stc_gpio_init_t stcGpioInit;
+
+ (void)GPIO_StructInit(&stcGpioInit);
+ stcGpioInit.u16PinAttr = PIN_ATTR_ANALOG;
+ switch ((rt_uint32_t)ADCx)
+ {
+#if defined(BSP_USING_ADC1)
+ case (rt_uint32_t)CM_ADC1:
+ (void)GPIO_Init(ADC1_CH_PORT, ADC1_CH_PIN, &stcGpioInit);
+ break;
+#endif
+#if defined(BSP_USING_ADC2)
+ case (rt_uint32_t)CM_ADC2:
+ (void)GPIO_Init(ADC2_CH_PORT, ADC2_CH_PIN, &stcGpioInit);
+ break;
+#endif
+#if defined(BSP_USING_ADC3)
+ case (rt_uint32_t)CM_ADC3:
+ (void)GPIO_Init(ADC3_CH_PORT, ADC3_CH_PIN, &stcGpioInit);
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+
+ return result;
+}
+#endif
+
+#if defined(RT_USING_DAC)
+rt_err_t rt_hw_board_dac_init(CM_DAC_TypeDef *DACx)
+{
+ rt_err_t result = RT_EOK;
+ stc_gpio_init_t stcGpioInit;
+
+ (void)GPIO_StructInit(&stcGpioInit);
+ stcGpioInit.u16PinAttr = PIN_ATTR_ANALOG;
+ switch ((rt_uint32_t)DACx)
+ {
+#if defined(BSP_USING_DAC1)
+ case (rt_uint32_t)CM_DAC1:
+ (void)GPIO_Init(DAC1_CH1_PORT, DAC1_CH1_PIN, &stcGpioInit);
+ (void)GPIO_Init(DAC1_CH2_PORT, DAC1_CH2_PIN, &stcGpioInit);
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+
+ return result;
+}
+#endif
+
+#if defined(RT_USING_CAN)
+void CanPhyEnable(void)
+{
+#if defined(BSP_USING_CAN1)
+ TCA9539_WritePin(CAN1_STB_PORT, CAN1_STB_PIN, TCA9539_PIN_RESET);
+ TCA9539_ConfigPin(CAN1_STB_PORT, CAN1_STB_PIN, TCA9539_DIR_OUT);
+#endif
+#if defined(BSP_USING_CAN2)
+ TCA9539_WritePin(CAN2_STB_PORT, CAN2_STB_PIN, TCA9539_PIN_RESET);
+ TCA9539_ConfigPin(CAN2_STB_PORT, CAN2_STB_PIN, TCA9539_DIR_OUT);
+#endif
+}
+rt_err_t rt_hw_board_can_init(CM_CAN_TypeDef *CANx)
+{
+ rt_err_t result = RT_EOK;
+
+ switch ((rt_uint32_t)CANx)
+ {
+#if defined(BSP_USING_CAN1)
+ case (rt_uint32_t)CM_CAN1:
+ GPIO_SetFunc(CAN1_TX_PORT, CAN1_TX_PIN, CAN1_TX_PIN_FUNC);
+ GPIO_SetFunc(CAN1_RX_PORT, CAN1_RX_PIN, CAN1_RX_PIN_FUNC);
+ break;
+#endif
+#if defined(BSP_USING_CAN2)
+ case (rt_uint32_t)CM_CAN2:
+ GPIO_SetFunc(CAN2_TX_PORT, CAN2_TX_PIN, CAN2_TX_PIN_FUNC);
+ GPIO_SetFunc(CAN2_RX_PORT, CAN2_RX_PIN, CAN2_RX_PIN_FUNC);
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+
+ return result;
+}
+#endif
+
+
+#if defined (RT_USING_SPI)
+rt_err_t rt_hw_spi_board_init(CM_SPI_TypeDef *CM_SPIx)
+{
+ rt_err_t result = RT_EOK;
+#if defined(BSP_USING_SPI1)
+ stc_gpio_init_t stcGpioInit;
+#endif
+
+ switch ((rt_uint32_t)CM_SPIx)
+ {
+#if defined(BSP_USING_SPI1)
+ case (rt_uint32_t)CM_SPI1:
+ GPIO_StructInit(&stcGpioInit);
+ stcGpioInit.u16PinState = PIN_STAT_SET;
+ stcGpioInit.u16PinDir = PIN_DIR_OUT;
+ GPIO_Init(SPI1_WP_PORT, SPI1_WP_PIN, &stcGpioInit);
+ GPIO_Init(SPI1_HOLD_PORT, SPI1_HOLD_PIN, &stcGpioInit);
+
+ (void)GPIO_StructInit(&stcGpioInit);
+ stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
+ stcGpioInit.u16PinInputType = PIN_IN_TYPE_CMOS;
+ (void)GPIO_Init(SPI1_SCK_PORT, SPI1_SCK_PIN, &stcGpioInit);
+ (void)GPIO_Init(SPI1_MOSI_PORT, SPI1_MOSI_PIN, &stcGpioInit);
+ (void)GPIO_Init(SPI1_MISO_PORT, SPI1_MISO_PIN, &stcGpioInit);
+ GPIO_SetFunc(SPI1_SCK_PORT, SPI1_SCK_PIN, SPI1_SCK_FUNC);
+ GPIO_SetFunc(SPI1_MOSI_PORT, SPI1_MOSI_PIN, SPI1_MOSI_FUNC);
+ GPIO_SetFunc(SPI1_MISO_PORT, SPI1_MISO_PIN, SPI1_MISO_FUNC);
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+
+ return result;
+}
+#endif
+
+#if defined(RT_USING_PWM)
+#if defined(BSP_USING_PWM_TMRA)
+rt_err_t rt_hw_board_pwm_tmra_init(CM_TMRA_TypeDef *TMRAx)
+{
+ rt_err_t result = RT_EOK;
+ switch ((rt_uint32_t)TMRAx)
+ {
+#if defined(BSP_USING_PWM_TMRA_1)
+ case (rt_uint32_t)CM_TMRA_1:
+#ifdef BSP_USING_PWM_TMRA_1_CH1
+ GPIO_SetFunc(PWM_TMRA_1_CH1_PORT, PWM_TMRA_1_CH1_PIN, PWM_TMRA_1_CH1_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMRA_1_CH2
+ GPIO_SetFunc(PWM_TMRA_1_CH2_PORT, PWM_TMRA_1_CH2_PIN, PWM_TMRA_1_CH2_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMRA_1_CH3
+ GPIO_SetFunc(PWM_TMRA_1_CH3_PORT, PWM_TMRA_1_CH3_PIN, PWM_TMRA_1_CH3_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMRA_1_CH4
+ GPIO_SetFunc(PWM_TMRA_1_CH4_PORT, PWM_TMRA_1_CH4_PIN, PWM_TMRA_1_CH4_PIN_FUNC);
+#endif
+ break;
+#endif
+#if defined(BSP_USING_PWM_TMRA_2)
+ case (rt_uint32_t)CM_TMRA_2:
+#ifdef BSP_USING_PWM_TMRA_2_CH1
+ GPIO_SetFunc(PWM_TMRA_2_CH1_PORT, PWM_TMRA_2_CH1_PIN, PWM_TMRA_2_CH1_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMRA_2_CH2
+ GPIO_SetFunc(PWM_TMRA_2_CH2_PORT, PWM_TMRA_2_CH2_PIN, PWM_TMRA_2_CH2_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMRA_2_CH3
+ GPIO_SetFunc(PWM_TMRA_2_CH3_PORT, PWM_TMRA_2_CH3_PIN, PWM_TMRA_2_CH3_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMRA_2_CH4
+ GPIO_SetFunc(PWM_TMRA_2_CH4_PORT, PWM_TMRA_2_CH4_PIN, PWM_TMRA_2_CH4_PIN_FUNC);
+#endif
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+
+ return result;
+}
+#endif
+
+#if defined(BSP_USING_PWM_TMR4)
+rt_err_t rt_hw_board_pwm_tmr4_init(CM_TMR4_TypeDef *TMR4x)
+{
+ rt_err_t result = RT_EOK;
+ switch ((rt_uint32_t)TMR4x)
+ {
+#if defined(BSP_USING_PWM_TMR4_1)
+ case (rt_uint32_t)CM_TMR4_1:
+#ifdef BSP_USING_PWM_TMR4_1_OUH
+ GPIO_SetFunc(PWM_TMR4_1_OUH_PORT, PWM_TMR4_1_OUH_PIN, PWM_TMR4_1_OUH_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMR4_1_OUL
+ GPIO_SetFunc(PWM_TMR4_1_OUL_PORT, PWM_TMR4_1_OUL_PIN, PWM_TMR4_1_OUL_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMR4_1_OVH
+ GPIO_SetFunc(PWM_TMR4_1_OVH_PORT, PWM_TMR4_1_OVH_PIN, PWM_TMR4_1_OVH_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMR4_1_OVL
+ GPIO_SetFunc(PWM_TMR4_1_OVL_PORT, PWM_TMR4_1_OVL_PIN, PWM_TMR4_1_OVL_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMR4_1_OWH
+ GPIO_SetFunc(PWM_TMR4_1_OWH_PORT, PWM_TMR4_1_OWH_PIN, PWM_TMR4_1_OWH_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMR4_1_OWL
+ GPIO_SetFunc(PWM_TMR4_1_OWL_PORT, PWM_TMR4_1_OWL_PIN, PWM_TMR4_1_OWL_PIN_FUNC);
+#endif
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+ return result;
+}
+#endif
+
+#if defined(BSP_USING_PWM_TMR6)
+rt_err_t rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef *TMR6x)
+{
+ rt_err_t result = RT_EOK;
+ switch ((rt_uint32_t)TMR6x)
+ {
+#if defined(BSP_USING_PWM_TMR6_1)
+ case (rt_uint32_t)CM_TMR6_1:
+#ifdef BSP_USING_PWM_TMR6_1_A
+ GPIO_SetFunc(PWM_TMR6_1_A_PORT, PWM_TMR6_1_A_PIN, PWM_TMR6_1_A_PIN_FUNC);
+#endif
+#ifdef BSP_USING_PWM_TMR6_1_B
+ GPIO_SetFunc(PWM_TMR6_1_B_PORT, PWM_TMR6_1_B_PIN, PWM_TMR6_1_B_PIN_FUNC);
+#endif
+ break;
+#endif
+ default:
+ result = -RT_ERROR;
+ break;
+ }
+
+ return result;
+}
+#endif
+#endif
+
+#ifdef RT_USING_PM
+#define EFM_ERASE_TIME_MAX_IN_MILLISECOND (20)
+#define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS)
+
+static void _pm_sleep_common_init(rt_bool_t b_disable_unused_clk)
+{
+ CLK_Xtal32Cmd(ENABLE);
+
+ rt_tick_t tick_start = rt_tick_get_millisecond();
+ rt_err_t rt_stat = RT_EOK;
+ //wait flash idle
+ while (SET != EFM_GetStatus(EFM_FLAG_RDY))
+ {
+ if (rt_tick_get_millisecond() - tick_start > EFM_ERASE_TIME_MAX_IN_MILLISECOND)
+ {
+ rt_stat = RT_ERROR;
+ break;
+ }
+ }
+ RT_ASSERT(rt_stat == RT_EOK);
+
+ if (b_disable_unused_clk)
+ {
+ uint32_t cur_clk_src = READ_REG8_BIT(CM_CMU->CKSWR, CMU_CKSWR_CKSW);
+
+ switch (cur_clk_src)
+ {
+ case CLK_SYSCLK_SRC_HRC:
+ CLK_PLLCmd(DISABLE);
+ CLK_MrcCmd(DISABLE);
+ CLK_LrcCmd(DISABLE);
+ CLK_XtalCmd(DISABLE);
+ PWC_LDO_Cmd(PWC_LDO_PLL, DISABLE);
+ break;
+ case CLK_SYSCLK_SRC_MRC:
+ CLK_PLLCmd(DISABLE);
+ CLK_HrcCmd(DISABLE);
+ CLK_LrcCmd(DISABLE);
+ CLK_XtalCmd(DISABLE);
+ PWC_LDO_Cmd(PWC_LDO_PLL | PWC_LDO_HRC, DISABLE);
+
+ break;
+ case CLK_SYSCLK_SRC_XTAL:
+ CLK_PLLCmd(DISABLE);
+ CLK_HrcCmd(DISABLE);
+ CLK_MrcCmd(DISABLE);
+ CLK_LrcCmd(DISABLE);
+ PWC_LDO_Cmd(PWC_LDO_PLL | PWC_LDO_HRC, DISABLE);
+
+ break;
+ case CLK_SYSCLK_SRC_XTAL32:
+ CLK_PLLCmd(DISABLE);
+ CLK_HrcCmd(DISABLE);
+ CLK_MrcCmd(DISABLE);
+ CLK_LrcCmd(DISABLE);
+ CLK_XtalCmd(DISABLE);
+ PWC_LDO_Cmd(PWC_LDO_PLL | PWC_LDO_HRC, DISABLE);
+
+ break;
+ case CLK_SYSCLK_SRC_PLL:
+ if (CLK_PLL_SRC_XTAL == PLL_SRC)
+ {
+ CLK_HrcCmd(DISABLE);
+ }
+ else
+ {
+ CLK_XtalCmd(DISABLE);
+ }
+ CLK_MrcCmd(DISABLE);
+ CLK_LrcCmd(DISABLE);
+ PWC_LDO_Cmd(PWC_LDO_HRC, DISABLE);
+
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void rt_hw_board_pm_sleep_deep_init(void)
+{
+#if (PM_SLEEP_DEEP_CFG_CLK == PWC_STOP_CLK_KEEP)
+ _pm_sleep_common_init(RT_TRUE);
+#else
+ _pm_sleep_common_init(RT_FALSE);
+ CLK_PLLCmd(DISABLE);
+ CLK_HrcCmd(DISABLE);
+ CLK_LrcCmd(DISABLE);
+ CLK_XtalCmd(DISABLE);
+ PWC_LDO_Cmd(PWC_LDO_PLL | PWC_LDO_HRC, DISABLE);
+#endif
+}
+
+void rt_hw_board_pm_sleep_shutdown_init(void)
+{
+ _pm_sleep_common_init(RT_TRUE);
+}
+
+void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode)
+{
+ switch (run_mode)
+ {
+ case PM_RUN_MODE_HIGH_SPEED:
+ case PM_RUN_MODE_NORMAL_SPEED:
+ SystemClock_Config();
+ break;
+
+ case PM_RUN_MODE_LOW_SPEED:
+ CLK_SetSysClockSrc(CLK_SYSCLK_SRC_XTAL);
+
+ default:
+ break;
+ }
+}
+#endif
+
+#if defined(BSP_USING_QSPI)
+rt_err_t rt_hw_qspi_board_init(void)
+{
+ stc_gpio_init_t stcGpioInit;
+
+ (void)GPIO_StructInit(&stcGpioInit);
+ stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
+#ifndef BSP_QSPI_USING_SOFT_CS
+ (void)GPIO_Init(QSPI_FLASH_CS_PORT, QSPI_FLASH_CS_PIN, &stcGpioInit);
+ GPIO_SetFunc(QSPI_FLASH_CS_PORT, QSPI_FLASH_CS_PIN, QSPI_FLASH_CS_FUNC);
+#endif
+ (void)GPIO_Init(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, &stcGpioInit);
+ (void)GPIO_Init(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, &stcGpioInit);
+ (void)GPIO_Init(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, &stcGpioInit);
+ (void)GPIO_Init(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, &stcGpioInit);
+ (void)GPIO_Init(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, &stcGpioInit);
+ GPIO_SetFunc(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, QSPI_FLASH_SCK_FUNC);
+ GPIO_SetFunc(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, QSPI_FLASH_IO0_FUNC);
+ GPIO_SetFunc(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, QSPI_FLASH_IO1_FUNC);
+ GPIO_SetFunc(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, QSPI_FLASH_IO2_FUNC);
+ GPIO_SetFunc(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, QSPI_FLASH_IO3_FUNC);
+
+ return RT_EOK;
+}
+#endif
+
+#if defined(BSP_USING_TMRA_PULSE_ENCODER)
+rt_err_t rt_hw_board_pulse_encoder_tmra_init(void)
+{
+#if defined(BSP_USING_PULSE_ENCODER_TMRA_1)
+ GPIO_SetFunc(PULSE_ENCODER_TMRA_1_A_PORT, PULSE_ENCODER_TMRA_1_A_PIN, PULSE_ENCODER_TMRA_1_A_PIN_FUNC);
+ GPIO_SetFunc(PULSE_ENCODER_TMRA_1_B_PORT, PULSE_ENCODER_TMRA_1_B_PIN, PULSE_ENCODER_TMRA_1_B_PIN_FUNC);
+#endif
+ return RT_EOK;
+}
+#endif
+
+#if defined(BSP_USING_TMR6_PULSE_ENCODER)
+rt_err_t rt_hw_board_pulse_encoder_tmr6_init(void)
+{
+#if defined(BSP_USING_PULSE_ENCODER_TMR6_1)
+ GPIO_SetFunc(PULSE_ENCODER_TMR6_1_A_PORT, PULSE_ENCODER_TMR6_1_A_PIN, PULSE_ENCODER_TMR6_1_A_PIN_FUNC);
+ GPIO_SetFunc(PULSE_ENCODER_TMR6_1_B_PORT, PULSE_ENCODER_TMR6_1_B_PIN, PULSE_ENCODER_TMR6_1_B_PIN_FUNC);
+#endif
+ return RT_EOK;
+}
+#endif
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h
new file mode 100644
index 0000000000..0469ffb049
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h
@@ -0,0 +1,310 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+
+#ifndef __BOARD_CONFIG_H__
+#define __BOARD_CONFIG_H__
+
+#include
+#include "hc32_ll.h"
+#include "drv_config.h"
+
+
+/************************* XTAL port **********************/
+#define XTAL_PORT (GPIO_PORT_H)
+#define XTAL_IN_PIN (GPIO_PIN_00)
+#define XTAL_OUT_PIN (GPIO_PIN_01)
+
+/************************ USART port **********************/
+#if defined(BSP_USING_UART1)
+ #define USART1_RX_PORT (GPIO_PORT_A)
+ #define USART1_RX_PIN (GPIO_PIN_10)
+ #define USART1_RX_FUNC (GPIO_FUNC_33)
+
+ #define USART1_TX_PORT (GPIO_PORT_A)
+ #define USART1_TX_PIN (GPIO_PIN_09)
+ #define USART1_TX_FUNC (GPIO_FUNC_32)
+#endif
+
+#if defined(BSP_USING_UART2)
+ #define USART2_RX_PORT (GPIO_PORT_C)
+ #define USART2_RX_PIN (GPIO_PIN_11)
+ #define USART2_RX_FUNC (GPIO_FUNC_37)
+
+ #define USART2_TX_PORT (GPIO_PORT_C)
+ #define USART2_TX_PIN (GPIO_PIN_10)
+ #define USART2_TX_FUNC (GPIO_FUNC_36)
+#endif
+
+#if defined(BSP_USING_UART6)
+ #define USART6_RX_PORT (GPIO_PORT_D)
+ #define USART6_RX_PIN (GPIO_PIN_01)
+ #define USART6_RX_FUNC (GPIO_FUNC_55)
+
+ #define USART6_TX_PORT (GPIO_PORT_D)
+ #define USART6_TX_PIN (GPIO_PIN_02)
+ #define USART6_TX_FUNC (GPIO_FUNC_54)
+#endif
+
+/************************ I2C port **********************/
+#if defined(BSP_USING_I2C1)
+ #define I2C1_SDA_PORT (GPIO_PORT_E)
+ #define I2C1_SDA_PIN (GPIO_PIN_00)
+ #define I2C1_SDA_FUNC (GPIO_FUNC_48)
+
+ #define I2C1_SCL_PORT (GPIO_PORT_E)
+ #define I2C1_SCL_PIN (GPIO_PIN_01)
+ #define I2C1_SCL_FUNC (GPIO_FUNC_49)
+#endif
+
+#if defined(BSP_USING_I2C2) // TODO, ch2 for test only
+ #define I2C2_SDA_PORT (GPIO_PORT_A)
+ #define I2C2_SDA_PIN (GPIO_PIN_09)
+ #define I2C2_SDA_FUNC (GPIO_FUNC_50)
+
+ #define I2C2_SCL_PORT (GPIO_PORT_A)
+ #define I2C2_SCL_PIN (GPIO_PIN_10)
+ #define I2C2_SCL_FUNC (GPIO_FUNC_51)
+#endif
+
+
+/*********** ADC configure *********/
+#if defined(BSP_USING_ADC1)
+ #define ADC1_CH_PORT (GPIO_PORT_C)
+ #define ADC1_CH_PIN (GPIO_PIN_00)
+#endif
+
+#if defined(BSP_USING_ADC2)
+ #define ADC2_CH_PORT (GPIO_PORT_C)
+ #define ADC2_CH_PIN (GPIO_PIN_01)
+#endif
+
+#if defined(BSP_USING_ADC3)
+ #define ADC3_CH_PORT (GPIO_PORT_E)
+ #define ADC3_CH_PIN (GPIO_PIN_03)
+#endif
+
+/*********** DAC configure *********/
+#if defined(BSP_USING_DAC1)
+ #define DAC1_CH1_PORT (GPIO_PORT_A)
+ #define DAC1_CH1_PIN (GPIO_PIN_04)
+ #define DAC1_CH2_PORT (GPIO_PORT_A)
+ #define DAC1_CH2_PIN (GPIO_PIN_05)
+#endif
+
+/*********** CAN configure *********/
+#if defined(BSP_USING_CAN1)
+ #define CAN1_TX_PORT (GPIO_PORT_C)
+ #define CAN1_TX_PIN (GPIO_PIN_12)
+ #define CAN1_TX_PIN_FUNC (GPIO_FUNC_56)
+
+ #define CAN1_RX_PORT (GPIO_PORT_D)
+ #define CAN1_RX_PIN (GPIO_PIN_00)
+ #define CAN1_RX_PIN_FUNC (GPIO_FUNC_57)
+#endif
+
+#if defined(BSP_USING_CAN2)
+ #define CAN2_TX_PORT (GPIO_PORT_H)
+ #define CAN2_TX_PIN (GPIO_PIN_02)
+ #define CAN2_TX_PIN_FUNC (GPIO_FUNC_56)
+
+ #define CAN2_RX_PORT (GPIO_PORT_E)
+ #define CAN2_RX_PIN (GPIO_PIN_04)
+ #define CAN2_RX_PIN_FUNC (GPIO_FUNC_57)
+#endif
+
+/************************* SPI port ***********************/
+#if defined(BSP_USING_SPI1)
+ #define SPI1_CS_PORT (GPIO_PORT_C)
+ #define SPI1_CS_PIN (GPIO_PIN_07)
+
+ #define SPI1_SCK_PORT (GPIO_PORT_B)
+ #define SPI1_SCK_PIN (GPIO_PIN_14)
+ #define SPI1_SCK_FUNC (GPIO_FUNC_47)
+
+ #define SPI1_MOSI_PORT (GPIO_PORT_B)
+ #define SPI1_MOSI_PIN (GPIO_PIN_13)
+ #define SPI1_MOSI_FUNC (GPIO_FUNC_44)
+
+ #define SPI1_MISO_PORT (GPIO_PORT_D)
+ #define SPI1_MISO_PIN (GPIO_PIN_09)
+ #define SPI1_MISO_FUNC (GPIO_FUNC_45)
+
+ #define SPI1_WP_PORT (GPIO_PORT_D)
+ #define SPI1_WP_PIN (GPIO_PIN_10)
+
+ #define SPI1_HOLD_PORT (GPIO_PORT_D)
+ #define SPI1_HOLD_PIN (GPIO_PIN_11)
+#endif
+
+/************************ RTC/PM *****************************/
+#if defined(BSP_USING_RTC) || defined(RT_USING_PM)
+ #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM)
+ #define XTAL32_PORT (GPIO_PORT_C)
+ #define XTAL32_IN_PIN (GPIO_PIN_14)
+ #define XTAL32_OUT_PIN (GPIO_PIN_15)
+ #endif
+#endif
+
+#if defined(RT_USING_PWM)
+ /*********** PWM_TMRA configure *********/
+ #if defined(BSP_USING_PWM_TMRA_1)
+ #if defined(BSP_USING_PWM_TMRA_1_CH1)
+ #define PWM_TMRA_1_CH1_PORT (GPIO_PORT_A)
+ #define PWM_TMRA_1_CH1_PIN (GPIO_PIN_08)
+ #define PWM_TMRA_1_CH1_PIN_FUNC (GPIO_FUNC_4)
+ #endif
+ #if defined(BSP_USING_PWM_TMRA_1_CH2)
+ #define PWM_TMRA_1_CH2_PORT (GPIO_PORT_A)
+ #define PWM_TMRA_1_CH2_PIN (GPIO_PIN_09)
+ #define PWM_TMRA_1_CH2_PIN_FUNC (GPIO_FUNC_4)
+ #endif
+ #if defined(BSP_USING_PWM_TMRA_1_CH3)
+ #define PWM_TMRA_1_CH3_PORT (GPIO_PORT_A)
+ #define PWM_TMRA_1_CH3_PIN (GPIO_PIN_10)
+ #define PWM_TMRA_1_CH3_PIN_FUNC (GPIO_FUNC_4)
+ #endif
+ #if defined(BSP_USING_PWM_TMRA_1_CH4)
+ #define PWM_TMRA_1_CH4_PORT (GPIO_PORT_A)
+ #define PWM_TMRA_1_CH4_PIN (GPIO_PIN_11)
+ #define PWM_TMRA_1_CH4_PIN_FUNC (GPIO_FUNC_4)
+ #endif
+ #endif
+
+ #if defined(BSP_USING_PWM_TMRA_2)
+ #if defined(BSP_USING_PWM_TMRA_2_CH1)
+ #define PWM_TMRA_2_CH1_PORT (GPIO_PORT_A)
+ #define PWM_TMRA_2_CH1_PIN (GPIO_PIN_00)
+ #define PWM_TMRA_2_CH1_PIN_FUNC (GPIO_FUNC_4)
+ #endif
+ #if defined(BSP_USING_PWM_TMRA_2_CH2)
+ #define PWM_TMRA_2_CH2_PORT (GPIO_PORT_A)
+ #define PWM_TMRA_2_CH2_PIN (GPIO_PIN_01)
+ #define PWM_TMRA_2_CH2_PIN_FUNC (GPIO_FUNC_4)
+ #endif
+ #if defined(BSP_USING_PWM_TMRA_2_CH3)
+ #define PWM_TMRA_2_CH3_PORT (GPIO_PORT_A)
+ #define PWM_TMRA_2_CH3_PIN (GPIO_PIN_02)
+ #define PWM_TMRA_2_CH3_PIN_FUNC (GPIO_FUNC_4)
+ #endif
+ #if defined(BSP_USING_PWM_TMRA_2_CH4)
+ #define PWM_TMRA_2_CH4_PORT (GPIO_PORT_A)
+ #define PWM_TMRA_2_CH4_PIN (GPIO_PIN_03)
+ #define PWM_TMRA_2_CH4_PIN_FUNC (GPIO_FUNC_4)
+ #endif
+ #endif
+
+ /*********** PWM_TMR4 configure *********/
+ #if defined(BSP_USING_PWM_TMR4_1)
+ #if defined(BSP_USING_PWM_TMR4_1_OUH)
+ #define PWM_TMR4_1_OUH_PORT (GPIO_PORT_A)
+ #define PWM_TMR4_1_OUH_PIN (GPIO_PIN_08)
+ #define PWM_TMR4_1_OUH_PIN_FUNC (GPIO_FUNC_2)
+ #endif
+ #if defined(BSP_USING_PWM_TMR4_1_OUL)
+ #define PWM_TMR4_1_OUL_PORT (GPIO_PORT_A)
+ #define PWM_TMR4_1_OUL_PIN (GPIO_PIN_07)
+ #define PWM_TMR4_1_OUL_PIN_FUNC (GPIO_FUNC_2)
+ #endif
+ #if defined(BSP_USING_PWM_TMR4_1_OVH)
+ #define PWM_TMR4_1_OVH_PORT (GPIO_PORT_A)
+ #define PWM_TMR4_1_OVH_PIN (GPIO_PIN_09)
+ #define PWM_TMR4_1_OVH_PIN_FUNC (GPIO_FUNC_2)
+ #endif
+ #if defined(BSP_USING_PWM_TMR4_1_OVL)
+ #define PWM_TMR4_1_OVL_PORT (GPIO_PORT_B)
+ #define PWM_TMR4_1_OVL_PIN (GPIO_PIN_00)
+ #define PWM_TMR4_1_OVL_PIN_FUNC (GPIO_FUNC_2)
+ #endif
+ #if defined(BSP_USING_PWM_TMR4_1_OWH)
+ #define PWM_TMR4_1_OWH_PORT (GPIO_PORT_A)
+ #define PWM_TMR4_1_OWH_PIN (GPIO_PIN_10)
+ #define PWM_TMR4_1_OWH_PIN_FUNC (GPIO_FUNC_2)
+ #endif
+ #if defined(BSP_USING_PWM_TMR4_1_OWL)
+ #define PWM_TMR4_1_OWL_PORT (GPIO_PORT_B)
+ #define PWM_TMR4_1_OWL_PIN (GPIO_PIN_01)
+ #define PWM_TMR4_1_OWL_PIN_FUNC (GPIO_FUNC_2)
+ #endif
+ #endif
+
+ /*********** PWM_TMR6 configure *********/
+ #if defined(BSP_USING_PWM_TMR6_1)
+ #if defined(BSP_USING_PWM_TMR6_1_A)
+ #define PWM_TMR6_1_A_PORT (GPIO_PORT_A)
+ #define PWM_TMR6_1_A_PIN (GPIO_PIN_08)
+ #define PWM_TMR6_1_A_PIN_FUNC (GPIO_FUNC_3)
+ #endif
+ #if defined(BSP_USING_PWM_TMR6_1_B)
+ #define PWM_TMR6_1_B_PORT (GPIO_PORT_A)
+ #define PWM_TMR6_1_B_PIN (GPIO_PIN_07)
+ #define PWM_TMR6_1_B_PIN_FUNC (GPIO_FUNC_3)
+ #endif
+ #endif
+
+#endif
+
+#if defined(BSP_USING_QSPI)
+ #ifndef BSP_QSPI_USING_SOFT_CS
+ /* QSSN */
+ #define QSPI_FLASH_CS_PORT (GPIO_PORT_C)
+ #define QSPI_FLASH_CS_PIN (GPIO_PIN_07)
+ #define QSPI_FLASH_CS_FUNC (GPIO_FUNC_7)
+ #endif
+ /* QSCK */
+ #define QSPI_FLASH_SCK_PORT (GPIO_PORT_B)
+ #define QSPI_FLASH_SCK_PIN (GPIO_PIN_14)
+ #define QSPI_FLASH_SCK_FUNC (GPIO_FUNC_7)
+ /* QSIO0 */
+ #define QSPI_FLASH_IO0_PORT (GPIO_PORT_B)
+ #define QSPI_FLASH_IO0_PIN (GPIO_PIN_13)
+ #define QSPI_FLASH_IO0_FUNC (GPIO_FUNC_7)
+ /* QSIO1 */
+ #define QSPI_FLASH_IO1_PORT (GPIO_PORT_D)
+ #define QSPI_FLASH_IO1_PIN (GPIO_PIN_09)
+ #define QSPI_FLASH_IO1_FUNC (GPIO_FUNC_7)
+ /* QSIO2 */
+ #define QSPI_FLASH_IO2_PORT (GPIO_PORT_D)
+ #define QSPI_FLASH_IO2_PIN (GPIO_PIN_10)
+ #define QSPI_FLASH_IO2_FUNC (GPIO_FUNC_7)
+ /* QSIO3 */
+ #define QSPI_FLASH_IO3_PORT (GPIO_PORT_D)
+ #define QSPI_FLASH_IO3_PIN (GPIO_PIN_11)
+ #define QSPI_FLASH_IO3_FUNC (GPIO_FUNC_7)
+#endif
+
+/*********** TMRA_PULSE_ENCODER configure *********/
+#if defined(RT_USING_PULSE_ENCODER)
+ #if defined(BSP_USING_TMRA_PULSE_ENCODER)
+ #if defined(BSP_USING_PULSE_ENCODER_TMRA_1)
+ #define PULSE_ENCODER_TMRA_1_A_PORT (GPIO_PORT_A)
+ #define PULSE_ENCODER_TMRA_1_A_PIN (GPIO_PIN_08)
+ #define PULSE_ENCODER_TMRA_1_A_PIN_FUNC (GPIO_FUNC_4)
+ #define PULSE_ENCODER_TMRA_1_B_PORT (GPIO_PORT_A)
+ #define PULSE_ENCODER_TMRA_1_B_PIN (GPIO_PIN_09)
+ #define PULSE_ENCODER_TMRA_1_B_PIN_FUNC (GPIO_FUNC_4)
+ #endif /* BSP_USING_PULSE_ENCODER_TMRA_1 */
+ #endif /* BSP_USING_TMRA_PULSE_ENCODER */
+
+ #if defined(BSP_USING_TMR6_PULSE_ENCODER)
+ #if defined(BSP_USING_PULSE_ENCODER_TMR6_1)
+ #define PULSE_ENCODER_TMR6_1_A_PORT (GPIO_PORT_A)
+ #define PULSE_ENCODER_TMR6_1_A_PIN (GPIO_PIN_08)
+ #define PULSE_ENCODER_TMR6_1_A_PIN_FUNC (GPIO_FUNC_3)
+ #define PULSE_ENCODER_TMR6_1_B_PORT (GPIO_PORT_A)
+ #define PULSE_ENCODER_TMR6_1_B_PIN (GPIO_PIN_07)
+ #define PULSE_ENCODER_TMR6_1_B_PIN_FUNC (GPIO_FUNC_3)
+ #endif /* BSP_USING_PULSE_ENCODER_TMR6_1 */
+ #endif /* BSP_USING_TMR6_PULSE_ENCODER */
+#endif /* RT_USING_PULSE_ENCODER */
+
+#endif
+
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/adc_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/adc_config.h
new file mode 100644
index 0000000000..7fdc0d3e0f
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/adc_config.h
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __ADC_CONFIG_H__
+#define __ADC_CONFIG_H__
+
+#include
+#include "irq_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef BSP_USING_ADC1
+#ifndef ADC1_INIT_PARAMS
+#define ADC1_INIT_PARAMS \
+ { \
+ .name = "adc1", \
+ .vref = 3300, \
+ .resolution = ADC_RESOLUTION_12BIT, \
+ .data_align = ADC_DATAALIGN_RIGHT, \
+ .eoc_poll_time_max = 100, \
+ .hard_trig_enable = RT_FALSE, \
+ .hard_trig_src = ADC_HARDTRIG_EVT0, \
+ .internal_trig0_comtrg0_enable = RT_FALSE, \
+ .internal_trig0_comtrg1_enable = RT_FALSE, \
+ .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_A, \
+ .internal_trig1_comtrg0_enable = RT_FALSE, \
+ .internal_trig1_comtrg1_enable = RT_FALSE, \
+ .internal_trig1_sel = EVT_SRC_MAX, \
+ .continue_conv_mode_enable = RT_FALSE, \
+ .data_reg_auto_clear = RT_TRUE, \
+ }
+#endif /* ADC1_INIT_PARAMS */
+
+#if defined (BSP_ADC1_USING_DMA)
+#ifndef ADC1_EOCA_DMA_CONFIG
+#define ADC1_EOCA_DMA_CONFIG \
+ { \
+ .Instance = ADC1_EOCA_DMA_INSTANCE, \
+ .channel = ADC1_EOCA_DMA_CHANNEL, \
+ .clock = ADC1_EOCA_DMA_CLOCK, \
+ .trigger_select = ADC1_EOCA_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_ADC1_EOCA, \
+ .flag = ADC1_EOCA_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = ADC1_EOCA_DMA_IRQn, \
+ .irq_prio = ADC1_EOCA_DMA_INT_PRIO, \
+ .int_src = ADC1_EOCA_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* ADC1_EOCA_DMA_CONFIG */
+#endif /* BSP_ADC1_USING_DMA */
+#endif /* BSP_USING_ADC1 */
+
+#ifdef BSP_USING_ADC2
+#ifndef ADC2_INIT_PARAMS
+#define ADC2_INIT_PARAMS \
+ { \
+ .name = "adc2", \
+ .vref = 3300, \
+ .resolution = ADC_RESOLUTION_12BIT, \
+ .data_align = ADC_DATAALIGN_RIGHT, \
+ .eoc_poll_time_max = 100, \
+ .hard_trig_enable = RT_FALSE, \
+ .hard_trig_src = ADC_HARDTRIG_EVT0, \
+ .internal_trig0_comtrg0_enable = RT_FALSE, \
+ .internal_trig0_comtrg1_enable = RT_FALSE, \
+ .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_A, \
+ .internal_trig1_comtrg0_enable = RT_FALSE, \
+ .internal_trig1_comtrg1_enable = RT_FALSE, \
+ .internal_trig1_sel = EVT_SRC_MAX, \
+ .continue_conv_mode_enable = RT_FALSE, \
+ .data_reg_auto_clear = RT_TRUE, \
+ }
+#endif /* ADC2_INIT_PARAMS */
+
+#if defined (BSP_ADC2_USING_DMA)
+#ifndef ADC2_EOCA_DMA_CONFIG
+#define ADC2_EOCA_DMA_CONFIG \
+ { \
+ .Instance = ADC2_EOCA_DMA_INSTANCE, \
+ .channel = ADC2_EOCA_DMA_CHANNEL, \
+ .clock = ADC2_EOCA_DMA_CLOCK, \
+ .trigger_select = ADC2_EOCA_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_ADC2_EOCA, \
+ .flag = ADC2_EOCA_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = ADC2_EOCA_DMA_IRQn, \
+ .irq_prio = ADC2_EOCA_DMA_INT_PRIO, \
+ .int_src = ADC2_EOCA_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* ADC2_EOCA_DMA_CONFIG */
+#endif /* BSP_ADC2_USING_DMA */
+#endif /* BSP_USING_ADC2 */
+
+#ifdef BSP_USING_ADC3
+#ifndef ADC3_INIT_PARAMS
+#define ADC3_INIT_PARAMS \
+ { \
+ .name = "adc3", \
+ .vref = 3300, \
+ .resolution = ADC_RESOLUTION_12BIT, \
+ .data_align = ADC_DATAALIGN_RIGHT, \
+ .eoc_poll_time_max = 100, \
+ .hard_trig_enable = RT_FALSE, \
+ .hard_trig_src = ADC_HARDTRIG_EVT0, \
+ .internal_trig0_comtrg0_enable = RT_FALSE, \
+ .internal_trig0_comtrg1_enable = RT_FALSE, \
+ .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_A, \
+ .internal_trig1_comtrg0_enable = RT_FALSE, \
+ .internal_trig1_comtrg1_enable = RT_FALSE, \
+ .internal_trig1_sel = EVT_SRC_MAX, \
+ .continue_conv_mode_enable = RT_FALSE, \
+ .data_reg_auto_clear = RT_TRUE, \
+ }
+#endif /* ADC3_INIT_PARAMS */
+
+#if defined (BSP_ADC3_USING_DMA)
+#ifndef ADC3_EOCA_DMA_CONFIG
+#define ADC3_EOCA_DMA_CONFIG \
+ { \
+ .Instance = ADC3_EOCA_DMA_INSTANCE, \
+ .channel = ADC3_EOCA_DMA_CHANNEL, \
+ .clock = ADC3_EOCA_DMA_CLOCK, \
+ .trigger_select = ADC3_EOCA_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_ADC3_EOCA, \
+ .flag = ADC3_EOCA_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = ADC3_EOCA_DMA_IRQn, \
+ .irq_prio = ADC3_EOCA_DMA_INT_PRIO, \
+ .int_src = ADC3_EOCA_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* ADC3_EOCA_DMA_CONFIG */
+#endif /* BSP_ADC3_USING_DMA */
+#endif /* BSP_USING_ADC3 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ADC_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/can_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/can_config.h
new file mode 100644
index 0000000000..eb25e85687
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/can_config.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __CAN_CONFIG_H__
+#define __CAN_CONFIG_H__
+
+#include
+#include "irq_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef BSP_USING_CAN1
+#define CAN1_CLOCK_SEL (CAN_CLOCK_SRC_40M)
+#ifdef RT_CAN_USING_CANFD
+#define CAN1_CANFD_MODE (CAN_FD_MD_ISO)
+#endif
+#define CAN1_NAME ("can1")
+#ifndef CAN1_INIT_PARAMS
+#define CAN1_INIT_PARAMS \
+ { \
+ .name = CAN1_NAME, \
+ .single_trans_mode = RT_FALSE \
+ }
+#endif /* CAN1_INIT_PARAMS */
+#endif /* BSP_USING_CAN1 */
+
+#ifdef BSP_USING_CAN2
+#define CAN2_CLOCK_SEL (CAN_CLOCK_SRC_40M)
+#ifdef RT_CAN_USING_CANFD
+#define CAN2_CANFD_MODE (CAN_FD_MD_ISO)
+#endif
+#define CAN2_NAME ("can2")
+#ifndef CAN2_INIT_PARAMS
+#define CAN2_INIT_PARAMS \
+ { \
+ .name = CAN2_NAME, \
+ .single_trans_mode = RT_FALSE \
+ }
+#endif /* CAN2_INIT_PARAMS */
+#endif /* BSP_USING_CAN2 */
+
+/* Bit time config
+ Restrictions: u32TimeSeg1 >= u32TimeSeg2 + 1, u32TimeSeg2 >= u32SJW.
+
+ Baudrate = CANClock/(u32Prescaler*(u32TimeSeg1 + u32TimeSeg2))
+ TQ = u32Prescaler / CANClock.
+ Bit time = (u32TimeSeg2 + u32TimeSeg2) x TQ.
+
+ The following bit time configures are based on CAN Clock 40M
+*/
+#define CAN_BIT_TIME_CONFIG_1M_BAUD \
+ { \
+ .u32Prescaler = 2, \
+ .u32TimeSeg1 = 16, \
+ .u32TimeSeg2 = 4, \
+ .u32SJW = 4 \
+ }
+
+#define CAN_BIT_TIME_CONFIG_800K_BAUD \
+ { \
+ .u32Prescaler = 2, \
+ .u32TimeSeg1 = 20, \
+ .u32TimeSeg2 = 5, \
+ .u32SJW = 4 \
+ }
+
+#define CAN_BIT_TIME_CONFIG_500K_BAUD \
+ { \
+ .u32Prescaler = 4, \
+ .u32TimeSeg1 = 16, \
+ .u32TimeSeg2 = 4, \
+ .u32SJW = 4 \
+ }
+
+#define CAN_BIT_TIME_CONFIG_250K_BAUD \
+ { \
+ .u32Prescaler = 8, \
+ .u32TimeSeg1 = 16, \
+ .u32TimeSeg2 = 4, \
+ .u32SJW = 4 \
+ }
+
+#define CAN_BIT_TIME_CONFIG_125K_BAUD \
+ { \
+ .u32Prescaler = 16, \
+ .u32TimeSeg1 = 16, \
+ .u32TimeSeg2 = 4, \
+ .u32SJW = 4 \
+ }
+
+#define CAN_BIT_TIME_CONFIG_100K_BAUD \
+ { \
+ .u32Prescaler = 20, \
+ .u32TimeSeg1 = 16, \
+ .u32TimeSeg2 = 4, \
+ .u32SJW = 4 \
+ }
+
+#define CAN_BIT_TIME_CONFIG_50K_BAUD \
+ { \
+ .u32Prescaler = 40, \
+ .u32TimeSeg1 = 16, \
+ .u32TimeSeg2 = 4, \
+ .u32SJW = 4 \
+ }
+
+#define CAN_BIT_TIME_CONFIG_20K_BAUD \
+ { \
+ .u32Prescaler = 100, \
+ .u32TimeSeg1 = 16, \
+ .u32TimeSeg2 = 4, \
+ .u32SJW = 4 \
+ }
+
+#define CAN_BIT_TIME_CONFIG_10K_BAUD \
+ { \
+ .u32Prescaler = 200, \
+ .u32TimeSeg1 = 16, \
+ .u32TimeSeg2 = 4, \
+ .u32SJW = 4 \
+ }
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CAN_CONFIG_H__ */
+
+
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/dac_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/dac_config.h
new file mode 100644
index 0000000000..10de0c1734
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/dac_config.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __DAC_CONFIG_H__
+#define __DAC_CONFIG_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef BSP_USING_DAC1
+#ifndef DAC1_INIT_PARAMS
+#define DAC1_INIT_PARAMS \
+ { \
+ .name = "dac1", \
+ }
+#endif /* DAC1_INIT_PARAMS */
+#endif /* BSP_USING_DAC1 */
+
+#ifdef BSP_USING_DAC2
+#ifndef DAC2_INIT_PARAMS
+#define DAC2_INIT_PARAMS \
+ { \
+ .name = "dac2", \
+ }
+#endif /* DAC2_INIT_PARAMS */
+#endif /* BSP_USING_DAC2 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __DAC_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/dma_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/dma_config.h
new file mode 100644
index 0000000000..6a84329063
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/dma_config.h
@@ -0,0 +1,263 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __DMA_CONFIG_H__
+#define __DMA_CONFIG_H__
+
+#include
+#include "irq_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DMA1 ch0 */
+#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE)
+#define SPI1_RX_DMA_INSTANCE CM_DMA1
+#define SPI1_RX_DMA_CHANNEL DMA_CH0
+#define SPI1_RX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define SPI1_RX_DMA_TRIG_SELECT AOS_DMA1_0
+#define SPI1_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH0
+#define SPI1_RX_DMA_IRQn BSP_DMA1_CH0_IRQ_NUM
+#define SPI1_RX_DMA_INT_PRIO BSP_DMA1_CH0_IRQ_PRIO
+#define SPI1_RX_DMA_INT_SRC INT_SRC_DMA1_TC0
+
+#elif defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_INSTANCE)
+#define SPI3_RX_DMA_INSTANCE CM_DMA1
+#define SPI3_RX_DMA_CHANNEL DMA_CH0
+#define SPI3_RX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define SPI3_RX_DMA_TRIG_SELECT AOS_DMA1_0
+#define SPI3_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH0
+#define SPI3_RX_DMA_IRQn BSP_DMA1_CH0_IRQ_NUM
+#define SPI3_RX_DMA_INT_PRIO BSP_DMA1_CH0_IRQ_PRIO
+#define SPI3_RX_DMA_INT_SRC INT_SRC_DMA1_TC0
+
+#elif defined(BSP_I2C1_TX_USING_DMA) && !defined(I2C1_TX_DMA_INSTANCE)
+#define I2C1_TX_DMA_INSTANCE CM_DMA1
+#define I2C1_TX_DMA_CHANNEL DMA_CH0
+#define I2C1_TX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define I2C1_TX_DMA_TRIG_SELECT AOS_DMA1_0
+#define I2C1_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH0
+#define I2C1_TX_DMA_IRQn BSP_DMA1_CH0_IRQ_NUM
+#define I2C1_TX_DMA_INT_PRIO BSP_DMA1_CH0_IRQ_PRIO
+#define I2C1_TX_DMA_INT_SRC INT_SRC_DMA1_TC0
+#endif
+
+/* DMA1 ch1 */
+#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE)
+#define SPI1_TX_DMA_INSTANCE CM_DMA1
+#define SPI1_TX_DMA_CHANNEL DMA_CH1
+#define SPI1_TX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define SPI1_TX_DMA_TRIG_SELECT AOS_DMA1_1
+#define SPI1_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH1
+#define SPI1_TX_DMA_IRQn BSP_DMA1_CH1_IRQ_NUM
+#define SPI1_TX_DMA_INT_PRIO BSP_DMA1_CH1_IRQ_PRIO
+#define SPI1_TX_DMA_INT_SRC INT_SRC_DMA1_TC1
+
+#elif defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_INSTANCE)
+#define SPI3_TX_DMA_INSTANCE CM_DMA1
+#define SPI3_TX_DMA_CHANNEL DMA_CH1
+#define SPI3_TX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define SPI3_TX_DMA_TRIG_SELECT AOS_DMA1_1
+#define SPI3_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH1
+#define SPI3_TX_DMA_IRQn BSP_DMA1_CH1_IRQ_NUM
+#define SPI3_TX_DMA_INT_PRIO BSP_DMA1_CH1_IRQ_PRIO
+#define SPI3_TX_DMA_INT_SRC INT_SRC_DMA1_TC1
+
+#elif defined(BSP_I2C1_RX_USING_DMA) && !defined(I2C1_RX_DMA_INSTANCE)
+#define I2C1_RX_DMA_INSTANCE CM_DMA1
+#define I2C1_RX_DMA_CHANNEL DMA_CH1
+#define I2C1_RX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define I2C1_RX_DMA_TRIG_SELECT AOS_DMA1_1
+#define I2C1_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH1
+#define I2C1_RX_DMA_IRQn BSP_DMA1_CH1_IRQ_NUM
+#define I2C1_RX_DMA_INT_PRIO BSP_DMA1_CH1_IRQ_PRIO
+#define I2C1_RX_DMA_INT_SRC INT_SRC_DMA1_TC1
+#endif
+
+/* DMA1 ch2 */
+#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_INSTANCE)
+#define SPI2_RX_DMA_INSTANCE CM_DMA1
+#define SPI2_RX_DMA_CHANNEL DMA_CH2
+#define SPI2_RX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define SPI2_RX_DMA_TRIG_SELECT AOS_DMA1_2
+#define SPI2_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH2
+#define SPI2_RX_DMA_IRQn BSP_DMA1_CH2_IRQ_NUM
+#define SPI2_RX_DMA_INT_PRIO BSP_DMA1_CH2_IRQ_PRIO
+#define SPI2_RX_DMA_INT_SRC INT_SRC_DMA1_TC2
+
+#elif defined(BSP_I2C2_TX_USING_DMA) && !defined(I2C2_TX_DMA_INSTANCE)
+#define I2C2_TX_DMA_INSTANCE CM_DMA1
+#define I2C2_TX_DMA_CHANNEL DMA_CH2
+#define I2C2_TX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define I2C2_TX_DMA_TRIG_SELECT AOS_DMA1_2
+#define I2C2_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH2
+#define I2C2_TX_DMA_IRQn BSP_DMA1_CH2_IRQ_NUM
+#define I2C2_TX_DMA_INT_PRIO BSP_DMA1_CH2_IRQ_PRIO
+#define I2C2_TX_DMA_INT_SRC INT_SRC_DMA1_TC2
+#endif
+
+/* DMA1 ch3 */
+#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_INSTANCE)
+#define SPI2_TX_DMA_INSTANCE CM_DMA1
+#define SPI2_TX_DMA_CHANNEL DMA_CH3
+#define SPI2_TX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define SPI2_TX_DMA_TRIG_SELECT AOS_DMA1_3
+#define SPI2_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH3
+#define SPI2_TX_DMA_IRQn BSP_DMA1_CH3_IRQ_NUM
+#define SPI2_TX_DMA_INT_PRIO BSP_DMA1_CH3_IRQ_PRIO
+#define SPI2_TX_DMA_INT_SRC INT_SRC_DMA1_TC3
+
+
+#elif defined(BSP_I2C2_RX_USING_DMA) && !defined(I2C2_RX_DMA_INSTANCE)
+#define I2C2_RX_DMA_INSTANCE CM_DMA1
+#define I2C2_RX_DMA_CHANNEL DMA_CH3
+#define I2C2_RX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define I2C2_RX_DMA_TRIG_SELECT AOS_DMA1_3
+#define I2C2_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH3
+#define I2C2_RX_DMA_IRQn BSP_DMA1_CH3_IRQ_NUM
+#define I2C2_RX_DMA_INT_PRIO BSP_DMA1_CH3_IRQ_PRIO
+#define I2C2_RX_DMA_INT_SRC INT_SRC_DMA1_TC3
+
+#elif defined(BSP_ADC1_USING_DMA) && !defined(ADC1_EOCA_DMA_INSTANCE)
+#define ADC1_EOCA_DMA_INSTANCE CM_DMA1
+#define ADC1_EOCA_DMA_CHANNEL DMA_CH3
+#define ADC1_EOCA_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define ADC1_EOCA_DMA_TRIG_SELECT AOS_DMA1_3
+#define ADC1_EOCA_DMA_TRANS_FLAG DMA_FLAG_TC_CH3
+#define ADC1_EOCA_DMA_IRQn BSP_DMA1_CH3_IRQ_NUM
+#define ADC1_EOCA_DMA_INT_PRIO BSP_DMA1_CH3_IRQ_PRIO
+#define ADC1_EOCA_DMA_INT_SRC INT_SRC_DMA1_TC3
+
+#endif
+
+/* DMA1 ch4 */
+#if defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_INSTANCE)
+#define UART5_RX_DMA_INSTANCE CM_DMA1
+#define UART5_RX_DMA_CHANNEL DMA_CH4
+#define UART5_RX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define UART5_RX_DMA_TRIG_SELECT AOS_DMA1_4
+#define UART5_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH4
+#define UART5_RX_DMA_IRQn BSP_DMA1_CH4_IRQ_NUM
+#define UART5_RX_DMA_INT_PRIO BSP_DMA1_CH4_IRQ_PRIO
+#define UART5_RX_DMA_INT_SRC INT_SRC_DMA1_TC4
+
+#elif defined(BSP_ADC2_USING_DMA) && !defined(ADC2_EOCA_DMA_INSTANCE)
+#define ADC2_EOCA_DMA_INSTANCE CM_DMA1
+#define ADC2_EOCA_DMA_CHANNEL DMA_CH4
+#define ADC2_EOCA_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define ADC2_EOCA_DMA_TRIG_SELECT AOS_DMA1_4
+#define ADC2_EOCA_DMA_TRANS_FLAG DMA_FLAG_TC_CH4
+#define ADC2_EOCA_DMA_IRQn BSP_DMA1_CH4_IRQ_NUM
+#define ADC2_EOCA_DMA_INT_PRIO BSP_DMA1_CH4_IRQ_PRIO
+#define ADC2_EOCA_DMA_INT_SRC INT_SRC_DMA1_TC4
+#endif
+
+/* DMA1 ch5 */
+#if defined(BSP_UART5_TX_USING_DMA) && !defined(UART5_TX_DMA_INSTANCE)
+#define UART5_TX_DMA_INSTANCE CM_DMA1
+#define UART5_TX_DMA_CHANNEL DMA_CH5
+#define UART5_TX_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define UART5_TX_DMA_TRIG_SELECT AOS_DMA1_5
+#define UART5_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH5
+#define UART5_TX_DMA_IRQn BSP_DMA1_CH5_IRQ_NUM
+#define UART5_TX_DMA_INT_PRIO BSP_DMA1_CH5_IRQ_PRIO
+#define UART5_TX_DMA_INT_SRC INT_SRC_DMA1_TC5
+
+#elif defined(BSP_ADC3_USING_DMA) && !defined(ADC3_EOCA_DMA_INSTANCE)
+#define ADC3_EOCA_DMA_INSTANCE CM_DMA1
+#define ADC3_EOCA_DMA_CHANNEL DMA_CH5
+#define ADC3_EOCA_DMA_CLOCK (PWC_FCG0_DMA1 | PWC_FCG0_AOS)
+#define ADC3_EOCA_DMA_TRIG_SELECT AOS_DMA1_5
+#define ADC3_EOCA_DMA_TRANS_FLAG DMA_FLAG_TC_CH5
+#define ADC3_EOCA_DMA_IRQn BSP_DMA1_CH5_IRQ_NUM
+#define ADC3_EOCA_DMA_INT_PRIO BSP_DMA1_CH5_IRQ_PRIO
+#define ADC3_EOCA_DMA_INT_SRC INT_SRC_DMA1_TC5
+#endif
+
+/* DMA2 ch0 */
+#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_INSTANCE)
+#define UART1_RX_DMA_INSTANCE CM_DMA2
+#define UART1_RX_DMA_CHANNEL DMA_CH0
+#define UART1_RX_DMA_CLOCK (PWC_FCG0_DMA2 | PWC_FCG0_AOS)
+#define UART1_RX_DMA_TRIG_SELECT AOS_DMA2_0
+#define UART1_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH0
+#define UART1_RX_DMA_IRQn BSP_DMA2_CH0_IRQ_NUM
+#define UART1_RX_DMA_INT_PRIO BSP_DMA2_CH0_IRQ_PRIO
+#define UART1_RX_DMA_INT_SRC INT_SRC_DMA2_TC0
+#endif
+
+/* DMA2 ch1 */
+#if defined(BSP_UART1_TX_USING_DMA) && !defined(UART1_TX_DMA_INSTANCE)
+#define UART1_TX_DMA_INSTANCE CM_DMA2
+#define UART1_TX_DMA_CHANNEL DMA_CH1
+#define UART1_TX_DMA_CLOCK (PWC_FCG0_DMA2 | PWC_FCG0_AOS)
+#define UART1_TX_DMA_TRIG_SELECT AOS_DMA2_1
+#define UART1_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH1
+#define UART1_TX_DMA_IRQn BSP_DMA2_CH1_IRQ_NUM
+#define UART1_TX_DMA_INT_PRIO BSP_DMA2_CH1_IRQ_PRIO
+#define UART1_TX_DMA_INT_SRC INT_SRC_DMA2_TC1
+#endif
+
+/* DMA2 ch2 */
+#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_INSTANCE)
+#define UART2_RX_DMA_INSTANCE CM_DMA2
+#define UART2_RX_DMA_CHANNEL DMA_CH2
+#define UART2_RX_DMA_CLOCK (PWC_FCG0_DMA2 | PWC_FCG0_AOS)
+#define UART2_RX_DMA_TRIG_SELECT AOS_DMA2_2
+#define UART2_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH2
+#define UART2_RX_DMA_IRQn BSP_DMA2_CH2_IRQ_NUM
+#define UART2_RX_DMA_INT_PRIO BSP_DMA2_CH2_IRQ_PRIO
+#define UART2_RX_DMA_INT_SRC INT_SRC_DMA2_TC2
+#endif
+
+/* DMA2 ch3 */
+#if defined(BSP_UART2_TX_USING_DMA) && !defined(UART2_TX_DMA_INSTANCE)
+#define UART2_TX_DMA_INSTANCE CM_DMA2
+#define UART2_TX_DMA_CHANNEL DMA_CH3
+#define UART2_TX_DMA_CLOCK (PWC_FCG0_DMA2 | PWC_FCG0_AOS)
+#define UART2_TX_DMA_TRIG_SELECT AOS_DMA2_3
+#define UART2_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH3
+#define UART2_TX_DMA_IRQn BSP_DMA2_CH3_IRQ_NUM
+#define UART2_TX_DMA_INT_PRIO BSP_DMA2_CH3_IRQ_PRIO
+#define UART2_TX_DMA_INT_SRC INT_SRC_DMA2_TC3
+#endif
+
+/* DMA2 ch4 */
+#if defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_INSTANCE)
+#define UART4_RX_DMA_INSTANCE CM_DMA2
+#define UART4_RX_DMA_CHANNEL DMA_CH4
+#define UART4_RX_DMA_CLOCK (PWC_FCG0_DMA2 | PWC_FCG0_AOS)
+#define UART4_RX_DMA_TRIG_SELECT AOS_DMA2_4
+#define UART4_RX_DMA_TRANS_FLAG DMA_FLAG_TC_CH4
+#define UART4_RX_DMA_IRQn BSP_DMA2_CH4_IRQ_NUM
+#define UART4_RX_DMA_INT_PRIO BSP_DMA2_CH4_IRQ_PRIO
+#define UART4_RX_DMA_INT_SRC INT_SRC_DMA2_TC4
+#endif
+
+/* DMA2 ch5 */
+#if defined(BSP_UART4_TX_USING_DMA) && !defined(UART4_TX_DMA_INSTANCE)
+#define UART4_TX_DMA_INSTANCE CM_DMA2
+#define UART4_TX_DMA_CHANNEL DMA_CH5
+#define UART4_TX_DMA_CLOCK (PWC_FCG0_DMA2 | PWC_FCG0_AOS)
+#define UART4_TX_DMA_TRIG_SELECT AOS_DMA2_5
+#define UART4_TX_DMA_TRANS_FLAG DMA_FLAG_TC_CH5
+#define UART4_TX_DMA_IRQn BSP_DMA2_CH5_IRQ_NUM
+#define UART4_TX_DMA_INT_PRIO BSP_DMA2_CH5_IRQ_PRIO
+#define UART4_TX_DMA_INT_SRC INT_SRC_DMA2_TC5
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __DMA_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/gpio_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/gpio_config.h
new file mode 100644
index 0000000000..a0bbb41e1a
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/gpio_config.h
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __GPIO_CONFIG_H__
+#define __GPIO_CONFIG_H__
+
+#include
+#include "irq_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if defined(RT_USING_PIN)
+
+#ifndef EXTINT0_IRQ_CONFIG
+#define EXTINT0_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT0_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT0_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ0, \
+ }
+#endif /* EXTINT1_IRQ_CONFIG */
+
+#ifndef EXTINT1_IRQ_CONFIG
+#define EXTINT1_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT1_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT1_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ1, \
+ }
+#endif /* EXTINT1_IRQ_CONFIG */
+
+#ifndef EXTINT2_IRQ_CONFIG
+#define EXTINT2_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT2_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT2_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ2, \
+ }
+#endif /* EXTINT2_IRQ_CONFIG */
+
+#ifndef EXTINT3_IRQ_CONFIG
+#define EXTINT3_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT3_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT3_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ3, \
+ }
+#endif /* EXTINT3_IRQ_CONFIG */
+
+#ifndef EXTINT4_IRQ_CONFIG
+#define EXTINT4_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT4_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT4_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ4, \
+ }
+#endif /* EXTINT4_IRQ_CONFIG */
+
+#ifndef EXTINT5_IRQ_CONFIG
+#define EXTINT5_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT5_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT5_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ5, \
+ }
+#endif /* EXTINT5_IRQ_CONFIG */
+
+#ifndef EXTINT6_IRQ_CONFIG
+#define EXTINT6_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT6_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT6_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ6, \
+ }
+#endif /* EXTINT6_IRQ_CONFIG */
+
+#ifndef EXTINT7_IRQ_CONFIG
+#define EXTINT7_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT7_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT7_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ7, \
+ }
+#endif /* EXTINT7_IRQ_CONFIG */
+
+#ifndef EXTINT8_IRQ_CONFIG
+#define EXTINT8_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT8_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT8_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ8, \
+ }
+#endif /* EXTINT8_IRQ_CONFIG */
+
+#ifndef EXTINT9_IRQ_CONFIG
+#define EXTINT9_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT9_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT9_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ9, \
+ }
+#endif /* EXTINT9_IRQ_CONFIG */
+
+#ifndef EXTINT10_IRQ_CONFIG
+#define EXTINT10_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT10_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT10_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ10, \
+ }
+#endif /* EXTINT10_IRQ_CONFIG */
+
+#ifndef EXTINT11_IRQ_CONFIG
+#define EXTINT11_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT11_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT11_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ11, \
+ }
+#endif /* EXTINT11_IRQ_CONFIG */
+
+#ifndef EXTINT12_IRQ_CONFIG
+#define EXTINT12_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT12_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT12_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ12, \
+ }
+#endif /* EXTINT12_IRQ_CONFIG */
+
+#ifndef EXTINT13_IRQ_CONFIG
+#define EXTINT13_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT13_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT13_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ13, \
+ }
+#endif /* EXTINT13_IRQ_CONFIG */
+
+#ifndef EXTINT14_IRQ_CONFIG
+#define EXTINT14_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT14_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT14_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ14, \
+ }
+#endif /* EXTINT14_IRQ_CONFIG */
+
+#ifndef EXTINT15_IRQ_CONFIG
+#define EXTINT15_IRQ_CONFIG \
+ { \
+ .irq_num = BSP_EXTINT15_IRQ_NUM, \
+ .irq_prio = BSP_EXTINT15_IRQ_PRIO, \
+ .int_src = INT_SRC_PORT_EIRQ15, \
+ }
+#endif /* EXTINT15_IRQ_CONFIG */
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GPIO_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/i2c_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/i2c_config.h
new file mode 100644
index 0000000000..8f7c6b6296
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/i2c_config.h
@@ -0,0 +1,332 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __I2C_CONFIG_H__
+#define __I2C_CONFIG_H__
+
+#include
+#include "irq_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(BSP_USING_I2C1)
+#ifndef I2C1_CONFIG
+#define I2C1_CONFIG \
+ { \
+ .name = "i2c1", \
+ .Instance = CM_I2C1, \
+ .clock = FCG1_PERIPH_I2C1, \
+ .baudrate = 100000UL, \
+ .timeout = 10000UL, \
+ }
+#endif /* I2C1_CONFIG */
+#endif
+
+#if defined(BSP_I2C1_USING_DMA)
+#ifndef I2C1_TX_DMA_CONFIG
+#define I2C1_TX_DMA_CONFIG \
+ { \
+ .Instance = I2C1_TX_DMA_INSTANCE, \
+ .channel = I2C1_TX_DMA_CHANNEL, \
+ .clock = I2C1_TX_DMA_CLOCK, \
+ .trigger_select = I2C1_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C1_TEI, \
+ .flag = I2C1_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C1_TX_DMA_IRQn, \
+ .irq_prio = I2C1_TX_DMA_INT_PRIO, \
+ .int_src = I2C1_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C1_TX_DMA_CONFIG */
+
+#ifndef I2C1_RX_DMA_CONFIG
+#define I2C1_RX_DMA_CONFIG \
+ { \
+ .Instance = I2C1_RX_DMA_INSTANCE, \
+ .channel = I2C1_RX_DMA_CHANNEL, \
+ .clock = I2C1_RX_DMA_CLOCK, \
+ .trigger_select = I2C1_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C1_RXI, \
+ .flag = I2C1_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C1_RX_DMA_IRQn, \
+ .irq_prio = I2C1_RX_DMA_INT_PRIO, \
+ .int_src = I2C1_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C1_RX_DMA_CONFIG */
+#endif /* BSP_I2C1_USING_DMA */
+
+#if defined(BSP_USING_I2C2)
+#ifndef I2C2_CONFIG
+#define I2C2_CONFIG \
+ { \
+ .name = "i2c2", \
+ .Instance = CM_I2C2, \
+ .clock = FCG1_PERIPH_I2C2, \
+ .baudrate = 100000UL, \
+ .timeout = 10000UL, \
+ }
+#endif /* I2C2_CONFIG */
+
+#if defined(BSP_I2C2_USING_DMA)
+#ifndef I2C2_TX_DMA_CONFIG
+#define I2C2_TX_DMA_CONFIG \
+ { \
+ .Instance = I2C2_TX_DMA_INSTANCE, \
+ .channel = I2C2_TX_DMA_CHANNEL, \
+ .clock = I2C2_TX_DMA_CLOCK, \
+ .trigger_select = I2C2_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C2_TEI, \
+ .flag = I2C2_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C2_TX_DMA_IRQn, \
+ .irq_prio = I2C2_TX_DMA_INT_PRIO, \
+ .int_src = I2C2_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C2_TX_DMA_CONFIG */
+
+#ifndef I2C2_RX_DMA_CONFIG
+#define I2C2_RX_DMA_CONFIG \
+ { \
+ .Instance = I2C2_RX_DMA_INSTANCE, \
+ .channel = I2C2_RX_DMA_CHANNEL, \
+ .clock = I2C2_RX_DMA_CLOCK, \
+ .trigger_select = I2C2_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C2_RXI, \
+ .flag = I2C2_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C2_RX_DMA_IRQn, \
+ .irq_prio = I2C2_RX_DMA_INT_PRIO, \
+ .int_src = I2C2_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C2_RX_DMA_CONFIG */
+#endif /* BSP_I2C2_USING_DMA */
+#endif
+
+#if defined(BSP_USING_I2C3)
+#ifndef I2C3_CONFIG
+#define I2C3_CONFIG \
+ { \
+ .name = "i2c3", \
+ .Instance = CM_I2C3, \
+ .clock = FCG1_PERIPH_I2C3, \
+ .baudrate = 100000UL, \
+ .timeout = 10000UL, \
+ }
+#endif /* I2C3_CONFIG */
+
+#if defined(BSP_I2C3_USING_DMA)
+#ifndef I2C3_TX_DMA_CONFIG
+#define I2C3_TX_DMA_CONFIG \
+ { \
+ .Instance = I2C3_TX_DMA_INSTANCE, \
+ .channel = I2C3_TX_DMA_CHANNEL, \
+ .clock = I2C3_TX_DMA_CLOCK, \
+ .trigger_select = I2C3_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C3_TEI, \
+ .flag = I2C3_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C3_TX_DMA_IRQn, \
+ .irq_prio = I2C3_TX_DMA_INT_PRIO, \
+ .int_src = I2C3_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C3_TX_DMA_CONFIG */
+
+#ifndef I2C3_RX_DMA_CONFIG
+#define I2C3_RX_DMA_CONFIG \
+ { \
+ .Instance = I2C3_RX_DMA_INSTANCE, \
+ .channel = I2C3_RX_DMA_CHANNEL, \
+ .clock = I2C3_RX_DMA_CLOCK, \
+ .trigger_select = I2C3_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C3_RXI, \
+ .flag = I2C3_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C3_RX_DMA_IRQn, \
+ .irq_prio = I2C3_RX_DMA_INT_PRIO, \
+ .int_src = I2C3_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C3_RX_DMA_CONFIG */
+#endif /* BSP_I2C3_USING_DMA */
+#endif
+
+#if defined(BSP_USING_I2C4)
+#ifndef I2C4_CONFIG
+#define I2C4_CONFIG \
+ { \
+ .name = "i2c4", \
+ .Instance = CM_I2C4, \
+ .clock = FCG1_PERIPH_I2C4, \
+ .baudrate = 100000UL, \
+ .timeout = 10000UL, \
+ }
+#endif /* I2C4_CONFIG */
+
+#if defined(BSP_I2C4_USING_DMA)
+#ifndef I2C4_TX_DMA_CONFIG
+#define I2C4_TX_DMA_CONFIG \
+ { \
+ .Instance = I2C4_TX_DMA_INSTANCE, \
+ .channel = I2C4_TX_DMA_CHANNEL, \
+ .clock = I2C4_TX_DMA_CLOCK, \
+ .trigger_select = I2C4_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C4_TEI, \
+ .flag = I2C4_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C4_TX_DMA_IRQn, \
+ .irq_prio = I2C4_TX_DMA_INT_PRIO, \
+ .int_src = I2C4_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C4_TX_DMA_CONFIG */
+
+#ifndef I2C4_RX_DMA_CONFIG
+#define I2C4_RX_DMA_CONFIG \
+ { \
+ .Instance = I2C4_RX_DMA_INSTANCE, \
+ .channel = I2C4_RX_DMA_CHANNEL, \
+ .clock = I2C4_RX_DMA_CLOCK, \
+ .trigger_select = I2C4_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C4_RXI, \
+ .flag = I2C4_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C4_RX_DMA_IRQn, \
+ .irq_prio = I2C4_RX_DMA_INT_PRIO, \
+ .int_src = I2C4_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C4_RX_DMA_CONFIG */
+#endif /* BSP_I2C4_USING_DMA */
+#endif
+
+#if defined(BSP_USING_I2C5)
+#ifndef I2C5_CONFIG
+#define I2C5_CONFIG \
+ { \
+ .name = "i2c5", \
+ .Instance = CM_I2C5, \
+ .clock = FCG1_PERIPH_I2C5, \
+ .baudrate = 100000UL, \
+ .timeout = 10000UL, \
+ }
+#endif /* I2C5_CONFIG */
+
+#if defined(BSP_I2C5_USING_DMA)
+#ifndef I2C5_TX_DMA_CONFIG
+#define I2C5_TX_DMA_CONFIG \
+ { \
+ .Instance = I2C5_TX_DMA_INSTANCE, \
+ .channel = I2C5_TX_DMA_CHANNEL, \
+ .clock = I2C5_TX_DMA_CLOCK, \
+ .trigger_select = I2C5_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C5_TEI, \
+ .flag = I2C5_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C5_TX_DMA_IRQn, \
+ .irq_prio = I2C5_TX_DMA_INT_PRIO, \
+ .int_src = I2C5_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C5_TX_DMA_CONFIG */
+
+#ifndef I2C5_RX_DMA_CONFIG
+#define I2C5_RX_DMA_CONFIG \
+ { \
+ .Instance = I2C5_RX_DMA_INSTANCE, \
+ .channel = I2C5_RX_DMA_CHANNEL, \
+ .clock = I2C5_RX_DMA_CLOCK, \
+ .trigger_select = I2C5_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C5_RXI, \
+ .flag = I2C5_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C5_RX_DMA_IRQn, \
+ .irq_prio = I2C5_RX_DMA_INT_PRIO, \
+ .int_src = I2C5_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C5_RX_DMA_CONFIG */
+#endif /* BSP_I2C5_USING_DMA */
+#endif
+
+#if defined(BSP_USING_I2C6)
+#ifndef I2C6_CONFIG
+#define I2C6_CONFIG \
+ { \
+ .name = "i2c6", \
+ .Instance = CM_I2C6, \
+ .clock = FCG1_PERIPH_I2C6, \
+ .baudrate = 100000UL, \
+ .timeout = 10000UL, \
+ }
+#endif /* I2C6_CONFIG */
+
+#if defined(BSP_I2C6_USING_DMA)
+#ifndef I2C6_TX_DMA_CONFIG
+#define I2C6_TX_DMA_CONFIG \
+ { \
+ .Instance = I2C6_TX_DMA_INSTANCE, \
+ .channel = I2C6_TX_DMA_CHANNEL, \
+ .clock = I2C6_TX_DMA_CLOCK, \
+ .trigger_select = I2C6_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C6_TEI, \
+ .flag = I2C6_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C6_TX_DMA_IRQn, \
+ .irq_prio = I2C6_TX_DMA_INT_PRIO, \
+ .int_src = I2C6_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C6_TX_DMA_CONFIG */
+
+#ifndef I2C6_RX_DMA_CONFIG
+#define I2C6_RX_DMA_CONFIG \
+ { \
+ .Instance = I2C6_RX_DMA_INSTANCE, \
+ .channel = I2C6_RX_DMA_CHANNEL, \
+ .clock = I2C6_RX_DMA_CLOCK, \
+ .trigger_select = I2C6_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_I2C6_RXI, \
+ .flag = I2C6_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = I2C6_RX_DMA_IRQn, \
+ .irq_prio = I2C6_RX_DMA_INT_PRIO, \
+ .int_src = I2C6_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* I2C6_RX_DMA_CONFIG */
+#endif /* BSP_I2C6_USING_DMA */
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h
new file mode 100644
index 0000000000..90d8d4f7ad
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __IRQ_CONFIG_H__
+#define __IRQ_CONFIG_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BSP_EXTINT0_IRQ_NUM EXTINT_PORT_EIRQ0_IRQn
+#define BSP_EXTINT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT1_IRQ_NUM EXTINT_PORT_EIRQ1_IRQn
+#define BSP_EXTINT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT2_IRQ_NUM EXTINT_PORT_EIRQ2_IRQn
+#define BSP_EXTINT2_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT3_IRQ_NUM EXTINT_PORT_EIRQ3_IRQn
+#define BSP_EXTINT3_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT4_IRQ_NUM EXTINT_PORT_EIRQ4_IRQn
+#define BSP_EXTINT4_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT5_IRQ_NUM EXTINT_PORT_EIRQ5_IRQn
+#define BSP_EXTINT5_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT6_IRQ_NUM EXTINT_PORT_EIRQ6_IRQn
+#define BSP_EXTINT6_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT7_IRQ_NUM EXTINT_PORT_EIRQ7_IRQn
+#define BSP_EXTINT7_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT8_IRQ_NUM EXTINT_PORT_EIRQ8_IRQn
+#define BSP_EXTINT8_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT9_IRQ_NUM EXTINT_PORT_EIRQ9_IRQn
+#define BSP_EXTINT9_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT10_IRQ_NUM EXTINT_PORT_EIRQ10_IRQn
+#define BSP_EXTINT10_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT11_IRQ_NUM EXTINT_PORT_EIRQ11_IRQn
+#define BSP_EXTINT11_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT12_IRQ_NUM EXTINT_PORT_EIRQ12_IRQn
+#define BSP_EXTINT12_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT13_IRQ_NUM EXTINT_PORT_EIRQ13_IRQn
+#define BSP_EXTINT13_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT14_IRQ_NUM EXTINT_PORT_EIRQ14_IRQn
+#define BSP_EXTINT14_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#define BSP_EXTINT15_IRQ_NUM EXTINT_PORT_EIRQ15_IRQn
+#define BSP_EXTINT15_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+
+/* DMA1 ch0 */
+#define BSP_DMA1_CH0_IRQ_NUM INT000_IRQn
+#define BSP_DMA1_CH0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA1 ch1 */
+#define BSP_DMA1_CH1_IRQ_NUM INT001_IRQn
+#define BSP_DMA1_CH1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA1 ch2 */
+#define BSP_DMA1_CH2_IRQ_NUM INT002_IRQn
+#define BSP_DMA1_CH2_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA1 ch3 */
+#define BSP_DMA1_CH3_IRQ_NUM INT003_IRQn
+#define BSP_DMA1_CH3_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA1 ch4 */
+#define BSP_DMA1_CH4_IRQ_NUM INT004_IRQn
+#define BSP_DMA1_CH4_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA1 ch5 */
+#define BSP_DMA1_CH5_IRQ_NUM INT005_IRQn
+#define BSP_DMA1_CH5_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+
+/* DMA2 ch0 */
+#define BSP_DMA2_CH0_IRQ_NUM INT006_IRQn
+#define BSP_DMA2_CH0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA2 ch1 */
+#define BSP_DMA2_CH1_IRQ_NUM INT007_IRQn
+#define BSP_DMA2_CH1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA2 ch2 */
+#define BSP_DMA2_CH2_IRQ_NUM INT008_IRQn
+#define BSP_DMA2_CH2_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA2 ch3 */
+#define BSP_DMA2_CH3_IRQ_NUM INT009_IRQn
+#define BSP_DMA2_CH3_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA2 ch4 */
+#define BSP_DMA2_CH4_IRQ_NUM INT010_IRQn
+#define BSP_DMA2_CH4_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+/* DMA2 ch5 */
+#define BSP_DMA2_CH5_IRQ_NUM INT011_IRQn
+#define BSP_DMA2_CH5_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+
+#if defined(BSP_USING_UART1)
+#define BSP_UART1_IRQ_NUM USART1_IRQn
+#define BSP_UART1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+
+#if (defined(RT_USING_SERIAL_V1) && defined(BSP_UART1_TX_USING_DMA)) || \
+ defined(RT_USING_SERIAL_V2)
+#define BSP_UART1_TX_CPLT_IRQ_NUM USART1_TCI_IRQn
+#define BSP_UART1_TX_CPLT_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif
+#endif /* BSP_USING_UART1 */
+
+#if defined(BSP_USING_UART2)
+#define BSP_UART2_IRQ_NUM USART2_IRQn
+#define BSP_UART2_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+
+#if (defined(RT_USING_SERIAL_V1) && defined(BSP_UART2_TX_USING_DMA)) || \
+ defined(RT_USING_SERIAL_V2)
+#define BSP_UART2_TX_CPLT_IRQ_NUM USART2_TCI_IRQn
+#define BSP_UART2_TX_CPLT_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif
+#endif /* BSP_USING_UART2 */
+
+#if defined(BSP_USING_UART3)
+#define BSP_UART3_IRQ_NUM USART3_IRQn
+#define BSP_UART3_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif /* BSP_USING_UART3 */
+
+#if defined(BSP_USING_UART4)
+#define BSP_UART4_IRQ_NUM USART4_IRQn
+#define BSP_UART4_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+
+#if (defined(RT_USING_SERIAL_V1) && defined(BSP_UART4_TX_USING_DMA)) || \
+ defined(RT_USING_SERIAL_V2)
+#define BSP_UART4_TX_CPLT_IRQ_NUM USART4_TCI_IRQn
+#define BSP_UART4_TX_CPLT_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif
+#endif /* BSP_USING_UART4 */
+
+#if defined(BSP_USING_UART5)
+#define BSP_UART5_IRQ_NUM USART5_IRQn
+#define BSP_UART5_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+
+#if (defined(RT_USING_SERIAL_V1) && defined(BSP_UART5_TX_USING_DMA)) || \
+ defined(RT_USING_SERIAL_V2)
+#define BSP_UART5_TX_CPLT_IRQ_NUM USART5_TCI_IRQn
+#define BSP_UART5_TX_CPLT_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif
+#endif /* BSP_USING_UART5 */
+
+#if defined(BSP_USING_UART6)
+#define BSP_UART6_IRQ_NUM USART6_IRQn
+#define BSP_UART6_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif /* BSP_USING_UART6 */
+
+#if defined(BSP_USING_SPI1)
+#define BSP_SPI1_ERR_IRQ_NUM SPI1_IRQn
+#define BSP_SPI1_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif
+
+#if defined(BSP_USING_SPI2)
+#define BSP_SPI2_ERR_IRQ_NUM SPI2_IRQn
+#define BSP_SPI2_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif
+
+#if defined(BSP_USING_SPI3)
+#define BSP_SPI3_ERR_IRQ_NUM SPI3_IRQn
+#define BSP_SPI3_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif
+
+#if defined(BSP_USING_TMRA_1)
+#define BSP_USING_TMRA_1_IRQ_NUM TMRA_1_OVF_UDF_IRQn
+#define BSP_USING_TMRA_1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif/* BSP_USING_TMRA_1 */
+
+#if defined(BSP_USING_TMRA_2)
+#define BSP_USING_TMRA_2_IRQ_NUM TMRA_2_OVF_UDF_IRQn
+#define BSP_USING_TMRA_2_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif/* BSP_USING_TMRA_2 */
+
+#if defined(BSP_USING_TMRA_3)
+#define BSP_USING_TMRA_3_IRQ_NUM TMRA_3_OVF_UDF_IRQn
+#define BSP_USING_TMRA_3_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif/* BSP_USING_TMRA_3 */
+
+#if defined(BSP_USING_TMRA_4)
+#define BSP_USING_TMRA_4_IRQ_NUM TMRA_4_OVF_UDF_IRQn
+#define BSP_USING_TMRA_4_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif/* BSP_USING_TMRA_4 */
+
+#if defined(BSP_USING_TMRA_5)
+#define BSP_USING_TMRA_5_IRQ_NUM TMRA_5_OVF_UDF_IRQn
+#define BSP_USING_TMRA_5_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif/* BSP_USING_TMRA_5 */
+
+#if defined(BSP_USING_CAN1)
+#define BSP_CAN1_IRQ_NUM MCAN1_INT0_IRQn
+#define BSP_CAN1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif/* BSP_USING_CAN1 */
+
+#if defined(RT_USING_ALARM)
+#define BSP_RTC_ALARM_IRQ_NUM RTC_IRQn
+#define BSP_RTC_ALARM_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT
+#endif/* RT_USING_ALARM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __IRQ_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/pm_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pm_config.h
new file mode 100644
index 0000000000..e77cc0f20e
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pm_config.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __PM_CONFIG_H__
+#define __PM_CONFIG_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef BSP_USING_PM
+extern void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode);
+
+#ifndef PM_TICKLESS_TIMER_ENABLE_MASK
+#define PM_TICKLESS_TIMER_ENABLE_MASK \
+( (1UL << PM_SLEEP_MODE_IDLE) | \
+ (1UL << PM_SLEEP_MODE_DEEP))
+#endif
+
+/**
+ * @brief run mode config @ref pm_run_mode_config structure
+ */
+#ifndef PM_RUN_MODE_CFG
+#define PM_RUN_MODE_CFG \
+ { \
+ .sys_clk_cfg = rt_hw_board_pm_sysclk_cfg \
+ }
+#endif /* PM_RUN_MODE_CFG */
+
+/**
+ * @brief sleep idle config @ref pm_sleep_mode_idle_config structure
+ */
+#ifndef PM_SLEEP_IDLE_CFG
+#define PM_SLEEP_IDLE_CFG \
+{ \
+ .pwc_sleep_type = PWC_SLEEP_WFE_INT, \
+}
+#endif /*PM_SLEEP_IDLE_CFG*/
+
+/**
+ * @brief sleep deep config @ref pm_sleep_mode_deep_config structure
+ */
+#ifndef PM_SLEEP_DEEP_CFG
+#define PM_SLEEP_DEEP_CFG \
+{ \
+ { \
+ .u16Clock = PWC_STOP_CLK_KEEP, \
+ .u8StopDrv = PWC_STOP_DRV_HIGH, \
+ .u16ExBusHold = PWC_STOP_EXBUS_HIZ, \
+ .u16FlashWait = PWC_STOP_FLASH_WAIT_ON, \
+ }, \
+ .pwc_stop_type = PWC_STOP_WFE_INT, \
+}
+#endif /*PM_SLEEP_DEEP_CFG*/
+
+/**
+ * @brief sleep standby config @ref pm_sleep_mode_standby_config structure
+ */
+#ifndef PM_SLEEP_STANDBY_CFG
+#define PM_SLEEP_STANDBY_CFG \
+{ \
+ { \
+ .u8Mode = PWC_PD_MD1, \
+ .u8IOState = PWC_PD_IO_KEEP1, \
+ .u8VcapCtrl = PWC_PD_VCAP_0P047UF, \
+ }, \
+}
+#endif /*PM_SLEEP_STANDBY_CFG*/
+
+/**
+ * @brief sleep shutdown config @ref pm_sleep_mode_shutdown_config structure
+ */
+#ifndef PM_SLEEP_SHUTDOWN_CFG
+#define PM_SLEEP_SHUTDOWN_CFG \
+{ \
+ { \
+ .u8Mode = PWC_PD_MD3, \
+ .u8IOState = PWC_PD_IO_KEEP1, \
+ .u8VcapCtrl = PWC_PD_VCAP_0P047UF, \
+ }, \
+}
+#endif /*PM_SLEEP_SHUTDOWN_CFG*/
+
+#endif /* BSP_USING_PM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __PM_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/pulse_encoder_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pulse_encoder_config.h
new file mode 100644
index 0000000000..47a947c6ab
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pulse_encoder_config.h
@@ -0,0 +1,545 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __PULSE_ENCODER_CONFIG_H__
+#define __PULSE_ENCODER_CONFIG_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(RT_USING_PULSE_ENCODER)
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_1
+#ifndef PULSE_ENCODER_TMRA_1_CONFIG
+#define PULSE_ENCODER_TMRA_1_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_1, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_1, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_1_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_1_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_1_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_1_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_1_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_1_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a1" \
+ }
+#endif /* PULSE_ENCODER_TMRA_1_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_1 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_2
+#ifndef PULSE_ENCODER_TMRA_2_CONFIG
+#define PULSE_ENCODER_TMRA_2_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_2, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_2, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_2_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_2_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_2_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_2_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_2_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_2_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a2" \
+ }
+#endif /* PULSE_ENCODER_TMRA_2_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_2 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_3
+#ifndef PULSE_ENCODER_TMRA_3_CONFIG
+#define PULSE_ENCODER_TMRA_3_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_3, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_3, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_3_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_3_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_3_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_3_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_3_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_3_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a3" \
+ }
+#endif /* PULSE_ENCODER_TMRA_3_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_3 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_4
+#ifndef PULSE_ENCODER_TMRA_4_CONFIG
+#define PULSE_ENCODER_TMRA_4_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_4, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_4, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_4_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_4_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_4_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_4_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_4_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_4_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a4" \
+ }
+#endif /* PULSE_ENCODER_TMRA_4_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_4 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_5
+#ifndef PULSE_ENCODER_TMRA_5_CONFIG
+#define PULSE_ENCODER_TMRA_5_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_5, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_5, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_5_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_5_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_5_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_5_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_5_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_5_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a5" \
+ }
+#endif /* PULSE_ENCODER_TMRA_5_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_5 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_6
+#ifndef PULSE_ENCODER_TMRA_6_CONFIG
+#define PULSE_ENCODER_TMRA_6_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_6, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_6, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_6_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_6_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_6_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_6_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_6_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_6_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a6" \
+ }
+#endif /* PULSE_ENCODER_TMRA_6_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_6 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_7
+#ifndef PULSE_ENCODER_TMRA_7_CONFIG
+#define PULSE_ENCODER_TMRA_7_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_7, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_7, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_7_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_7_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_7_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_7_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_7_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_7_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a7" \
+ }
+#endif /* PULSE_ENCODER_TMRA_7_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_7 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_8
+#ifndef PULSE_ENCODER_TMRA_8_CONFIG
+#define PULSE_ENCODER_TMRA_8_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_8, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_8, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_8_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_8_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_8_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_8_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_8_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_8_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a8" \
+ }
+#endif /* PULSE_ENCODER_TMRA_8_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_8 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_9
+#ifndef PULSE_ENCODER_TMRA_9_CONFIG
+#define PULSE_ENCODER_TMRA_9_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_9, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_9, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_9_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_9_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_9_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_9_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_9_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_9_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a9" \
+ }
+#endif /* PULSE_ENCODER_TMRA_9_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_9 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_10
+#ifndef PULSE_ENCODER_TMRA_10_CONFIG
+#define PULSE_ENCODER_TMRA_10_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_10, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_10, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_10_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_10_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_10_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_10_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_10_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_10_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a10" \
+ }
+#endif /* PULSE_ENCODER_TMRA_10_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_10 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_11
+#ifndef PULSE_ENCODER_TMRA_11_CONFIG
+#define PULSE_ENCODER_TMRA_11_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_11, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_11, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_11_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_11_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_11_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_11_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_11_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_11_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a11" \
+ }
+#endif /* PULSE_ENCODER_TMRA_11_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_11 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMRA_12
+#ifndef PULSE_ENCODER_TMRA_12_CONFIG
+#define PULSE_ENCODER_TMRA_12_CONFIG \
+ { \
+ .tmr_handler = CM_TMRA_12, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMRA_12, \
+ .hw_count = \
+ { \
+ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \
+ .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMRA_12_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_12_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_12_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMRA_12_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_12_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_12_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_a12" \
+ }
+#endif /* PULSE_ENCODER_TMRA_12_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMRA_12 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMR6_1
+#ifndef PULSE_ENCODER_TMR6_1_CONFIG
+#define PULSE_ENCODER_TMR6_1_CONFIG \
+ { \
+ .tmr_handler = CM_TMR6_1, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMR6_1, \
+ .hw_count = \
+ { \
+ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \
+ .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMR6_1_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_1_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_1_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMR6_1_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_1_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_1_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_61" \
+ }
+#endif /* PULSE_ENCODER_TMR6_1_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMR6_1 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMR6_2
+#ifndef PULSE_ENCODER_TMR6_2_CONFIG
+#define PULSE_ENCODER_TMR6_2_CONFIG \
+ { \
+ .tmr_handler = CM_TMR6_2, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMR6_2, \
+ .hw_count = \
+ { \
+ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \
+ .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMR6_2_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_2_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_2_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMR6_2_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_62" \
+ }
+#endif /* PULSE_ENCODER_TMR6_2_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMR6_2 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMR6_3
+#ifndef PULSE_ENCODER_TMR6_3_CONFIG
+#define PULSE_ENCODER_TMR6_3_CONFIG \
+ { \
+ .tmr_handler = CM_TMR6_3, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMR6_3, \
+ .hw_count = \
+ { \
+ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \
+ .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMR6_3_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_3_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_3_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMR6_3_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_3_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_3_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_63" \
+ }
+#endif /* PULSE_ENCODER_TMR6_3_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMR6_3 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMR6_4
+#ifndef PULSE_ENCODER_TMR6_4_CONFIG
+#define PULSE_ENCODER_TMR6_4_CONFIG \
+ { \
+ .tmr_handler = CM_TMR6_4, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMR6_4, \
+ .hw_count = \
+ { \
+ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \
+ .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMR6_4_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_4_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_4_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMR6_4_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_4_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_4_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_64" \
+ }
+#endif /* PULSE_ENCODER_TMR6_4_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMR6_4 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMR6_5
+#ifndef PULSE_ENCODER_TMR6_5_CONFIG
+#define PULSE_ENCODER_TMR6_5_CONFIG \
+ { \
+ .tmr_handler = CM_TMR6_5, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMR6_5, \
+ .hw_count = \
+ { \
+ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \
+ .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMR6_5_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_5_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_5_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMR6_5_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_5_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_5_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_65" \
+ }
+#endif /* PULSE_ENCODER_TMR6_5_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMR6_5 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMR6_6
+#ifndef PULSE_ENCODER_TMR6_6_CONFIG
+#define PULSE_ENCODER_TMR6_6_CONFIG \
+ { \
+ .tmr_handler = CM_TMR6_6, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMR6_6, \
+ .hw_count = \
+ { \
+ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \
+ .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMR6_6_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_6_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_6_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMR6_6_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_6_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_6_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_66" \
+ }
+#endif /* PULSE_ENCODER_TMR6_6_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMR6_6 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMR6_7
+#ifndef PULSE_ENCODER_TMR6_7_CONFIG
+#define PULSE_ENCODER_TMR6_7_CONFIG \
+ { \
+ .tmr_handler = CM_TMR6_7, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMR6_7, \
+ .hw_count = \
+ { \
+ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \
+ .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMR6_7_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_7_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_7_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMR6_7_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_7_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_7_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_67" \
+ }
+#endif /* PULSE_ENCODER_TMR6_7_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMR6_7 */
+
+#ifdef BSP_USING_PULSE_ENCODER_TMR6_8
+#ifndef PULSE_ENCODER_TMR6_8_CONFIG
+#define PULSE_ENCODER_TMR6_8_CONFIG \
+ { \
+ .tmr_handler = CM_TMR6_8, \
+ .u32Fcg2Periph = FCG2_PERIPH_TMR6_8, \
+ .hw_count = \
+ { \
+ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \
+ .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \
+ }, \
+ .isr = \
+ { \
+ .enIntSrc_OVF = INT_SRC_TMR6_8_OVF, \
+ .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_8_OVF_IRQ_NUM, \
+ .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_8_OVF_IRQ_PRIO, \
+ .enIntSrc_UDF = INT_SRC_TMR6_8_UDF, \
+ .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_8_UDF_IRQ_NUM, \
+ .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_8_UDF_IRQ_PRIO, \
+ }, \
+ .u32PeriodValue = 1000UL, \
+ .name = "pulse_68" \
+ }
+#endif /* PULSE_ENCODER_TMR6_8_CONFIG */
+#endif /* BSP_USING_PULSE_ENCODER_TMR6_8 */
+
+#endif /* RT_USING_PULSE_ENCODER */
+
+#endif /* __PULSE_ENCODER_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/pwm_tmr_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pwm_tmr_config.h
new file mode 100644
index 0000000000..f20d64d50d
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pwm_tmr_config.h
@@ -0,0 +1,882 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __PWM_TMR_CONFIG_H__
+#define __PWM_TMR_CONFIG_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef BSP_USING_PWM_TMRA
+
+#ifdef BSP_USING_PWM_TMRA_1
+#ifndef PWM_TMRA_1_CONFIG
+#define PWM_TMRA_1_CONFIG \
+ { \
+ .name = "pwm_a1", \
+ .instance = CM_TMRA_1, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_1_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_1 */
+
+#ifdef BSP_USING_PWM_TMRA_2
+#ifndef PWM_TMRA_2_CONFIG
+#define PWM_TMRA_2_CONFIG \
+ { \
+ .name = "pwm_a2", \
+ .instance = CM_TMRA_2, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_2_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_2 */
+
+#ifdef BSP_USING_PWM_TMRA_3
+#ifndef PWM_TMRA_3_CONFIG
+#define PWM_TMRA_3_CONFIG \
+ { \
+ .name = "pwm_a3", \
+ .instance = CM_TMRA_3, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_3_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_3 */
+
+#ifdef BSP_USING_PWM_TMRA_4
+#ifndef PWM_TMRA_4_CONFIG
+#define PWM_TMRA_4_CONFIG \
+ { \
+ .name = "pwm_a4", \
+ .instance = CM_TMRA_4, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_4_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_4 */
+
+#ifdef BSP_USING_PWM_TMRA_5
+#ifndef PWM_TMRA_5_CONFIG
+#define PWM_TMRA_5_CONFIG \
+ { \
+ .name = "pwm_a5", \
+ .instance = CM_TMRA_5, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_5_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_5 */
+
+#ifdef BSP_USING_PWM_TMRA_6
+#ifndef PWM_TMRA_6_CONFIG
+#define PWM_TMRA_6_CONFIG \
+ { \
+ .name = "pwm_a6", \
+ .instance = CM_TMRA_6, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_6_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_6 */
+
+#ifdef BSP_USING_PWM_TMRA_7
+#ifndef PWM_TMRA_7_CONFIG
+#define PWM_TMRA_7_CONFIG \
+ { \
+ .name = "pwm_a7", \
+ .instance = CM_TMRA_7, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_7_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_7 */
+
+#ifdef BSP_USING_PWM_TMRA_8
+#ifndef PWM_TMRA_8_CONFIG
+#define PWM_TMRA_8_CONFIG \
+ { \
+ .name = "pwm_a8", \
+ .instance = CM_TMRA_8, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_8_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_8 */
+
+#ifdef BSP_USING_PWM_TMRA_9
+#ifndef PWM_TMRA_9_CONFIG
+#define PWM_TMRA_9_CONFIG \
+ { \
+ .name = "pwm_a9", \
+ .instance = CM_TMRA_9, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_9_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_9 */
+
+#ifdef BSP_USING_PWM_TMRA_10
+#ifndef PWM_TMRA_10_CONFIG
+#define PWM_TMRA_10_CONFIG \
+ { \
+ .name = "pwm_a10", \
+ .instance = CM_TMRA_10, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_10_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_10 */
+
+#ifdef BSP_USING_PWM_TMRA_11
+#ifndef PWM_TMRA_11_CONFIG
+#define PWM_TMRA_11_CONFIG \
+ { \
+ .name = "pwm_a11", \
+ .instance = CM_TMRA_11, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_11_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_11 */
+
+#ifdef BSP_USING_PWM_TMRA_12
+#ifndef PWM_TMRA_12_CONFIG
+#define PWM_TMRA_12_CONFIG \
+ { \
+ .name = "pwm_a12", \
+ .instance = CM_TMRA_12, \
+ .channel = 0, \
+ .stcTmraInit = \
+ { \
+ .u8CountSrc = TMRA_CNT_SRC_SW, \
+ .u32PeriodValue = 0xFFFF, \
+ .sw_count = \
+ { \
+ .u8ClockDiv = TMRA_CLK_DIV1, \
+ .u8CountMode = TMRA_MD_SAWTOOTH, \
+ .u8CountDir = TMRA_DIR_DOWN, \
+ }, \
+ .u8CountReload = TMRA_CNT_RELOAD_ENABLE\
+ }, \
+ .stcPwmInit = \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u16StartPolarity = TMRA_PWM_LOW, \
+ .u16StopPolarity = TMRA_PWM_LOW, \
+ .u16CompareMatchPolarity = TMRA_PWM_HIGH, \
+ .u16PeriodMatchPolarity = TMRA_PWM_LOW, \
+ }, \
+ }
+#endif /* PWM_TMRA_12_CONFIG */
+#endif /* BSP_USING_PWM_TMRA_12 */
+
+#endif /* BSP_USING_PWM_TMRA */
+
+#ifdef BSP_USING_PWM_TMR4
+
+#ifdef BSP_USING_PWM_TMR4_1
+#ifndef PWM_TMR4_1_CONFIG
+#define PWM_TMR4_1_CONFIG \
+ { \
+ .name = "pwm_t41", \
+ .instance = CM_TMR4_1, \
+ .channel = 0, \
+ .stcTmr4Init = \
+ { \
+ .u16ClockDiv = TMR4_CLK_DIV1, \
+ .u16PeriodValue = 0xFFFFU, \
+ .u16CountMode = TMR4_MD_SAWTOOTH, \
+ .u16ClockSrc = TMR4_CLK_SRC_INTERNCLK,\
+ }, \
+ .stcTmr4OcInit = \
+ { \
+ .u16CompareValue = 0x0000, \
+ .u16OcInvalidPolarity = TMR4_OC_INVD_LOW, \
+ .u16CompareModeBufCond = TMR4_OC_BUF_COND_IMMED,\
+ .u16CompareValueBufCond = TMR4_OC_BUF_COND_PEAK, \
+ .u16BufLinkTransObject = 0U, \
+ }, \
+ .stcTmr4PwmInit = \
+ { \
+ .u16Mode = TMR4_PWM_MD_THROUGH, \
+ .u16ClockDiv = TMR4_PWM_CLK_DIV1, \
+ .u16Polarity = TMR4_PWM_OXH_HOLD_OXL_HOLD,\
+ }, \
+ }
+#endif /* PWM_TMR4_1_CONFIG */
+#endif /* BSP_USING_PWM_TMR4_1 */
+
+#ifdef BSP_USING_PWM_TMR4_2
+#ifndef PWM_TMR4_2_CONFIG
+#define PWM_TMR4_2_CONFIG \
+ { \
+ .name = "pwm_t42", \
+ .instance = CM_TMR4_2, \
+ .channel = 0, \
+ .stcTmr4Init = \
+ { \
+ .u16ClockDiv = TMR4_CLK_DIV1, \
+ .u16PeriodValue = 0xFFFFU, \
+ .u16CountMode = TMR4_MD_SAWTOOTH, \
+ .u16ClockSrc = TMR4_CLK_SRC_INTERNCLK,\
+ }, \
+ .stcTmr4OcInit = \
+ { \
+ .u16CompareValue = 0x0000, \
+ .u16OcInvalidPolarity = TMR4_OC_INVD_LOW, \
+ .u16CompareModeBufCond = TMR4_OC_BUF_COND_IMMED,\
+ .u16CompareValueBufCond = TMR4_OC_BUF_COND_PEAK, \
+ .u16BufLinkTransObject = 0U, \
+ }, \
+ .stcTmr4PwmInit = \
+ { \
+ .u16Mode = TMR4_PWM_MD_THROUGH, \
+ .u16ClockDiv = TMR4_PWM_CLK_DIV1, \
+ .u16Polarity = TMR4_PWM_OXH_HOLD_OXL_HOLD,\
+ }, \
+ }
+#endif /* PWM_TMR4_2_CONFIG */
+#endif /* BSP_USING_PWM_TMR4_2 */
+
+#ifdef BSP_USING_PWM_TMR4_3
+#ifndef PWM_TMR4_3_CONFIG
+#define PWM_TMR4_3_CONFIG \
+ { \
+ .name = "pwm_t43", \
+ .instance = CM_TMR4_3, \
+ .channel = 0, \
+ .stcTmr4Init = \
+ { \
+ .u16ClockDiv = TMR4_CLK_DIV1, \
+ .u16PeriodValue = 0xFFFFU, \
+ .u16CountMode = TMR4_MD_SAWTOOTH, \
+ .u16ClockSrc = TMR4_CLK_SRC_INTERNCLK,\
+ }, \
+ .stcTmr4OcInit = \
+ { \
+ .u16CompareValue = 0x0000, \
+ .u16OcInvalidPolarity = TMR4_OC_INVD_LOW, \
+ .u16CompareModeBufCond = TMR4_OC_BUF_COND_IMMED,\
+ .u16CompareValueBufCond = TMR4_OC_BUF_COND_PEAK, \
+ .u16BufLinkTransObject = 0U, \
+ }, \
+ .stcTmr4PwmInit = \
+ { \
+ .u16Mode = TMR4_PWM_MD_THROUGH, \
+ .u16ClockDiv = TMR4_PWM_CLK_DIV1, \
+ .u16Polarity = TMR4_PWM_OXH_HOLD_OXL_HOLD,\
+ }, \
+ }
+#endif /* PWM_TMR4_3_CONFIG */
+#endif /* BSP_USING_PWM_TMR4_3 */
+
+#endif /* BSP_USING_PWM_TMR4 */
+
+#ifdef BSP_USING_PWM_TMR6
+
+#ifdef BSP_USING_PWM_TMR6_1
+#ifndef PWM_TMR6_1_CONFIG
+#define PWM_TMR6_1_CONFIG \
+ { \
+ .name = "pwm_t61", \
+ .instance = CM_TMR6_1, \
+ .channel = 0, \
+ .stcTmr6Init = \
+ { \
+ .u8CountSrc = TMR6_CNT_SRC_SW, \
+ .sw_count = \
+ { \
+ .u32ClockDiv = TMR6_CLK_DIV1, \
+ .u32CountMode = TMR6_MD_SAWTOOTH, \
+ .u32CountDir = TMR6_CNT_DOWN, \
+ }, \
+ .u32PeriodValue = 0xFFFF, \
+ .u32CountReload = TMR6_CNT_RELOAD_ON, \
+ }, \
+ .stcPwmInit = \
+ { \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ }, \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ } \
+ }, \
+ }
+#endif /* PWM_TMR6_1_CONFIG */
+#endif /* BSP_USING_PWM_TMR6_1 */
+#ifdef BSP_USING_PWM_TMR6_2
+#ifndef PWM_TMR6_2_CONFIG
+#define PWM_TMR6_2_CONFIG \
+ { \
+ .name = "pwm_t61", \
+ .instance = CM_TMR6_2, \
+ .channel = 0, \
+ .stcTmr6Init = \
+ { \
+ .u8CountSrc = TMR6_CNT_SRC_SW, \
+ .sw_count = \
+ { \
+ .u32ClockDiv = TMR6_CLK_DIV1, \
+ .u32CountMode = TMR6_MD_SAWTOOTH, \
+ .u32CountDir = TMR6_CNT_DOWN, \
+ }, \
+ .u32PeriodValue = 0xFFFF, \
+ .u32CountReload = TMR6_CNT_RELOAD_ON, \
+ }, \
+ .stcPwmInit = \
+ { \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ }, \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ } \
+ }, \
+ }
+#endif /* PWM_TMR6_2_CONFIG */
+#endif /* BSP_USING_PWM_TMR6_2 */
+#ifdef BSP_USING_PWM_TMR6_3
+#ifndef PWM_TMR6_3_CONFIG
+#define PWM_TMR6_3_CONFIG \
+ { \
+ .name = "pwm_t61", \
+ .instance = CM_TMR6_3, \
+ .channel = 0, \
+ .stcTmr6Init = \
+ { \
+ .u8CountSrc = TMR6_CNT_SRC_SW, \
+ .sw_count = \
+ { \
+ .u32ClockDiv = TMR6_CLK_DIV1, \
+ .u32CountMode = TMR6_MD_SAWTOOTH, \
+ .u32CountDir = TMR6_CNT_DOWN, \
+ }, \
+ .u32PeriodValue = 0xFFFF, \
+ .u32CountReload = TMR6_CNT_RELOAD_ON, \
+ }, \
+ .stcPwmInit = \
+ { \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ }, \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ } \
+ }, \
+ }
+#endif /* PWM_TMR6_3_CONFIG */
+#endif /* BSP_USING_PWM_TMR6_3 */
+#ifdef BSP_USING_PWM_TMR6_4
+#ifndef PWM_TMR6_4_CONFIG
+#define PWM_TMR6_4_CONFIG \
+ { \
+ .name = "pwm_t61", \
+ .instance = CM_TMR6_4, \
+ .channel = 0, \
+ .stcTmr6Init = \
+ { \
+ .u8CountSrc = TMR6_CNT_SRC_SW, \
+ .sw_count = \
+ { \
+ .u32ClockDiv = TMR6_CLK_DIV1, \
+ .u32CountMode = TMR6_MD_SAWTOOTH, \
+ .u32CountDir = TMR6_CNT_DOWN, \
+ }, \
+ .u32PeriodValue = 0xFFFF, \
+ .u32CountReload = TMR6_CNT_RELOAD_ON, \
+ }, \
+ .stcPwmInit = \
+ { \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ }, \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ } \
+ }, \
+ }
+#endif /* PWM_TMR6_4_CONFIG */
+#endif /* BSP_USING_PWM_TMR6_4 */
+#ifdef BSP_USING_PWM_TMR6_5
+#ifndef PWM_TMR6_5_CONFIG
+#define PWM_TMR6_5_CONFIG \
+ { \
+ .name = "pwm_t61", \
+ .instance = CM_TMR6_5, \
+ .channel = 0, \
+ .stcTmr6Init = \
+ { \
+ .u8CountSrc = TMR6_CNT_SRC_SW, \
+ .sw_count = \
+ { \
+ .u32ClockDiv = TMR6_CLK_DIV1, \
+ .u32CountMode = TMR6_MD_SAWTOOTH, \
+ .u32CountDir = TMR6_CNT_DOWN, \
+ }, \
+ .u32PeriodValue = 0xFFFF, \
+ .u32CountReload = TMR6_CNT_RELOAD_ON, \
+ }, \
+ .stcPwmInit = \
+ { \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ }, \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ } \
+ }, \
+ }
+#endif /* PWM_TMR6_5_CONFIG */
+#endif /* BSP_USING_PWM_TMR6_5 */
+#ifdef BSP_USING_PWM_TMR6_6
+#ifndef PWM_TMR6_6_CONFIG
+#define PWM_TMR6_6_CONFIG \
+ { \
+ .name = "pwm_t61", \
+ .instance = CM_TMR6_6, \
+ .channel = 0, \
+ .stcTmr6Init = \
+ { \
+ .u8CountSrc = TMR6_CNT_SRC_SW, \
+ .sw_count = \
+ { \
+ .u32ClockDiv = TMR6_CLK_DIV1, \
+ .u32CountMode = TMR6_MD_SAWTOOTH, \
+ .u32CountDir = TMR6_CNT_DOWN, \
+ }, \
+ .u32PeriodValue = 0xFFFF, \
+ .u32CountReload = TMR6_CNT_RELOAD_ON, \
+ }, \
+ .stcPwmInit = \
+ { \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ }, \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ } \
+ }, \
+ }
+#endif /* PWM_TMR6_6_CONFIG */
+#endif /* BSP_USING_PWM_TMR6_6 */
+#ifdef BSP_USING_PWM_TMR6_7
+#ifndef PWM_TMR6_7_CONFIG
+#define PWM_TMR6_7_CONFIG \
+ { \
+ .name = "pwm_t61", \
+ .instance = CM_TMR6_7, \
+ .channel = 0, \
+ .stcTmr6Init = \
+ { \
+ .u8CountSrc = TMR6_CNT_SRC_SW, \
+ .sw_count = \
+ { \
+ .u32ClockDiv = TMR6_CLK_DIV1, \
+ .u32CountMode = TMR6_MD_SAWTOOTH, \
+ .u32CountDir = TMR6_CNT_DOWN, \
+ }, \
+ .u32PeriodValue = 0xFFFF, \
+ .u32CountReload = TMR6_CNT_RELOAD_ON, \
+ }, \
+ .stcPwmInit = \
+ { \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ }, \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ } \
+ }, \
+ }
+#endif /* PWM_TMR6_7_CONFIG */
+#endif /* BSP_USING_PWM_TMR6_7 */
+#ifdef BSP_USING_PWM_TMR6_8
+#ifndef PWM_TMR6_8_CONFIG
+#define PWM_TMR6_8_CONFIG \
+ { \
+ .name = "pwm_t61", \
+ .instance = CM_TMR6_8, \
+ .channel = 0, \
+ .stcTmr6Init = \
+ { \
+ .u8CountSrc = TMR6_CNT_SRC_SW, \
+ .sw_count = \
+ { \
+ .u32ClockDiv = TMR6_CLK_DIV1, \
+ .u32CountMode = TMR6_MD_SAWTOOTH, \
+ .u32CountDir = TMR6_CNT_DOWN, \
+ }, \
+ .u32PeriodValue = 0xFFFF, \
+ .u32CountReload = TMR6_CNT_RELOAD_ON, \
+ }, \
+ .stcPwmInit = \
+ { \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ }, \
+ { \
+ .u32CompareValue = 0x0000, \
+ .u32StartPolarity = TMR6_PWM_LOW, \
+ .u32StopPolarity = TMR6_PWM_LOW, \
+ .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \
+ .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \
+ .u32UdfPolarity = TMR6_PWM_LOW, \
+ .u32OvfPolarity = TMR6_PWM_LOW, \
+ } \
+ }, \
+ }
+#endif /* PWM_TMR6_8_CONFIG */
+#endif /* BSP_USING_PWM_TMR6_8 */
+
+#endif /* BSP_USING_PWM_TMR6 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __PWM_TMRA_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/qspi_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/qspi_config.h
new file mode 100644
index 0000000000..f9df3687d2
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/qspi_config.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __QSPI_CONFIG_H__
+#define __QSPI_CONFIG_H__
+
+#include
+#include "irq_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef BSP_USING_QSPI
+#ifndef QSPI_BUS_CONFIG
+#define QSPI_BUS_CONFIG \
+ { \
+ .Instance = CM_QSPI, \
+ .clock = FCG1_PERIPH_QSPI, \
+ .timeout = 5000UL, \
+ .err_irq.irq_config = \
+ { \
+ .irq_num = BSP_QSPI_ERR_IRQ_NUM, \
+ .irq_prio = BSP_QSPI_ERR_IRQ_PRIO, \
+ .int_src = INT_SRC_QSPI_INTR, \
+ }, \
+ }
+#endif /* QSPI_BUS_CONFIG */
+
+#ifndef QSPI_INIT_PARAMS
+#define QSPI_INIT_PARAMS \
+ { \
+ .u32PrefetchMode = QSPI_PREFETCH_MD_INVD, \
+ .u32SetupTime = QSPI_QSSN_SETUP_ADVANCE_QSCK0P5, \
+ .u32ReleaseTime = QSPI_QSSN_RELEASE_DELAY_QSCK32, \
+ .u32IntervalTime = QSPI_QSSN_INTERVAL_QSCK1, \
+ }
+#endif /* QSPI_INIT_PARAMS */
+
+#define QSPI_WP_PIN_LEVEL QSPI_WP_PIN_HIGH
+
+#ifdef BSP_QSPI_USING_DMA
+#ifndef QSPI_DMA_CONFIG
+#define QSPI_DMA_CONFIG \
+ { \
+ .Instance = QSPI_DMA_INSTANCE, \
+ .channel = QSPI_DMA_CHANNEL, \
+ .clock = QSPI_DMA_CLOCK, \
+ .trigger_select = QSPI_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_AOS_STRG, \
+ .flag = QSPI_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = QSPI_DMA_IRQn, \
+ .irq_prio = QSPI_DMA_INT_PRIO, \
+ .int_src = QSPI_DMA_INT_SRC, \
+ } \
+ }
+#endif /* QSPI_DMA_CONFIG */
+#endif /* BSP_QSPI_USING_DMA */
+#endif /* BSP_USING_SPI1 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__QSPI_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/spi_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/spi_config.h
new file mode 100644
index 0000000000..3495e6ec34
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/spi_config.h
@@ -0,0 +1,377 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __SPI_CONFIG_H__
+#define __SPI_CONFIG_H__
+
+#include
+#include "irq_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef BSP_USING_SPI1
+#ifndef SPI1_BUS_CONFIG
+#define SPI1_BUS_CONFIG \
+ { \
+ .Instance = CM_SPI1, \
+ .bus_name = "spi1", \
+ .clock = FCG1_PERIPH_SPI1, \
+ .timeout = 5000UL, \
+ .err_irq.irq_config = \
+ { \
+ .irq_num = BSP_SPI1_ERR_IRQ_NUM, \
+ .irq_prio = BSP_SPI1_ERR_IRQ_PRIO, \
+ .int_src = INT_SRC_SPI1_SPEI, \
+ }, \
+ }
+#endif /* SPI1_BUS_CONFIG */
+#endif /* BSP_USING_SPI1 */
+
+#ifdef BSP_SPI1_TX_USING_DMA
+#ifndef SPI1_TX_DMA_CONFIG
+#define SPI1_TX_DMA_CONFIG \
+ { \
+ .Instance = SPI1_TX_DMA_INSTANCE, \
+ .channel = SPI1_TX_DMA_CHANNEL, \
+ .clock = SPI1_TX_DMA_CLOCK, \
+ .trigger_select = SPI1_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI1_SPTI, \
+ .flag = SPI1_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI1_TX_DMA_IRQn, \
+ .irq_prio = SPI1_TX_DMA_INT_PRIO, \
+ .int_src = SPI1_TX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI1_TX_DMA_CONFIG */
+#endif /* BSP_SPI1_TX_USING_DMA */
+
+#ifdef BSP_SPI1_RX_USING_DMA
+#ifndef SPI1_RX_DMA_CONFIG
+#define SPI1_RX_DMA_CONFIG \
+ { \
+ .Instance = SPI1_RX_DMA_INSTANCE, \
+ .channel = SPI1_RX_DMA_CHANNEL, \
+ .clock = SPI1_RX_DMA_CLOCK, \
+ .trigger_select = SPI1_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI1_SPRI, \
+ .flag = SPI1_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI1_RX_DMA_IRQn, \
+ .irq_prio = SPI1_RX_DMA_INT_PRIO, \
+ .int_src = SPI1_RX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI1_RX_DMA_CONFIG */
+#endif /* BSP_SPI1_RX_USING_DMA */
+
+#ifdef BSP_USING_SPI2
+#ifndef SPI2_BUS_CONFIG
+#define SPI2_BUS_CONFIG \
+ { \
+ .Instance = CM_SPI2, \
+ .bus_name = "spi2", \
+ .clock = FCG1_PERIPH_SPI2, \
+ .timeout = 5000UL, \
+ .err_irq.irq_config = \
+ { \
+ .irq_num = BSP_SPI2_ERR_IRQ_NUM, \
+ .irq_prio = BSP_SPI2_ERR_IRQ_PRIO, \
+ .int_src = INT_SRC_SPI2_SPEI, \
+ }, \
+ }
+#endif /* SPI2_BUS_CONFIG */
+#endif /* BSP_USING_SPI2 */
+
+#ifdef BSP_SPI2_TX_USING_DMA
+#ifndef SPI2_TX_DMA_CONFIG
+#define SPI2_TX_DMA_CONFIG \
+ { \
+ .Instance = SPI2_TX_DMA_INSTANCE, \
+ .channel = SPI2_TX_DMA_CHANNEL, \
+ .clock = SPI2_TX_DMA_CLOCK, \
+ .trigger_select = SPI2_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI2_SPTI, \
+ .flag = SPI2_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI2_TX_DMA_IRQn, \
+ .irq_prio = SPI2_TX_DMA_INT_PRIO, \
+ .int_src = SPI2_TX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI2_TX_DMA_CONFIG */
+#endif /* BSP_SPI2_TX_USING_DMA */
+
+#ifdef BSP_SPI2_RX_USING_DMA
+#ifndef SPI2_RX_DMA_CONFIG
+#define SPI2_RX_DMA_CONFIG \
+ { \
+ .Instance = SPI2_RX_DMA_INSTANCE, \
+ .channel = SPI2_RX_DMA_CHANNEL, \
+ .clock = SPI2_RX_DMA_CLOCK, \
+ .trigger_select = SPI2_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI2_SPRI, \
+ .flag = SPI2_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI2_RX_DMA_IRQn, \
+ .irq_prio = SPI2_RX_DMA_INT_PRIO, \
+ .int_src = SPI2_RX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI2_RX_DMA_CONFIG */
+#endif /* BSP_SPI2_RX_USING_DMA */
+
+#ifdef BSP_USING_SPI3
+#ifndef SPI3_BUS_CONFIG
+#define SPI3_BUS_CONFIG \
+ { \
+ .Instance = CM_SPI3, \
+ .bus_name = "spi3", \
+ .clock = FCG1_PERIPH_SPI3, \
+ .timeout = 5000UL, \
+ .err_irq.irq_config = \
+ { \
+ .irq_num = BSP_SPI3_ERR_IRQ_NUM, \
+ .irq_prio = BSP_SPI3_ERR_IRQ_PRIO, \
+ .int_src = INT_SRC_SPI3_SPEI, \
+ }, \
+ }
+#endif /* SPI3_BUS_CONFIG */
+#endif /* BSP_USING_SPI3 */
+
+
+#ifdef BSP_SPI3_TX_USING_DMA
+#ifndef SPI3_TX_DMA_CONFIG
+#define SPI3_TX_DMA_CONFIG \
+ { \
+ .Instance = SPI3_TX_DMA_INSTANCE, \
+ .channel = SPI3_TX_DMA_CHANNEL, \
+ .clock = SPI3_TX_DMA_CLOCK, \
+ .trigger_select = SPI3_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI3_SPTI, \
+ .flag = SPI3_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI3_TX_DMA_IRQn, \
+ .irq_prio = SPI3_TX_DMA_INT_PRIO, \
+ .int_src = SPI3_TX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI3_TX_DMA_CONFIG */
+#endif /* BSP_SPI3_TX_USING_DMA */
+
+#ifdef BSP_SPI3_RX_USING_DMA
+#ifndef SPI3_RX_DMA_CONFIG
+#define SPI3_RX_DMA_CONFIG \
+ { \
+ .Instance = SPI3_RX_DMA_INSTANCE, \
+ .channel = SPI3_RX_DMA_CHANNEL, \
+ .clock = SPI3_RX_DMA_CLOCK, \
+ .trigger_select = SPI3_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI3_SPRI, \
+ .flag = SPI3_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI3_RX_DMA_IRQn, \
+ .irq_prio = SPI3_RX_DMA_INT_PRIO, \
+ .int_src = SPI3_RX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI3_RX_DMA_CONFIG */
+#endif /* BSP_SPI3_RX_USING_DMA */
+
+#ifdef BSP_USING_SPI4
+#ifndef SPI4_BUS_CONFIG
+#define SPI4_BUS_CONFIG \
+ { \
+ .Instance = CM_SPI4, \
+ .bus_name = "spi4", \
+ .clock = FCG1_PERIPH_SPI4, \
+ .timeout = 5000UL, \
+ .err_irq.irq_config = \
+ { \
+ .irq_num = BSP_SPI4_ERR_IRQ_NUM, \
+ .irq_prio = BSP_SPI4_ERR_IRQ_PRIO, \
+ .int_src = INT_SRC_SPI4_SPEI, \
+ }, \
+ }
+#endif /* SPI4_BUS_CONFIG */
+#endif /* BSP_USING_SPI4 */
+
+#ifdef BSP_SPI4_TX_USING_DMA
+#ifndef SPI4_TX_DMA_CONFIG
+#define SPI4_TX_DMA_CONFIG \
+ { \
+ .Instance = SPI4_TX_DMA_INSTANCE, \
+ .channel = SPI4_TX_DMA_CHANNEL, \
+ .clock = SPI4_TX_DMA_CLOCK, \
+ .trigger_select = SPI4_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI4_SPTI, \
+ .flag = SPI4_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI4_TX_DMA_IRQn, \
+ .irq_prio = SPI4_TX_DMA_INT_PRIO, \
+ .int_src = SPI4_TX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI4_TX_DMA_CONFIG */
+#endif /* BSP_SPI4_TX_USING_DMA */
+
+#ifdef BSP_SPI4_RX_USING_DMA
+#ifndef SPI4_RX_DMA_CONFIG
+#define SPI4_RX_DMA_CONFIG \
+ { \
+ .Instance = SPI4_RX_DMA_INSTANCE, \
+ .channel = SPI4_RX_DMA_CHANNEL, \
+ .clock = SPI4_RX_DMA_CLOCK, \
+ .trigger_select = SPI4_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI4_SPRI, \
+ .flag = SPI4_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI4_RX_DMA_IRQn, \
+ .irq_prio = SPI4_RX_DMA_INT_PRIO, \
+ .int_src = SPI4_RX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI4_RX_DMA_CONFIG */
+#endif /* BSP_SPI4_RX_USING_DMA */
+
+#ifdef BSP_USING_SPI5
+#ifndef SPI5_BUS_CONFIG
+#define SPI5_BUS_CONFIG \
+ { \
+ .Instance = CM_SPI5, \
+ .bus_name = "spi5", \
+ .clock = FCG1_PERIPH_SPI5, \
+ .timeout = 5000UL, \
+ .err_irq.irq_config = \
+ { \
+ .irq_num = BSP_SPI5_ERR_IRQ_NUM, \
+ .irq_prio = BSP_SPI5_ERR_IRQ_PRIO, \
+ .int_src = INT_SRC_SPI5_SPEI, \
+ }, \
+ }
+#endif /* SPI5_BUS_CONFIG */
+#endif /* BSP_USING_SPI5 */
+
+#ifdef BSP_SPI5_TX_USING_DMA
+#ifndef SPI5_TX_DMA_CONFIG
+#define SPI5_TX_DMA_CONFIG \
+ { \
+ .Instance = SPI5_TX_DMA_INSTANCE, \
+ .channel = SPI5_TX_DMA_CHANNEL, \
+ .clock = SPI5_TX_DMA_CLOCK, \
+ .trigger_select = SPI5_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI5_SPTI, \
+ .flag = SPI5_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI5_TX_DMA_IRQn, \
+ .irq_prio = SPI5_TX_DMA_INT_PRIO, \
+ .int_src = SPI5_TX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI5_TX_DMA_CONFIG */
+#endif /* BSP_SPI5_TX_USING_DMA */
+
+#ifdef BSP_SPI5_RX_USING_DMA
+#ifndef SPI5_RX_DMA_CONFIG
+#define SPI5_RX_DMA_CONFIG \
+ { \
+ .Instance = SPI5_RX_DMA_INSTANCE, \
+ .channel = SPI5_RX_DMA_CHANNEL, \
+ .clock = SPI5_RX_DMA_CLOCK, \
+ .trigger_select = SPI5_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI5_SPRI, \
+ .flag = SPI5_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI5_RX_DMA_IRQn, \
+ .irq_prio = SPI5_RX_DMA_INT_PRIO, \
+ .int_src = SPI5_RX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI5_RX_DMA_CONFIG */
+#endif /* BSP_SPI5_RX_USING_DMA */
+
+#ifdef BSP_USING_SPI6
+#ifndef SPI6_BUS_CONFIG
+#define SPI6_BUS_CONFIG \
+ { \
+ .Instance = CM_SPI6, \
+ .bus_name = "spi6", \
+ .clock = FCG1_PERIPH_SPI6, \
+ .timeout = 5000UL, \
+ .err_irq.irq_config = \
+ { \
+ .irq_num = BSP_SPI6_ERR_IRQ_NUM, \
+ .irq_prio = BSP_SPI6_ERR_IRQ_PRIO, \
+ .int_src = INT_SRC_SPI6_SPEI, \
+ }, \
+ }
+#endif /* SPI6_BUS_CONFIG */
+#endif /* BSP_USING_SPI6 */
+
+#ifdef BSP_SPI6_TX_USING_DMA
+#ifndef SPI6_TX_DMA_CONFIG
+#define SPI6_TX_DMA_CONFIG \
+ { \
+ .Instance = SPI6_TX_DMA_INSTANCE, \
+ .channel = SPI6_TX_DMA_CHANNEL, \
+ .clock = SPI6_TX_DMA_CLOCK, \
+ .trigger_select = SPI6_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI6_SPTI, \
+ .flag = SPI6_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI6_TX_DMA_IRQn, \
+ .irq_prio = SPI6_TX_DMA_INT_PRIO, \
+ .int_src = SPI6_TX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI6_TX_DMA_CONFIG */
+#endif /* BSP_SPI6_TX_USING_DMA */
+
+#ifdef BSP_SPI6_RX_USING_DMA
+#ifndef SPI6_RX_DMA_CONFIG
+#define SPI6_RX_DMA_CONFIG \
+ { \
+ .Instance = SPI6_RX_DMA_INSTANCE, \
+ .channel = SPI6_RX_DMA_CHANNEL, \
+ .clock = SPI6_RX_DMA_CLOCK, \
+ .trigger_select = SPI6_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_SPI6_SPRI, \
+ .flag = SPI6_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = SPI6_RX_DMA_IRQn, \
+ .irq_prio = SPI6_RX_DMA_INT_PRIO, \
+ .int_src = SPI6_RX_DMA_INT_SRC, \
+ } \
+ }
+#endif /* SPI6_RX_DMA_CONFIG */
+#endif /* BSP_SPI6_RX_USING_DMA */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__SPI_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/timer_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/timer_config.h
new file mode 100644
index 0000000000..6ac1e5a681
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/timer_config.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __TMR_CONFIG_H__
+#define __TMR_CONFIG_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef BSP_USING_TMRA_1
+#ifndef TMRA_1_CONFIG
+#define TMRA_1_CONFIG \
+ { \
+ .tmr_handle = CM_TMRA_1, \
+ .clock_source = CLK_BUS_PCLK0, \
+ .clock = FCG2_PERIPH_TMRA_1, \
+ .flag = TMRA_FLAG_OVF, \
+ .isr = \
+ { \
+ .enIntSrc = INT_SRC_TMRA_1_OVF, \
+ .enIRQn = BSP_USING_TMRA_1_IRQ_NUM, \
+ .u8Int_Prio = BSP_USING_TMRA_1_IRQ_PRIO, \
+ }, \
+ .name = "tmra_1" \
+ }
+#endif /* TMRA_1_CONFIG */
+#endif /* BSP_USING_TMRA_1 */
+
+#ifdef BSP_USING_TMRA_2
+#ifndef TMRA_2_CONFIG
+#define TMRA_2_CONFIG \
+ { \
+ .tmr_handle = CM_TMRA_2, \
+ .clock_source = CLK_BUS_PCLK0, \
+ .clock = FCG2_PERIPH_TMRA_2, \
+ .flag = TMRA_FLAG_OVF, \
+ .isr = \
+ { \
+ .enIntSrc = INT_SRC_TMRA_2_OVF, \
+ .enIRQn = BSP_USING_TMRA_2_IRQ_NUM, \
+ .u8Int_Prio = BSP_USING_TMRA_2_IRQ_PRIO, \
+ }, \
+ .name = "tmra_2" \
+ }
+#endif /* TMRA_2_CONFIG */
+#endif /* BSP_USING_TMRA_2 */
+
+#ifdef BSP_USING_TMRA_3
+#ifndef TMRA_3_CONFIG
+#define TMRA_3_CONFIG \
+ { \
+ .tmr_handle = CM_TMRA_3, \
+ .clock_source = CLK_BUS_PCLK0, \
+ .clock = FCG2_PERIPH_TMRA_3, \
+ .flag = TMRA_FLAG_OVF, \
+ .isr = \
+ { \
+ .enIntSrc = INT_SRC_TMRA_3_OVF, \
+ .enIRQn = BSP_USING_TMRA_3_IRQ_NUM, \
+ .u8Int_Prio = BSP_USING_TMRA_3_IRQ_PRIO, \
+ }, \
+ .name = "tmra_3" \
+ }
+#endif /* TMRA_3_CONFIG */
+#endif /* BSP_USING_TMRA_3 */
+
+#ifdef BSP_USING_TMRA_4
+#ifndef TMRA_4_CONFIG
+#define TMRA_4_CONFIG \
+ { \
+ .tmr_handle = CM_TMRA_4, \
+ .clock_source = CLK_BUS_PCLK0, \
+ .clock = FCG2_PERIPH_TMRA_4, \
+ .flag = TMRA_FLAG_OVF, \
+ .isr = \
+ { \
+ .enIntSrc = INT_SRC_TMRA_4_OVF, \
+ .enIRQn = BSP_USING_TMRA_4_IRQ_NUM, \
+ .u8Int_Prio = BSP_USING_TMRA_4_IRQ_PRIO, \
+ }, \
+ .name = "tmra_4" \
+ }
+#endif /* TMRA_4_CONFIG */
+#endif /* BSP_USING_TMRA_4 */
+
+#ifdef BSP_USING_TMRA_5
+#ifndef TMRA_5_CONFIG
+#define TMRA_5_CONFIG \
+ { \
+ .tmr_handle = CM_TMRA_5, \
+ .clock_source = CLK_BUS_PCLK1, \
+ .clock = FCG2_PERIPH_TMRA_5, \
+ .flag = TMRA_FLAG_OVF, \
+ .isr = \
+ { \
+ .enIntSrc = INT_SRC_TMRA_5_OVF, \
+ .enIRQn = BSP_USING_TMRA_5_IRQ_NUM, \
+ .u8Int_Prio = BSP_USING_TMRA_5_IRQ_PRIO, \
+ }, \
+ .name = "tmra_5" \
+ }
+#endif /* TMRA_5_CONFIG */
+#endif /* BSP_USING_TMRA_5 */
+#endif /* __TMR_CONFIG_H__ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/uart_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/uart_config.h
new file mode 100644
index 0000000000..c1ac81ae9e
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/uart_config.h
@@ -0,0 +1,449 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __UART_CONFIG_H__
+#define __UART_CONFIG_H__
+
+#include
+#include "irq_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if defined(BSP_USING_UART1)
+#ifndef UART1_CONFIG
+#define UART1_CONFIG \
+ { \
+ .name = "uart1", \
+ .Instance = CM_USART1, \
+ .clock = FCG3_PERIPH_USART1, \
+ .irq_num = BSP_UART1_IRQ_NUM, \
+ .rxerr_int_src = INT_SRC_USART1_EI, \
+ .rx_int_src = INT_SRC_USART1_RI, \
+ .tx_int_src = INT_SRC_USART1_TI, \
+ }
+#endif /* UART1_CONFIG */
+
+#if defined(BSP_UART1_RX_USING_DMA)
+#ifndef UART1_DMA_RX_CONFIG
+#define UART1_DMA_RX_CONFIG \
+ { \
+ .Instance = UART1_RX_DMA_INSTANCE, \
+ .channel = UART1_RX_DMA_CHANNEL, \
+ .clock = UART1_RX_DMA_CLOCK, \
+ .trigger_select = UART1_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_USART1_RI, \
+ .flag = UART1_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = UART1_RX_DMA_IRQn, \
+ .irq_prio = UART1_RX_DMA_INT_PRIO, \
+ .int_src = UART1_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* UART1_DMA_RX_CONFIG */
+
+#ifndef UART1_RXTO_CONFIG
+#define UART1_RXTO_CONFIG \
+ { \
+ .TMR0_Instance = CM_TMR0_1, \
+ .channel = TMR0_CH_A, \
+ .clock = FCG2_PERIPH_TMR0_1, \
+ .timeout_bits = 20UL, \
+ }
+#endif /* UART1_RXTO_CONFIG */
+#endif /* BSP_UART1_RX_USING_DMA */
+
+#if defined(RT_USING_SERIAL_V1) && defined(BSP_UART1_TX_USING_DMA)
+#ifndef UART1_TX_CPLT_CONFIG
+#define UART1_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART1_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART1_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART1_TCI, \
+ }, \
+ }
+#endif
+#elif defined(RT_USING_SERIAL_V2)
+#ifndef UART1_TX_CPLT_CONFIG
+#define UART1_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART1_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART1_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART1_TCI, \
+ }, \
+ }
+#endif
+#endif /* UART1_TX_CPLT_CONFIG */
+
+#if defined(BSP_UART1_TX_USING_DMA)
+#ifndef UART1_DMA_TX_CONFIG
+#define UART1_DMA_TX_CONFIG \
+ { \
+ .Instance = UART1_TX_DMA_INSTANCE, \
+ .channel = UART1_TX_DMA_CHANNEL, \
+ .clock = UART1_TX_DMA_CLOCK, \
+ .trigger_select = UART1_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_USART1_TI, \
+ .flag = UART1_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = UART1_TX_DMA_IRQn, \
+ .irq_prio = UART1_TX_DMA_INT_PRIO, \
+ .int_src = UART1_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* UART1_DMA_TX_CONFIG */
+#endif /* BSP_UART1_TX_USING_DMA */
+#endif /* BSP_USING_UART1 */
+
+#if defined(BSP_USING_UART2)
+#ifndef UART2_CONFIG
+#define UART2_CONFIG \
+ { \
+ .name = "uart2", \
+ .Instance = CM_USART2, \
+ .clock = FCG3_PERIPH_USART2, \
+ .irq_num = BSP_UART2_IRQ_NUM, \
+ .rxerr_int_src = INT_SRC_USART2_EI, \
+ .rx_int_src = INT_SRC_USART2_RI, \
+ .tx_int_src = INT_SRC_USART2_TI, \
+ }
+#endif /* UART2_CONFIG */
+
+#if defined(BSP_UART2_RX_USING_DMA)
+#ifndef UART2_DMA_RX_CONFIG
+#define UART2_DMA_RX_CONFIG \
+ { \
+ .Instance = UART2_RX_DMA_INSTANCE, \
+ .channel = UART2_RX_DMA_CHANNEL, \
+ .clock = UART2_RX_DMA_CLOCK, \
+ .trigger_select = UART2_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_USART2_RI, \
+ .flag = UART2_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = UART2_RX_DMA_IRQn, \
+ .irq_prio = UART2_RX_DMA_INT_PRIO, \
+ .int_src = UART2_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* UART2_DMA_RX_CONFIG */
+
+#ifndef UART2_RXTO_CONFIG
+#define UART2_RXTO_CONFIG \
+ { \
+ .TMR0_Instance = CM_TMR0_1, \
+ .channel = TMR0_CH_B, \
+ .clock = FCG2_PERIPH_TMR0_1, \
+ .timeout_bits = 20UL, \
+ }
+#endif /* UART2_RXTO_CONFIG */
+#endif /* BSP_UART2_RX_USING_DMA */
+
+#if defined(RT_USING_SERIAL_V1) && defined(BSP_UART2_TX_USING_DMA)
+#ifndef UART2_TX_CPLT_CONFIG
+#define UART2_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART2_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART2_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART2_TCI, \
+ }, \
+ }
+#endif
+#elif defined(RT_USING_SERIAL_V2)
+#ifndef UART2_TX_CPLT_CONFIG
+#define UART2_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART2_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART2_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART2_TCI, \
+ }, \
+ }
+#endif
+#endif /* UART2_TX_CPLT_CONFIG */
+
+#if defined(BSP_UART2_TX_USING_DMA)
+#ifndef UART2_DMA_TX_CONFIG
+#define UART2_DMA_TX_CONFIG \
+ { \
+ .Instance = UART2_TX_DMA_INSTANCE, \
+ .channel = UART2_TX_DMA_CHANNEL, \
+ .clock = UART2_TX_DMA_CLOCK, \
+ .trigger_select = UART2_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_USART2_TI, \
+ .flag = UART2_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = UART2_TX_DMA_IRQn, \
+ .irq_prio = UART2_TX_DMA_INT_PRIO, \
+ .int_src = UART2_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* UART2_DMA_TX_CONFIG */
+#endif /* BSP_UART2_TX_USING_DMA */
+#endif /* BSP_USING_UART2 */
+
+#if defined(BSP_USING_UART3)
+#ifndef UART3_CONFIG
+#define UART3_CONFIG \
+ { \
+ .name = "uart3", \
+ .Instance = CM_USART3, \
+ .clock = FCG3_PERIPH_USART3, \
+ .irq_num = BSP_UART3_IRQ_NUM, \
+ .rxerr_int_src = INT_SRC_USART3_EI, \
+ .rx_int_src = INT_SRC_USART3_RI, \
+ .tx_int_src = INT_SRC_USART3_TI, \
+ }
+#endif /* UART3_CONFIG */
+
+#if defined(RT_USING_SERIAL_V2)
+#ifndef UART3_TX_CPLT_CONFIG
+#define UART3_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART3_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART3_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART3_TCI, \
+ }, \
+ }
+#endif
+#endif /* UART3_TX_CPLT_CONFIG */
+#endif /* BSP_USING_UART3 */
+
+#if defined(BSP_USING_UART4)
+#ifndef UART4_CONFIG
+#define UART4_CONFIG \
+ { \
+ .name = "uart4", \
+ .Instance = CM_USART4, \
+ .clock = FCG3_PERIPH_USART4, \
+ .irq_num = BSP_UART4_IRQ_NUM, \
+ .rxerr_int_src = INT_SRC_USART4_EI, \
+ .rx_int_src = INT_SRC_USART4_RI, \
+ .tx_int_src = INT_SRC_USART4_TI, \
+ }
+#endif /* UART4_CONFIG */
+
+#if defined(BSP_UART4_RX_USING_DMA)
+#ifndef UART4_DMA_RX_CONFIG
+#define UART4_DMA_RX_CONFIG \
+ { \
+ .Instance = UART4_RX_DMA_INSTANCE, \
+ .channel = UART4_RX_DMA_CHANNEL, \
+ .clock = UART4_RX_DMA_CLOCK, \
+ .trigger_select = UART4_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_USART4_RI, \
+ .flag = UART4_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = UART4_RX_DMA_IRQn, \
+ .irq_prio = UART4_RX_DMA_INT_PRIO, \
+ .int_src = UART4_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* UART4_DMA_RX_CONFIG */
+
+#ifndef UART4_RXTO_CONFIG
+#define UART4_RXTO_CONFIG \
+ { \
+ .TMR0_Instance = CM_TMR0_2, \
+ .channel = TMR0_CH_A, \
+ .clock = FCG2_PERIPH_TMR0_2, \
+ .timeout_bits = 20UL, \
+ }
+#endif /* UART4_RXTO_CONFIG */
+#endif /* BSP_UART4_RX_USING_DMA */
+
+#if defined(RT_USING_SERIAL_V1) && defined(BSP_UART4_TX_USING_DMA)
+#ifndef UART4_TX_CPLT_CONFIG
+#define UART4_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART4_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART4_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART4_TCI, \
+ }, \
+ }
+#endif
+#elif defined(RT_USING_SERIAL_V2)
+#ifndef UART4_TX_CPLT_CONFIG
+#define UART4_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART4_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART4_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART4_TCI, \
+ }, \
+ }
+#endif
+#endif /* UART4_TX_CPLT_CONFIG */
+
+#if defined(BSP_UART4_TX_USING_DMA)
+#ifndef UART4_DMA_TX_CONFIG
+#define UART4_DMA_TX_CONFIG \
+ { \
+ .Instance = UART4_TX_DMA_INSTANCE, \
+ .channel = UART4_TX_DMA_CHANNEL, \
+ .clock = UART4_TX_DMA_CLOCK, \
+ .trigger_select = UART4_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_USART4_TI, \
+ .flag = UART4_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = UART4_TX_DMA_IRQn, \
+ .irq_prio = UART4_TX_DMA_INT_PRIO, \
+ .int_src = UART4_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* UART4_DMA_TX_CONFIG */
+#endif /* BSP_UART4_TX_USING_DMA */
+#endif /* BSP_USING_UART4 */
+
+#if defined(BSP_USING_UART5)
+#ifndef UART5_CONFIG
+#define UART5_CONFIG \
+ { \
+ .name = "uart5", \
+ .Instance = CM_USART5, \
+ .clock = FCG3_PERIPH_USART5, \
+ .irq_num = BSP_UART5_IRQ_NUM, \
+ .rxerr_int_src = INT_SRC_USART5_EI, \
+ .rx_int_src = INT_SRC_USART5_RI, \
+ .tx_int_src = INT_SRC_USART5_TI, \
+ }
+#endif /* UART5_CONFIG */
+
+#if defined(BSP_UART5_RX_USING_DMA)
+#ifndef UART5_DMA_RX_CONFIG
+#define UART5_DMA_RX_CONFIG \
+ { \
+ .Instance = UART5_RX_DMA_INSTANCE, \
+ .channel = UART5_RX_DMA_CHANNEL, \
+ .clock = UART5_RX_DMA_CLOCK, \
+ .trigger_select = UART5_RX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_USART5_RI, \
+ .flag = UART5_RX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = UART5_RX_DMA_IRQn, \
+ .irq_prio = UART5_RX_DMA_INT_PRIO, \
+ .int_src = UART5_RX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* UART5_DMA_RX_CONFIG */
+
+#ifndef UART5_RXTO_CONFIG
+#define UART5_RXTO_CONFIG \
+ { \
+ .TMR0_Instance = CM_TMR0_2, \
+ .channel = TMR0_CH_B, \
+ .clock = FCG2_PERIPH_TMR0_2, \
+ .timeout_bits = 20UL, \
+ }
+#endif /* UART5_RXTO_CONFIG */
+#endif /* BSP_UART5_RX_USING_DMA */
+
+#if defined(RT_USING_SERIAL_V1) && defined(BSP_UART5_TX_USING_DMA)
+#ifndef UART5_TX_CPLT_CONFIG
+#define UART5_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART5_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART5_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART5_TCI, \
+ }, \
+ }
+#endif
+#elif defined(RT_USING_SERIAL_V2)
+#ifndef UART5_TX_CPLT_CONFIG
+#define UART5_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART5_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART5_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART5_TCI, \
+ }, \
+ }
+#endif
+#endif /* UART5_TX_CPLT_CONFIG */
+
+#if defined(BSP_UART5_TX_USING_DMA)
+#ifndef UART5_DMA_TX_CONFIG
+#define UART5_DMA_TX_CONFIG \
+ { \
+ .Instance = UART5_TX_DMA_INSTANCE, \
+ .channel = UART5_TX_DMA_CHANNEL, \
+ .clock = UART5_TX_DMA_CLOCK, \
+ .trigger_select = UART5_TX_DMA_TRIG_SELECT, \
+ .trigger_event = EVT_SRC_USART5_TI, \
+ .flag = UART5_TX_DMA_TRANS_FLAG, \
+ .irq_config = \
+ { \
+ .irq_num = UART5_TX_DMA_IRQn, \
+ .irq_prio = UART5_TX_DMA_INT_PRIO, \
+ .int_src = UART5_TX_DMA_INT_SRC, \
+ }, \
+ }
+#endif /* UART5_DMA_TX_CONFIG */
+#endif /* BSP_UART5_TX_USING_DMA */
+#endif /* BSP_USING_UART5 */
+
+#if defined(BSP_USING_UART6)
+#ifndef UART6_CONFIG
+#define UART6_CONFIG \
+ { \
+ .name = "uart6", \
+ .Instance = CM_USART6, \
+ .clock = FCG3_PERIPH_USART6, \
+ .irq_num = BSP_UART6_IRQ_NUM, \
+ .rxerr_int_src = INT_SRC_USART6_EI, \
+ .rx_int_src = INT_SRC_USART6_RI, \
+ .tx_int_src = INT_SRC_USART6_TI, \
+ }
+#endif /* UART6_CONFIG */
+
+#if defined(RT_USING_SERIAL_V2)
+#ifndef UART6_TX_CPLT_CONFIG
+#define UART6_TX_CPLT_CONFIG \
+ { \
+ .irq_config = \
+ { \
+ .irq_num = BSP_UART6_TX_CPLT_IRQ_NUM, \
+ .irq_prio = BSP_UART6_TX_CPLT_IRQ_PRIO, \
+ .int_src = INT_SRC_USART6_TCI, \
+ }, \
+ }
+#endif
+#endif /* UART6_TX_CPLT_CONFIG */
+#endif /* BSP_USING_UART6 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h
new file mode 100644
index 0000000000..64b5b592da
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __DRV_CONFIG_H__
+#define __DRV_CONFIG_H__
+
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "dma_config.h"
+#include "uart_config.h"
+#include "spi_config.h"
+#include "adc_config.h"
+#include "dac_config.h"
+#include "gpio_config.h"
+#include "can_config.h"
+#include "pm_config.h"
+#include "i2c_config.h"
+#include "qspi_config.h"
+#include "pulse_encoder_config.h"
+#include "timer_config.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/hc32f4xx_conf.h b/bsp/hc32/ev_hc32f448_lqfp80/board/hc32f4xx_conf.h
new file mode 100644
index 0000000000..438f04eaee
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/hc32f4xx_conf.h
@@ -0,0 +1,136 @@
+/**
+ *******************************************************************************
+ * @file template/source/hc32f4xx_conf.h
+ * @brief This file contains HC32 Series Device Driver Library usage management.
+ @verbatim
+ Change Logs:
+ Date Author Notes
+ 2023-05-31 CDT First version
+ @endverbatim
+ *******************************************************************************
+ * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved.
+ *
+ * This software component is licensed by XHSC under BSD 3-Clause license
+ * (the "License"); You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ *******************************************************************************
+ */
+#ifndef __HC32F4XX_CONF_H__
+#define __HC32F4XX_CONF_H__
+
+/*******************************************************************************
+ * Include files
+ ******************************************************************************/
+#include
+
+/* C binding of definitions if building with C++ compiler */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*******************************************************************************
+ * Global type definitions ('typedef')
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Global pre-processor symbols/macros ('#define')
+ ******************************************************************************/
+
+/**
+ * @brief This is the list of modules to be used in the Device Driver Library.
+ * Select the modules you need to use to DDL_ON.
+ * @note LL_ICG_ENABLE must be turned on(DDL_ON) to ensure that the chip works
+ * properly.
+ * @note LL_UTILITY_ENABLE must be turned on(DDL_ON) if using Device Driver
+ * Library.
+ * @note LL_PRINT_ENABLE must be turned on(DDL_ON) if using printf function.
+ */
+#define LL_ICG_ENABLE (DDL_ON)
+#define LL_UTILITY_ENABLE (DDL_ON)
+#define LL_PRINT_ENABLE (DDL_OFF)
+
+#define LL_ADC_ENABLE (DDL_ON)
+#define LL_AES_ENABLE (DDL_ON)
+#define LL_AOS_ENABLE (DDL_ON)
+#define LL_CLK_ENABLE (DDL_ON)
+#define LL_CMP_ENABLE (DDL_ON)
+#define LL_CRC_ENABLE (DDL_ON)
+#define LL_CTC_ENABLE (DDL_ON)
+#define LL_DAC_ENABLE (DDL_ON)
+#define LL_DBGC_ENABLE (DDL_OFF)
+#define LL_DCU_ENABLE (DDL_ON)
+#define LL_DMA_ENABLE (DDL_ON)
+#define LL_EFM_ENABLE (DDL_ON)
+#define LL_EMB_ENABLE (DDL_ON)
+#define LL_EVENT_PORT_ENABLE (DDL_OFF)
+#define LL_FCG_ENABLE (DDL_ON)
+#define LL_FCM_ENABLE (DDL_ON)
+#define LL_GPIO_ENABLE (DDL_ON)
+#define LL_HASH_ENABLE (DDL_ON)
+#define LL_I2C_ENABLE (DDL_ON)
+#define LL_INTERRUPTS_ENABLE (DDL_ON)
+#define LL_KEYSCAN_ENABLE (DDL_ON)
+#define LL_MCAN_ENABLE (DDL_ON)
+#define LL_MPU_ENABLE (DDL_ON)
+#define LL_PWC_ENABLE (DDL_ON)
+#define LL_QSPI_ENABLE (DDL_ON)
+#define LL_RMU_ENABLE (DDL_ON)
+#define LL_RTC_ENABLE (DDL_ON)
+#define LL_SMC_ENABLE (DDL_ON)
+#define LL_SPI_ENABLE (DDL_ON)
+#define LL_SRAM_ENABLE (DDL_ON)
+#define LL_SWDT_ENABLE (DDL_ON)
+#define LL_TMR0_ENABLE (DDL_ON)
+#define LL_TMR4_ENABLE (DDL_ON)
+#define LL_TMR6_ENABLE (DDL_ON)
+#define LL_TMRA_ENABLE (DDL_ON)
+#define LL_TRNG_ENABLE (DDL_ON)
+#define LL_USART_ENABLE (DDL_ON)
+#define LL_WDT_ENABLE (DDL_ON)
+
+/**
+ * @brief The following is a list of currently supported BSP boards.
+ */
+#define BSP_EV_HC32F448_LQFP80 (9U)
+
+/**
+ * @brief The macro BSP_EV_HC32F4XX is used to specify the BSP board currently
+ * in use.
+ * The value should be set to one of the list of currently supported BSP boards.
+ * @note If there is no supported BSP board or the BSP function is not used,
+ * the value needs to be set to 0U.
+ */
+#define BSP_EV_HC32F4XX (BSP_EV_HC32F448_LQFP80)
+
+/**
+ * @brief This is the list of BSP components to be used.
+ * Select the components you need to use to DDL_ON.
+ */
+#define BSP_24CXX_ENABLE (DDL_OFF)
+#define BSP_GT9XX_ENABLE (DDL_OFF)
+#define BSP_IS61LV6416_ENABLE (DDL_OFF)
+#define BSP_NT35510_ENABLE (DDL_OFF)
+#define BSP_TCA9539_ENABLE (DDL_OFF)
+#define BSP_W25QXX_ENABLE (DDL_OFF)
+#define BSP_INT_KEY_ENABLE (DDL_OFF)
+
+/*******************************************************************************
+ * Global variable definitions ('extern')
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Global function prototypes (definition in C source)
+ ******************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __HC32F4XX_CONF_H__ */
+
+/*******************************************************************************
+ * EOF (not truncated)
+ ******************************************************************************/
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.icf b/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.icf
new file mode 100644
index 0000000000..f9aef6bc41
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.icf
@@ -0,0 +1,103 @@
+/***************************************************************************//**
+ * \file HC32F448.icf
+ * \version 1.0
+ *
+ * \brief Linker file for the IAR compiler.
+ *
+********************************************************************************
+* \copyright
+ * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. All rights reserved.
+ *
+ * This software component is licensed by XHSC under BSD 3-Clause license
+ * (the "License"); You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*******************************************************************************/
+
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */
+
+// Check that necessary symbols have been passed to linker via command line interface
+if((!isdefinedsymbol(_LINK_RAM_)) && (!isdefinedsymbol(_LINK_FLASH_))) {
+ error "Link location not defined or not supported!";
+}
+if((!isdefinedsymbol(_HC32F448_256K_)) && (!isdefinedsymbol(_HC32F448_128K_))) {
+ error "Mcu type or size not defined or not supported!";
+}
+
+
+/*******************************************************************************
+ * Memory address and size definitions
+ ******************************************************************************/
+define symbol ram1_base_address = 0x1FFF8000;
+define symbol ram1_end_address = 0x20007FFF;
+if(isdefinedsymbol(_LINK_RAM_)) {
+ define symbol ram_start_reserve = 0x8000;
+ define symbol rom1_base_address = ram1_base_address;
+ define symbol rom1_end_address = rom1_base_address + ram_start_reserve - 0x01;
+ define symbol rom2_base_address = 0x0;
+ define symbol rom2_end_address = 0x0;
+} else {
+ define symbol ram_start_reserve = 0x0;
+ define symbol rom1_base_address = 0x0;
+ define symbol rom2_base_address = 0x03000C00;
+ define symbol rom2_end_address = 0x03000FFF;
+
+ if(isdefinedsymbol(_HC32F448_256K_)) {
+ define symbol rom1_end_address = 0x0003FFFF;
+ } else if (isdefinedsymbol(_HC32F448_128K_)) {
+ define symbol rom1_end_address = 0x0001FFFF;
+ }
+}
+
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = rom1_base_address;
+/*-Memory Regions-*/
+define symbol __ICFEDIT_region_IROM1_start__ = rom1_base_address;
+define symbol __ICFEDIT_region_IROM1_end__ = rom1_end_address;
+define symbol __ICFEDIT_region_IROM2_start__ = rom2_base_address;
+define symbol __ICFEDIT_region_IROM2_end__ = rom2_end_address;
+define symbol __ICFEDIT_region_EROM1_start__ = 0x0;
+define symbol __ICFEDIT_region_EROM1_end__ = 0x0;
+define symbol __ICFEDIT_region_EROM2_start__ = 0x0;
+define symbol __ICFEDIT_region_EROM2_end__ = 0x0;
+define symbol __ICFEDIT_region_EROM3_start__ = 0x0;
+define symbol __ICFEDIT_region_EROM3_end__ = 0x0;
+define symbol __ICFEDIT_region_IRAM1_start__ = ram1_base_address + ram_start_reserve;
+define symbol __ICFEDIT_region_IRAM1_end__ = ram1_end_address;
+define symbol __ICFEDIT_region_IRAM2_start__ = 0x200F0000;
+define symbol __ICFEDIT_region_IRAM2_end__ = 0x200F0FFF;
+define symbol __ICFEDIT_region_ERAM1_start__ = 0x0;
+define symbol __ICFEDIT_region_ERAM1_end__ = 0x0;
+define symbol __ICFEDIT_region_ERAM2_start__ = 0x0;
+define symbol __ICFEDIT_region_ERAM2_end__ = 0x0;
+define symbol __ICFEDIT_region_ERAM3_start__ = 0x0;
+define symbol __ICFEDIT_region_ERAM3_end__ = 0x0;
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0xC00;
+define symbol __ICFEDIT_size_proc_stack__ = 0x0;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+/*******************************************************************************
+ * Memory definitions
+ ******************************************************************************/
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__];
+define region OTP_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]
+ | mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+initialize by copy { readwrite };
+do not initialize { section .noinit };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in OTP_region { readonly section .otp_data };
+place in RAM_region { readwrite,
+ block CSTACK, block HEAP };
\ No newline at end of file
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.ld b/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.ld
new file mode 100644
index 0000000000..5d60e06992
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.ld
@@ -0,0 +1,270 @@
+/******************************************************************************
+ * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. All rights reserved.
+ *
+ * This software component is licensed by XHSC under BSD 3-Clause license
+ * (the "License"); You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ */
+/*****************************************************************************/
+/* File HC32F448xC.ld */
+/* Abstract Linker script for HC32F448 Device with */
+/* 256KByte FLASH, 68KByte RAM */
+/* Version V1.0 */
+/* Date 2023-05-31 */
+/*****************************************************************************/
+
+/* Custom defines, according to section 7.7 of the user manual.
+ Take OTP sector 16 for example. */
+__OTP_DATA_START = 0x03000C00;
+__OTP_DATA_SIZE = 1024;
+__OTP_LOCK_START = 0x03000A80;
+__OTP_LOCK_SIZE = 128;
+
+/* Use contiguous memory regions for simple. */
+MEMORY
+{
+ FLASH (rx): ORIGIN = 0x00000000, LENGTH = 256K
+ OTP_DATA (rx): ORIGIN = __OTP_DATA_START, LENGTH = __OTP_DATA_SIZE
+ OTP_LOCK (rx): ORIGIN = __OTP_LOCK_START, LENGTH = __OTP_LOCK_SIZE
+ RAM (rwx): ORIGIN = 0x1FFF8000, LENGTH = 64K
+ RAMB (rwx): ORIGIN = 0x200F0000, LENGTH = 4K
+}
+
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .vectors :
+ {
+ . = ALIGN(4);
+ KEEP(*(.vectors))
+ . = ALIGN(4);
+ } >FLASH
+
+ .icg_sec 0x00000400 :
+ {
+ KEEP(*(.icg_sec))
+ } >FLASH
+
+ .text :
+ {
+ . = ALIGN(4);
+ _stext = .;
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ *(.text) /* remaining code */
+ *(.text.*) /* remaining code */
+ *(.rodata) /* read-only data (constants) */
+ *(.rodata*)
+ *(.glue_7)
+ *(.glue_7t)
+ *(.gnu.linkonce.t*)
+
+ /* section information for finsh shell */
+ . = ALIGN(4);
+ __fsymtab_start = .;
+ KEEP(*(FSymTab))
+ __fsymtab_end = .;
+ . = ALIGN(4);
+ __vsymtab_start = .;
+ KEEP(*(VSymTab))
+ __vsymtab_end = .;
+ . = ALIGN(4);
+
+ /* section information for initial. */
+ . = ALIGN(4);
+ __rt_init_start = .;
+ KEEP(*(SORT(.rti_fn*)))
+ __rt_init_end = .;
+ . = ALIGN(4);
+
+ . = ALIGN(4);
+ _etext = .;
+ } >FLASH
+
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata)
+ *(.rodata*)
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >FLASH
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } >FLASH
+ __exidx_end = .;
+
+ .preinit_array :
+ {
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ . = ALIGN(4);
+ } >FLASH
+
+ .init_array :
+ {
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ . = ALIGN(4);
+ } >FLASH
+
+ .fini_array :
+ {
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ . = ALIGN(4);
+ } >FLASH
+
+ __etext = ALIGN(4);
+
+ .otp_data_sec :
+ {
+ KEEP(*(.otp_data_sec))
+ } >OTP_DATA
+
+ .otp_lock_sec :
+ {
+ KEEP(*(.otp_lock_sec))
+ } >OTP_LOCK
+
+ .data : AT (__etext)
+ {
+ . = ALIGN(4);
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data*)
+ *(.gnu.linkonce.d*)
+ . = ALIGN(4);
+ *(.ramfunc)
+ *(.ramfunc*)
+ . = ALIGN(4);
+ __data_end__ = .;
+ } >RAM
+
+ .heap_stack (COPY) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ PROVIDE(_end = .);
+ *(.heap*)
+ . = ALIGN(8);
+ __HeapLimit = .;
+
+ __StackLimit = .;
+ *(.stack*)
+ . = ALIGN(8);
+ __StackTop = .;
+ } >RAM
+
+ __etext_ramb = __etext + ALIGN (SIZEOF(.data), 4);
+ .ramb_data : AT (__etext_ramb)
+ {
+ . = ALIGN(4);
+ __data_start_ramb__ = .;
+ *(.ramb_data)
+ *(.ramb_data*)
+ . = ALIGN(4);
+ __data_end_ramb__ = .;
+ } >RAMB
+
+ __bss_start = .;
+ .bss __StackTop (NOLOAD):
+ {
+ . = ALIGN(4);
+ _sbss = .;
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = .;
+ __bss_end__ = _ebss;
+ . = ALIGN(4);
+ *(.noinit*)
+ . = ALIGN(4);
+ } >RAM
+ __bss_end = .;
+
+ .ramb_bss :
+ {
+ . = ALIGN(4);
+ __bss_start_ramb__ = .;
+ *(.ramb_bss)
+ *(.ramb_bss*)
+ . = ALIGN(4);
+ __bss_end_ramb__ = .;
+ } >RAMB
+
+ /DISCARD/ :
+ {
+ libc.a (*)
+ libm.a (*)
+ libgcc.a (*)
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+
+ PROVIDE(_stack = __StackTop);
+ PROVIDE(_Min_Heap_Size = __HeapLimit - __HeapBase);
+ PROVIDE(_Min_Stack_Size = __StackTop - __StackLimit);
+
+ __RamEnd = ORIGIN(RAM) + LENGTH(RAM);
+ ASSERT(__StackTop <= __RamEnd, "region RAM overflowed with stack")
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ * Symbols in the DWARF debugging sections are relative to the beginning
+ * of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+}
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.sct b/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.sct
new file mode 100644
index 0000000000..92f3940d28
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.sct
@@ -0,0 +1,22 @@
+; ****************************************************************
+; Scatter-Loading Description File
+; ****************************************************************
+LR_IROM1 0x00000000 0x00040000 { ; load region size_region
+ ER_IROM1 0x00000000 0x00040000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ .ANY (+XO)
+ }
+ RW_IRAM1 0x1FFF8000 UNINIT 0x00000008 { ; RW data
+ *(.bss.noinit)
+ }
+ RW_IRAM2 0x1FFF8008 0x0000FFF8 { ; RW data
+ .ANY (+RW +ZI)
+ .ANY (RAMCODE)
+ }
+ RW_IRAMB 0x200F0000 0x00001000 { ; RW data
+ .ANY (+RW +ZI)
+ }
+}
+
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/SConscript b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/SConscript
new file mode 100644
index 0000000000..3c57bc9c6d
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/SConscript
@@ -0,0 +1,12 @@
+import os
+from building import *
+
+objs = []
+cwd = GetCurrentDir()
+
+list = os.listdir(cwd)
+for item in list:
+ if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
+ objs = objs + SConscript(os.path.join(item, 'SConscript'))
+
+Return('objs')
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/drv_spi_flash.c b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/drv_spi_flash.c
new file mode 100644
index 0000000000..5e69545c7b
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/drv_spi_flash.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#ifdef BSP_USING_SPI_FLASH
+
+#include "spi_flash.h"
+#ifdef RT_USING_SFUD
+ #include "spi_flash_sfud.h"
+#endif
+
+#define SPI_BUS_NAME "spi1"
+#define SPI_FLASH_DEVICE_NAME "spi10"
+#define SPI_FLASH_CHIP "w25q64"
+#define SPI_FLASH_SS_PORT GPIO_PORT_C
+#define SPI_FLASH_SS_PIN GPIO_PIN_07
+/* Partition Name */
+#define FS_PARTITION_NAME "filesystem"
+
+#ifdef RT_USING_SFUD
+static void rt_hw_spi_flash_reset(char *spi_dev_name)
+{
+ struct rt_spi_device *spi_dev_w25;
+ rt_uint8_t w25_en_reset = 0x66;
+ rt_uint8_t w25_reset_dev = 0x99;
+
+ spi_dev_w25 = (struct rt_spi_device *)rt_device_find(spi_dev_name);
+ if (!spi_dev_w25)
+ {
+ rt_kprintf("Can't find %s device!\n", spi_dev_name);
+ }
+ else
+ {
+ rt_spi_send(spi_dev_w25, &w25_en_reset, 1U);
+ rt_spi_send(spi_dev_w25, &w25_reset_dev, 1U);
+ DDL_DelayMS(1U);
+ rt_kprintf("Reset ext flash!\n");
+ }
+}
+
+static int rt_hw_spi_flash_with_sfud_init(void)
+{
+ rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_FLASH_DEVICE_NAME, SPI_FLASH_SS_PORT, SPI_FLASH_SS_PIN);
+
+ if (RT_NULL == rt_sfud_flash_probe(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME))
+ {
+ rt_hw_spi_flash_reset(SPI_FLASH_DEVICE_NAME);
+ if (RT_NULL == rt_sfud_flash_probe(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME))
+ {
+ return -RT_ERROR;
+ }
+ }
+
+ return RT_EOK;
+}
+INIT_COMPONENT_EXPORT(rt_hw_spi_flash_with_sfud_init);
+
+static int rt_hw_fs_init(void)
+{
+ struct rt_device *mtd_dev = RT_NULL;
+
+ /* 初始化 fal */
+ fal_init();
+ /* 生成 mtd 设备 */
+ mtd_dev = fal_mtd_nor_device_create(FS_PARTITION_NAME);
+ if (!mtd_dev)
+ {
+ LOG_E("Can't create a mtd device on '%s' partition.", FS_PARTITION_NAME);
+ return -RT_ERROR;
+ }
+ else
+ {
+ /* 挂载 littlefs */
+ if (RT_EOK == dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0))
+ {
+ LOG_I("Filesystem initialized!");
+ return RT_EOK;
+ }
+ else
+ {
+ /* 格式化文件系统 */
+ if (RT_EOK == dfs_mkfs("lfs", FS_PARTITION_NAME))
+ {
+ /* 挂载 littlefs */
+ if (RT_EOK == dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0))
+ {
+ LOG_I("Filesystem initialized!");
+ return RT_EOK;
+ }
+ else
+ {
+ LOG_E("Failed to initialize filesystem!");
+ return -RT_ERROR;
+ }
+ }
+ else
+ {
+ LOG_E("Failed to Format fs!");
+ return -RT_ERROR;
+ }
+ }
+ }
+}
+INIT_APP_EXPORT(rt_hw_fs_init);
+
+#endif /* RT_USING_SFUD */
+
+#endif /* BSP_USING_SPI_FLASH */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/SConscript b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/SConscript
new file mode 100644
index 0000000000..cee47c2d7e
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/SConscript
@@ -0,0 +1,20 @@
+
+from building import *
+import rtconfig
+
+cwd = GetCurrentDir()
+
+src = []
+
+src += Glob('*.c')
+CPPPATH = [cwd]
+LOCAL_CFLAGS = ''
+
+if rtconfig.PLATFORM in ['gcc', 'armclang']:
+ LOCAL_CFLAGS += ' -std=c99'
+elif rtconfig.PLATFORM in ['armcc']:
+ LOCAL_CFLAGS += ' --c99'
+
+group = DefineGroup('FAL', src, depend = ['RT_USING_FAL'], CPPPATH = CPPPATH, LOCAL_CFLAGS = LOCAL_CFLAGS)
+
+Return('group')
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_cfg.h b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_cfg.h
new file mode 100644
index 0000000000..1f8fb29c76
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_cfg.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef _FAL_CFG_H_
+#define _FAL_CFG_H_
+
+#include
+#include
+
+/* enable hc32f4 onchip flash driver sample */
+#define FAL_FLASH_PORT_DRIVER_HC32F4
+/* enable SFUD flash driver sample */
+#define FAL_FLASH_PORT_DRIVER_SFUD
+
+extern const struct fal_flash_dev hc32_onchip_flash;
+extern struct fal_flash_dev ext_nor_flash0;
+
+/* flash device table */
+#define FAL_FLASH_DEV_TABLE \
+{ \
+ &hc32_onchip_flash, \
+ &ext_nor_flash0, \
+}
+
+/* ====================== Partition Configuration ========================== */
+#ifdef FAL_PART_HAS_TABLE_CFG
+/* partition table */
+#define FAL_PART_TABLE \
+{ \
+ {FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 256 * 1024, 0}, \
+ {FAL_PART_MAGIC_WROD, "filesystem", "w25q64", 0, 8 * 1024 * 1024, 0}, \
+}
+#endif /* FAL_PART_HAS_TABLE_CFG */
+
+#endif /* _FAL_CFG_H_ */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_flash_sfud_port.c b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_flash_sfud_port.c
new file mode 100644
index 0000000000..c1b7851309
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_flash_sfud_port.c
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#include
+
+#include
+#ifdef RT_USING_SFUD
+ #include
+#endif
+
+#ifndef FAL_USING_NOR_FLASH_DEV_NAME
+ #define FAL_USING_NOR_FLASH_DEV_NAME "w25q64"
+#endif
+
+static int init(void);
+static int read(long offset, uint8_t *buf, size_t size);
+static int write(long offset, const uint8_t *buf, size_t size);
+static int erase(long offset, size_t size);
+
+static sfud_flash_t sfud_dev = NULL;
+struct fal_flash_dev ext_nor_flash0 =
+{
+ .name = FAL_USING_NOR_FLASH_DEV_NAME,
+ .addr = 0,
+ .len = 8 * 1024 * 1024,
+ .blk_size = 4096,
+ .ops = {init, read, write, erase},
+ .write_gran = 1
+};
+
+static int init(void)
+{
+ /* RT-Thread RTOS platform */
+ sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);
+ if (NULL == sfud_dev)
+ {
+ return -1;
+ }
+ /* update the flash chip information */
+ ext_nor_flash0.blk_size = sfud_dev->chip.erase_gran;
+ ext_nor_flash0.len = sfud_dev->chip.capacity;
+
+ return 0;
+}
+
+static int read(long offset, uint8_t *buf, size_t size)
+{
+ assert(sfud_dev);
+ assert(sfud_dev->init_ok);
+ sfud_read(sfud_dev, ext_nor_flash0.addr + offset, size, buf);
+
+ return size;
+}
+
+static int write(long offset, const uint8_t *buf, size_t size)
+{
+ assert(sfud_dev);
+ assert(sfud_dev->init_ok);
+ if (sfud_write(sfud_dev, ext_nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS)
+ {
+ return -1;
+ }
+
+ return size;
+}
+
+static int erase(long offset, size_t size)
+{
+ assert(sfud_dev);
+ assert(sfud_dev->init_ok);
+ if (sfud_erase(sfud_dev, ext_nor_flash0.addr + offset, size) != SFUD_SUCCESS)
+ {
+ return -1;
+ }
+
+ return size;
+}
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.c b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.c
new file mode 100644
index 0000000000..40f9a91a98
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.c
@@ -0,0 +1,320 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#include
+#include
+#include
+
+#ifdef BSP_USING_TCA9539
+
+#include "tca9539.h"
+
+/*******************************************************************************
+ * Local type definitions ('typedef')
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Local pre-processor symbols/macros ('#define')
+ ******************************************************************************/
+/* Define for TCA9539 */
+#define BSP_TCA9539_I2C_BUS_NAME "i2c1"
+#define BSP_TCA9539_DEV_ADDR (0x74U)
+
+#define TCA9539_RST_PIN (32) /* PB15 */
+
+/*******************************************************************************
+ * Global variable definitions (declared in header file with 'extern')
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Local function prototypes ('static')
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Local variable definitions ('static')
+ ******************************************************************************/
+static struct rt_i2c_bus_device *i2c_bus = RT_NULL;
+
+/*******************************************************************************
+ * Function implementation - global ('extern') and local ('static')
+ ******************************************************************************/
+/**
+ * @brief BSP TCA9539 write data.
+ * @param [in] bus: Pointer to the i2c bus device.
+ * @param [in] reg: Register to be written.
+ * @param [in] data: The pointer to the buffer contains the data to be written.
+ * @param [in] len: Buffer size in byte.
+ * @retval rt_err_t:
+ * - RT_EOK
+ * - -RT_ERROR
+ */
+static rt_err_t BSP_TCA9539_I2C_Write(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data, rt_uint16_t len)
+{
+ struct rt_i2c_msg msgs;
+ rt_uint8_t buf[6];
+
+ buf[0] = reg;
+ if (len > 0)
+ {
+ if (len < 6)
+ {
+ rt_memcpy(buf + 1, data, len);
+ }
+ else
+ {
+ return -RT_ERROR;
+ }
+ }
+ msgs.addr = BSP_TCA9539_DEV_ADDR;
+ msgs.flags = RT_I2C_WR;
+ msgs.buf = buf;
+ msgs.len = len + 1;
+ if (rt_i2c_transfer(bus, &msgs, 1) == 1)
+ {
+ return RT_EOK;
+ }
+ else
+ {
+ return -RT_ERROR;
+ }
+}
+
+/**
+ * @brief BSP TCA9539 Read data.
+ * @param [in] bus: Pointer to the i2c bus device.
+ * @param [in] reg: Register to be read.
+ * @param [out] data: The pointer to the buffer contains the data to be read.
+ * @param [in] len: Buffer size in byte.
+ * @retval rt_err_t:
+ * - RT_EOK
+ * - -RT_ERROR
+ */
+static rt_err_t BSP_TCA9539_I2C_Read(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data, rt_uint16_t len)
+{
+ struct rt_i2c_msg msgs;
+
+ if (RT_EOK != BSP_TCA9539_I2C_Write(bus, reg, RT_NULL, 0))
+ {
+ return -RT_ERROR;
+ }
+ msgs.addr = BSP_TCA9539_DEV_ADDR;
+ msgs.flags = RT_I2C_RD;
+ msgs.buf = data;
+ msgs.len = len;
+ if (rt_i2c_transfer(bus, &msgs, 1) == 1)
+ {
+ return RT_EOK;
+ }
+ else
+ {
+ return -RT_ERROR;
+ }
+}
+
+
+/**
+ * @brief Reset TCA9539.
+ * @param [in] None
+ * @retval None
+ */
+static void TCA9539_Reset(void)
+{
+ rt_pin_mode(TCA9539_RST_PIN, PIN_MODE_OUTPUT);
+ /* Reset the device */
+ rt_pin_write(TCA9539_RST_PIN, PIN_LOW);
+ rt_thread_mdelay(3U);
+ rt_pin_write(TCA9539_RST_PIN, PIN_HIGH);
+}
+
+/**
+ * @brief Write TCA9539 pin output value.
+ * @param [in] u8Port Port number.
+ * This parameter can be one of the following values:
+ * @arg @ref TCA9539_Port_Definition
+ * @param [in] u8Pin Pin number.
+ * This parameter can be one or any combination of the following values:
+ * @arg @ref TCA9539_Pin_Definition
+ * @param [in] u8PinState Pin state to be written.
+ * This parameter can be one of the following values:
+ * @arg @ref TCA9539_Pin_State_Definition
+ * @retval rt_err_t:
+ * - RT_ERROR
+ * - RT_EOK
+ */
+rt_err_t TCA9539_WritePin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState)
+{
+ uint8_t u8TempData[2];
+
+ u8TempData[0] = u8Port + TCA9539_REG_OUTPUT_PORT0;
+ if (RT_EOK != BSP_TCA9539_I2C_Read(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+ if (0U == u8PinState)
+ {
+ u8TempData[1] &= (uint8_t)(~u8Pin);
+ }
+ else
+ {
+ u8TempData[1] |= u8Pin;
+ }
+ if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+
+ return RT_EOK;
+}
+
+/**
+ * @brief Read TCA9539 pin input value.
+ * @param [in] u8Port Port number.
+ * This parameter can be one of the following values:
+ * @arg @ref TCA9539_Port_Definition
+ * @param [in] u8Pin Pin number.
+ * This parameter can be one or any combination of the following values:
+ * @arg @ref TCA9539_Pin_Definition
+ * @param [in] u8PinState Pin state to be written.
+ * This parameter can be one of the following values:
+ * @arg @ref TCA9539_Pin_State_Definition
+ * @retval rt_err_t:
+ * - RT_ERROR
+ * - RT_EOK
+ */
+rt_err_t TCA9539_ReadPin(uint8_t u8Port, uint8_t u8Pin, uint8_t *pu8PinState)
+{
+ uint8_t u8TempData[2];
+
+ u8TempData[0] = u8Port + TCA9539_REG_INPUT_PORT0;
+ if (RT_EOK != BSP_TCA9539_I2C_Read(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+ if (0U != (u8TempData[1] & u8Pin))
+ {
+ *pu8PinState = TCA9539_PIN_SET;
+ }
+ else
+ {
+ *pu8PinState = TCA9539_PIN_RESET;
+ }
+
+ return RT_EOK;
+}
+
+/**
+ * @brief Toggle TCA9539 pin output value.
+ * @param [in] u8Port Port number.
+ * This parameter can be one of the following values:
+ * @arg @ref TCA9539_Port_Definition
+ * @param [in] u8Pin Pin number.
+ * This parameter can be one or any combination of the following values:
+ * @arg @ref TCA9539_Pin_Definition
+ * @retval rt_err_t:
+ * - -RT_ERROR
+ * - RT_EOK
+ */
+rt_err_t TCA9539_TogglePin(uint8_t u8Port, uint8_t u8Pin)
+{
+ uint8_t u8TempData[2];
+
+ u8TempData[0] = u8Port + TCA9539_REG_OUTPUT_PORT0;
+ if (RT_EOK != BSP_TCA9539_I2C_Read(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+ u8TempData[1] ^= u8Pin;
+ if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+
+ return RT_EOK;
+}
+
+/**
+ * @brief Configuration TCA9539 pin.
+ * @param [in] u8Port Port number.
+ * This parameter can be one of the following values:
+ * @arg @ref TCA9539_Port_Definition
+ * @param [in] u8Pin Pin number.
+ * This parameter can be one or any combination of the following values:
+ * @arg @ref TCA9539_Pin_Definition
+ * @param [in] u8Dir Pin output direction.
+ * This parameter can be one of the following values:
+ * @arg @ref TCA9539_Direction_Definition
+ * @retval rt_err_t:
+ * - -RT_ERROR
+ * - RT_EOK
+ */
+rt_err_t TCA9539_ConfigPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8Dir)
+{
+ uint8_t u8TempData[2];
+
+ u8TempData[0] = u8Port + TCA9539_REG_CONFIG_PORT0;
+ if (RT_EOK != BSP_TCA9539_I2C_Read(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+ if (TCA9539_DIR_OUT == u8Dir)
+ {
+ u8TempData[1] &= (uint8_t)(~u8Pin);
+ }
+ else
+ {
+ u8TempData[1] |= u8Pin;
+ }
+ if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+
+ return RT_EOK;
+}
+
+/**
+ * @brief Initialize TCA9539.
+ * @param [in] None
+ * @retval rt_err_t:
+ * - -RT_ERROR
+ * - RT_EOK
+ */
+int TCA9539_Init(void)
+{
+ char name[RT_NAME_MAX];
+ uint8_t u8TempData[2];
+
+ TCA9539_Reset();
+ rt_strncpy(name, BSP_TCA9539_I2C_BUS_NAME, RT_NAME_MAX);
+ i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name);
+ if (i2c_bus == RT_NULL)
+ {
+ rt_kprintf("can't find %s device!\n", BSP_TCA9539_I2C_BUS_NAME);
+ return -RT_ERROR;
+ }
+ /* All Pins are input as default */
+ u8TempData[0] = TCA9539_REG_CONFIG_PORT0;
+ u8TempData[1] = 0xFFU;
+ if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+ u8TempData[0] = TCA9539_REG_CONFIG_PORT1;
+ if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U))
+ {
+ return -RT_ERROR;
+ }
+
+ return RT_EOK;
+}
+INIT_PREV_EXPORT(TCA9539_Init);
+
+#endif /* BSP_USING_TCA9539 */
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.h b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.h
new file mode 100644
index 0000000000..097f3a0675
--- /dev/null
+++ b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2024-02-20 CDT first version
+ */
+
+#ifndef __TCA9539_H__
+#define __TCA9539_H__
+
+#include
+
+/**
+ * @defgroup TCA9539_REGISTER_Definition TCA9539 Register Definition
+ * @{
+ */
+#define TCA9539_REG_INPUT_PORT0 (0x00U)
+#define TCA9539_REG_INPUT_PORT1 (0x01U)
+#define TCA9539_REG_OUTPUT_PORT0 (0x02U)
+#define TCA9539_REG_OUTPUT_PORT1 (0x03U)
+#define TCA9539_REG_INVERT_PORT0 (0x04U)
+#define TCA9539_REG_INVERT_PORT1 (0x05U)
+#define TCA9539_REG_CONFIG_PORT0 (0x06U)
+#define TCA9539_REG_CONFIG_PORT1 (0x07U)
+/**
+ * @}
+ */
+
+/**
+ * @defgroup TCA9539_Port_Definition TCA9539 Port Definition
+ * @{
+ */
+#define TCA9539_IO_PORT0 (0x00U)
+#define TCA9539_IO_PORT1 (0x01U)
+/**
+ * @}
+ */
+
+/**
+ * @defgroup TCA9539_Pin_Definition TCA9539 Pin Definition
+ * @{
+ */
+#define TCA9539_IO_PIN0 (0x01U)
+#define TCA9539_IO_PIN1 (0x02U)
+#define TCA9539_IO_PIN2 (0x04U)
+#define TCA9539_IO_PIN3 (0x08U)
+#define TCA9539_IO_PIN4 (0x10U)
+#define TCA9539_IO_PIN5 (0x20U)
+#define TCA9539_IO_PIN6 (0x40U)
+#define TCA9539_IO_PIN7 (0x80U)
+#define TCA9539_IO_PIN_ALL (0xFFU)
+/**
+ * @}
+ */
+
+/**
+ * @defgroup TCA9539_Direction_Definition TCA9539 Direction Definition
+ * @{
+ */
+#define TCA9539_DIR_OUT (0x00U)
+#define TCA9539_DIR_IN (0x01U)
+/**
+ * @}
+ */
+
+/**
+ * @defgroup TCA9539_Pin_State_Definition TCA9539 Pin State Definition
+ * @{
+ */
+#define TCA9539_PIN_RESET (0x00U)
+#define TCA9539_PIN_SET (0x01U)
+/**
+ * @}
+ */
+
+/**
+ * @defgroup HC32F448_EV_IO_Function_Sel Expand IO function definition
+ * @{
+ */
+#define EIO_SCI_CD (TCA9539_IO_PIN1) /* Smart card detect, input */
+#define EIO_TOUCH_INT (TCA9539_IO_PIN2) /* Touch screen interrupt, input */
+#define EIO_TOUCH_CTRST (TCA9539_IO_PIN5) /* 'Reset' for Cap touch panel, output */
+#define EIO_LCD_RST (TCA9539_IO_PIN6) /* LCD panel reset, output */
+#define EIO_LCD_BKL (TCA9539_IO_PIN7) /* LCD panel back light, output */
+
+#define EIO_LIN_SLEEP (TCA9539_IO_PIN1) /* LIN PHY sleep, output */
+#define EIO_CAN1_STB (TCA9539_IO_PIN2) /* CAN1 PHY standby, output */
+#define EIO_CAN2_STB (TCA9539_IO_PIN3) /* CAN2 PHY standby, output */
+#define EIO_LED_RED (TCA9539_IO_PIN5) /* Red LED, output */
+#define EIO_LED_YELLOW (TCA9539_IO_PIN6) /* Yellow LED, output */
+#define EIO_LED_BLUE (TCA9539_IO_PIN7) /* Blue LED, output */
+/**
+ * @}
+ */
+
+/**
+ * @defgroup BSP_LED_PortPin_Sel BSP LED port/pin definition
+ * @{
+ */
+#define LED_PORT (TCA9539_IO_PORT1)
+#define LED_RED_PORT (TCA9539_IO_PORT1)
+#define LED_RED_PIN (EIO_LED_RED)
+#define LED_YELLOW_PORT (TCA9539_IO_PORT1)
+#define LED_YELLOW_PIN (EIO_LED_YELLOW)
+#define LED_BLUE_PORT (TCA9539_IO_PORT1)
+#define LED_BLUE_PIN (EIO_LED_BLUE)
+/**
+ * @}
+ */
+
+/**
+ * @defgroup BSP CAN PHY STB port/pin definition
+ * @{
+ */
+#define CAN1_STB_PORT (TCA9539_IO_PORT1)
+#define CAN1_STB_PIN (EIO_CAN1_STB)
+#define CAN2_STB_PORT (TCA9539_IO_PORT1)
+#define CAN2_STB_PIN (EIO_CAN2_STB)
+/**
+ * @}
+ */
+
+int TCA9539_Init(void);
+rt_err_t TCA9539_WritePin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState);
+rt_err_t TCA9539_ReadPin(uint8_t u8Port, uint8_t u8Pin, uint8_t *pu8PinState);
+rt_err_t TCA9539_TogglePin(uint8_t u8Port, uint8_t u8Pin);
+rt_err_t TCA9539_ConfigPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8Dir);
+
+#endif
diff --git a/bsp/hc32/ev_hc32f448_lqfp80/figures/board.png b/bsp/hc32/ev_hc32f448_lqfp80/figures/board.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1c984dbd154e36d5487ab27b82b1f2f441f7621
GIT binary patch
literal 7822856
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