From 3436aa64cbf02ab77268c8343a07e0de89e9bf47 Mon Sep 17 00:00:00 2001 From: QTbin <52951453+QT-one@users.noreply.github.com> Date: Mon, 13 Jan 2025 10:32:15 +0800 Subject: [PATCH] =?UTF-8?q?[ht32][drv]=E6=96=B0=E5=A2=9E=E4=BA=86CAN?= =?UTF-8?q?=E3=80=81USB=E5=92=8CSDIO=E7=9A=84=E9=A9=B1=E5=8A=A8=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/bsp_buildings.yml | 1 + bsp/ht32/ht32f12366/.config | 262 +- bsp/ht32/ht32f12366/README.md | 4 +- bsp/ht32/ht32f12366/SConstruct | 3 + bsp/ht32/ht32f12366/applications/test.c | 123 +- bsp/ht32/ht32f12366/board/Kconfig | 137 +- bsp/ht32/ht32f12366/board/inc/board.h | 4 + bsp/ht32/ht32f12366/board/inc/ht32_msp.h | 65 +- .../board/inc/ht32f1xxxx_01_usbdconf.h | 52 +- bsp/ht32/ht32f12366/board/src/ht32_msp.c | 48 +- bsp/ht32/ht32f12366/project.uvoptx | 876 ++++--- bsp/ht32/ht32f12366/project.uvprojx | 843 ++----- bsp/ht32/ht32f12366/rtconfig.h | 147 +- bsp/ht32/ht32f12366/template.uvoptx | 2 +- bsp/ht32/ht32f12366/template.uvprojx | 6 +- bsp/ht32/ht32f52352/.config | 260 +- bsp/ht32/ht32f52352/README.md | 4 +- bsp/ht32/ht32f52352/SConstruct | 3 + bsp/ht32/ht32f52352/applications/test.c | 102 +- bsp/ht32/ht32f52352/board/Kconfig | 134 + .../board/inc/ht32f5xxxx_01_usbdconf.h | 52 +- bsp/ht32/ht32f52352/project.uvoptx | 756 +++--- bsp/ht32/ht32f52352/project.uvprojx | 778 ++---- bsp/ht32/ht32f52352/rtconfig.h | 146 +- bsp/ht32/ht32f52352/template.uvprojx | 6 +- .../.ci/attachconfig/ci.attachconfig.yml | 18 + bsp/ht32/ht32f53252/.config | 1326 ++++++++++ bsp/ht32/ht32f53252/Kconfig | 12 + bsp/ht32/ht32f53252/README.md | 108 + bsp/ht32/ht32f53252/SConscript | 15 + bsp/ht32/ht32f53252/SConstruct | 63 + bsp/ht32/ht32f53252/applications/SConscript | 26 + bsp/ht32/ht32f53252/applications/main.c | 37 + bsp/ht32/ht32f53252/applications/test.c | 941 +++++++ bsp/ht32/ht32f53252/board/Kconfig | 449 ++++ bsp/ht32/ht32f53252/board/SConscript | 27 + bsp/ht32/ht32f53252/board/inc/board.h | 56 + .../ht32f53252/board/inc/ht32_can_config.h | 111 + bsp/ht32/ht32f53252/board/inc/ht32_msp.h | 368 +++ .../board/inc/ht32f5xxxx_01_usbdconf.h | 453 ++++ .../board/inc/ht32f5xxxx_02_usbdconf.h | 569 +++++ .../ht32f53252/board/inc/ht32f5xxxx_conf.h | 556 ++++ .../ht32f53252/board/linker_scripts/link.icf | 28 + .../ht32f53252/board/linker_scripts/link.lds | 156 ++ .../ht32f53252/board/linker_scripts/link.sct | 15 + bsp/ht32/ht32f53252/board/src/board.c | 17 + bsp/ht32/ht32f53252/board/src/ht32_msp.c | 272 ++ bsp/ht32/ht32f53252/figures/board.jpg | Bin 0 -> 477663 bytes bsp/ht32/ht32f53252/project.uvoptx | 1203 +++++++++ bsp/ht32/ht32f53252/project.uvprojx | 2234 +++++++++++++++++ bsp/ht32/ht32f53252/rtconfig.h | 394 +++ bsp/ht32/ht32f53252/rtconfig.py | 152 ++ bsp/ht32/ht32f53252/template.uvoptx | 179 ++ bsp/ht32/ht32f53252/template.uvprojx | 391 +++ bsp/ht32/libraries/.ignore_format.yml | 1 + .../HT32_STD_1xxxx_FWLib/Release_Notes.txt | 87 +- .../libraries/HT32_STD_1xxxx_FWLib/SConscript | 28 +- .../Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h | 35 +- .../Source/ARM/startup_ht32f12345.s | 80 +- .../Source/ARM/startup_ht32f12364.s | 30 +- .../Source/ARM/startup_ht32f12365_66.s | 80 +- .../HT32F1xxxx/Source/ARM/startup_ht32f165x.s | 80 +- .../Source/ARM/startup_ht32f1xxxx_01.s | 80 +- .../Source/ARM/startup_ht32f1xxxx_03.s | 30 +- .../CodeSourcery/startup_ht32f1xxxx_cs3_01.s | 36 +- .../Source/GCC/startup_ht32f1xxxx_gcc_01.s | 36 +- .../Source/IAR/startup_ht32f1xxxx_iar_01.s | 52 +- .../emStudio/startup_ht32f1xxxx_es_01.s | 36 +- .../HT32F1xxxx_Driver/inc/ht32_cm3_misc.h | 9 +- .../HT32F1xxxx_Driver/inc/ht32_dependency.h | 18 +- .../library/HT32F1xxxx_Driver/inc/ht32_time.h | 24 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h | 16 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h | 6 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h | 4 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h | 6 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h | 18 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h | 34 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h | 6 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h | 19 +- .../HT32F1xxxx_Driver/src/ht32_cm3_misc.c | 97 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c | 46 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c | 104 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c | 6 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c | 11 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c | 10 +- .../HT32_STD_5xxxx_FWLib/Release_Notes.txt | 281 ++- .../libraries/HT32_STD_5xxxx_FWLib/SConscript | 29 +- .../Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h | 153 +- .../HT32F5xxxx/Source/ARM/startup_hf5032.s | 34 +- .../HT32F5xxxx/Source/ARM/startup_ht32f0006.s | 30 +- .../HT32F5xxxx/Source/ARM/startup_ht32f0008.s | 30 +- .../Source/ARM/startup_ht32f50020_30.s | 33 +- .../Source/ARM/startup_ht32f50220_30.s | 38 +- .../Source/ARM/startup_ht32f50231_41.s | 38 +- .../Source/ARM/startup_ht32f50343.s | 30 +- .../Source/ARM/startup_ht32f50431_41.s | 34 +- .../Source/ARM/startup_ht32f50442_52.s | 34 +- .../Source/ARM/startup_ht32f52142.s | 30 +- .../Source/ARM/startup_ht32f52220_30.s | 48 +- .../Source/ARM/startup_ht32f52231_41.s | 48 +- .../Source/ARM/startup_ht32f52234_44.s | 36 +- .../Source/ARM/startup_ht32f52243_53.s | 48 +- .../Source/ARM/startup_ht32f52331_41.s | 48 +- .../Source/ARM/startup_ht32f52342_52.s | 48 +- .../Source/ARM/startup_ht32f52344_54.s | 30 +- .../Source/ARM/startup_ht32f52357_67.s | 30 +- .../Source/ARM/startup_ht32f53231_41.s | 30 +- .../Source/ARM/startup_ht32f53242_52.s | 30 +- .../Source/ARM/startup_ht32f54231_41.s | 30 +- .../Source/ARM/startup_ht32f54243_53.s | 30 +- .../Source/ARM/startup_ht32f57331_41.s | 38 +- .../Source/ARM/startup_ht32f57342_52.s | 38 +- .../Source/ARM/startup_ht32f57541.s | 378 +++ .../Source/ARM/startup_ht32f57552.s | 378 +++ .../HT32F5xxxx/Source/ARM/startup_ht32f5826.s | 42 +- .../HT32F5xxxx/Source/ARM/startup_ht32f5828.s | 38 +- .../Source/ARM/startup_ht32f59041.s | 38 +- .../Source/ARM/startup_ht32f59045.s | 520 ++++ .../Source/ARM/startup_ht32f59741.s | 38 +- .../Source/ARM/startup_ht32f59746.s | 38 +- .../Source/ARM/startup_ht32f5xxxx_01.s | 48 +- .../Source/ARM/startup_ht32f5xxxx_02.s | 38 +- .../Source/ARM/startup_ht32f5xxxx_03.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_05.s | 38 +- .../Source/ARM/startup_ht32f5xxxx_06.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_07.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_08.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_09.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_10.s | 34 +- .../Source/ARM/startup_ht32f5xxxx_11.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_12.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_13.s | 34 +- .../Source/ARM/startup_ht32f5xxxx_14.s | 34 +- .../Source/ARM/startup_ht32f5xxxx_15.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_16.s | 36 +- .../Source/ARM/startup_ht32f5xxxx_17.s | 34 +- .../Source/ARM/startup_ht32f61030.s | 34 +- .../Source/ARM/startup_ht32f61041.s | 38 +- .../Source/ARM/startup_ht32f61052.s | 288 +++ .../Source/ARM/startup_ht32f61141.s | 30 +- .../Source/ARM/startup_ht32f61244_45.s | 34 +- .../Source/ARM/startup_ht32f61352.s | 30 +- .../Source/ARM/startup_ht32f61355_56_57.s | 30 +- .../Source/ARM/startup_ht32f61630.s | 34 +- .../Source/ARM/startup_ht32f61641.s | 38 +- .../Source/ARM/startup_ht32f61730.s | 259 ++ .../Source/ARM/startup_ht32f61741.s | 347 +++ .../Source/ARM/startup_ht32f62030.s | 48 +- .../Source/ARM/startup_ht32f62040.s | 48 +- .../Source/ARM/startup_ht32f62050.s | 48 +- .../Source/ARM/startup_ht32f62140.s | 520 ++++ .../Source/ARM/startup_ht32f65230_40.s | 30 +- .../Source/ARM/startup_ht32f65232.s | 30 +- .../Source/ARM/startup_ht32f66242.s | 36 +- .../Source/ARM/startup_ht32f66246.s | 36 +- .../Source/ARM/startup_ht32f67041_51.s | 30 +- .../Source/ARM/startup_ht32f67232.s | 48 +- .../Source/ARM/startup_ht32f67233.s | 48 +- .../Source/ARM/startup_ht32f67741.s | 48 +- .../Source/ARM/startup_ht32f67742.s | 38 +- .../Source/ARM/startup_ht50f32002.s | 38 +- .../Source/ARM/startup_ht50f32003.s | 48 +- .../Source/ARM/startup_ht50f3200s.s | 30 +- .../Source/ARM/startup_ht50f3200t.s | 30 +- .../Source/ARM/startup_ht50f3200u.s | 520 ++++ .../HT32F5xxxx/Source/ARM/startup_mxtx52231.s | 520 ++++ .../HT32F5xxxx/Source/ARM/startup_mxtx52352.s | 520 ++++ .../HT32F5xxxx/Source/ARM/startup_mxtx6306.s | 30 +- .../Source/ARM/startup_nw32f61242.s | 259 ++ .../CodeSourcery/startup_ht32f5xxxx_cs3_01.s | 24 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_02.s | 12 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_05.s | 12 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_10.s | 8 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_13.s | 8 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_14.s | 8 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_16.s | 8 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_17.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_01.s | 24 +- .../Source/GCC/startup_ht32f5xxxx_gcc_02.s | 12 +- .../Source/GCC/startup_ht32f5xxxx_gcc_05.s | 12 +- .../Source/GCC/startup_ht32f5xxxx_gcc_10.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_13.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_14.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_16.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_17.s | 8 +- .../Source/IAR/startup_ht32f5xxxx_iar_01.s | 22 +- .../Source/IAR/startup_ht32f5xxxx_iar_02.s | 12 +- .../Source/IAR/startup_ht32f5xxxx_iar_05.s | 12 +- .../Source/IAR/startup_ht32f5xxxx_iar_10.s | 8 +- .../Source/IAR/startup_ht32f5xxxx_iar_13.s | 8 +- .../Source/IAR/startup_ht32f5xxxx_iar_14.s | 8 +- .../Source/IAR/startup_ht32f5xxxx_iar_16.s | 10 +- .../Source/IAR/startup_ht32f5xxxx_iar_17.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_01.s | 24 +- .../emStudio/startup_ht32f5xxxx_es_02.s | 12 +- .../emStudio/startup_ht32f5xxxx_es_05.s | 12 +- .../emStudio/startup_ht32f5xxxx_es_10.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_13.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_14.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_16.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_17.s | 8 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_01.c | 6 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_02.c | 12 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_04.c | 8 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_05.c | 8 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_10.c | 6 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_13.c | 6 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_14.c | 6 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_18.c | 17 +- .../inc/ht32_can_config0_calc.h | 385 +++ .../HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h | 9 +- .../HT32F5xxxx_Driver/inc/ht32_config.h | 96 +- .../HT32F5xxxx_Driver/inc/ht32_dependency.h | 18 +- .../library/HT32F5xxxx_Driver/inc/ht32_time.h | 24 +- .../inc/ht32f50020_30_libcfg.h | 5 +- .../HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h | 4 +- .../inc/ht32f50431_41_libcfg.h | 5 +- .../inc/ht32f50442_52_libcfg.h | 6 +- .../inc/ht32f53231_41_libcfg.h | 5 +- .../inc/ht32f53242_52_libcfg.h | 6 +- .../inc/ht32f54231_41_libcfg.h | 5 +- .../inc/ht32f54243_53_libcfg.h | 5 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h | 6 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h | 473 ++-- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h | 43 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h | 47 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h | 13 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h | 18 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h | 6 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h | 20 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h | 14 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h | 17 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h | 31 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h | 17 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h | 14 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h | 52 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h | 19 +- .../inc/ht32f65230_40_libcfg.h | 10 +- .../HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h | 13 +- .../inc/ht32f65xxx_66xxx_adc.h | 95 +- .../inc/ht32f65xxx_66xxx_opa.h | 35 +- .../inc/ht32f65xxx_66xxx_pga.h | 107 +- .../HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h | 62 +- .../HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h | 63 +- .../HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h | 242 +- .../HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h | 103 +- .../HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c | 99 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c | 11 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c | 18 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_can.c | 1754 +++++++------ .../HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c | 132 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c | 8 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c | 17 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c | 14 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c | 6 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c | 11 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c | 15 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c | 21 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c | 9 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c | 18 +- .../src/ht32f65xxx_66xxx_adc.c | 131 +- .../src/ht32f65xxx_66xxx_opa.c | 122 +- .../src/ht32f65xxx_66xxx_pga.c | 652 ++++- .../HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c | 188 +- .../HT32F5xxxx_Driver/src/ht32f66xxx_pid.c | 299 ++- bsp/ht32/libraries/ht32_drivers/SConscript | 9 + bsp/ht32/libraries/ht32_drivers/cpuport.h | 23 + bsp/ht32/libraries/ht32_drivers/drv_can.c | 673 +++++ bsp/ht32/libraries/ht32_drivers/drv_can.h | 26 + bsp/ht32/libraries/ht32_drivers/drv_common.c | 2 +- bsp/ht32/libraries/ht32_drivers/drv_sdio.c | 747 ++++++ bsp/ht32/libraries/ht32_drivers/drv_sdio.h | 58 + bsp/ht32/libraries/ht32_drivers/drv_usart.c | 10 +- bsp/ht32/libraries/ht32_drivers/drv_usbd.c | 301 +++ bsp/ht32/libraries/ht32_drivers/drv_usbd.h | 27 + bsp/ht32/libraries/usbd_library/SConscript | 22 + bsp/ht32/libraries/usbd_library/checkout.py | 39 + .../usbd_library/inc/ht32_usbd_core.h | 437 ++++ .../usbd_library/inc/ht32_usbd_int.h | 48 + .../libraries/usbd_library/inc/usb_port.h | 29 + .../libraries/usbd_library/inc/usbd_code.h | 434 ++++ .../usbd_library/src/ht32_usbd_core.c | 1069 ++++++++ .../usbd_library/src/ht32_usbd_int.c | 353 +++ .../libraries/usbd_library/src/usb_port.c | 203 ++ .../libraries/usbd_library/src/usbd_code.c | 327 +++ bsp/ht32/tools/sdk_dist.py | 24 + 286 files changed, 29783 insertions(+), 4729 deletions(-) create mode 100644 bsp/ht32/ht32f53252/.ci/attachconfig/ci.attachconfig.yml create mode 100644 bsp/ht32/ht32f53252/.config create mode 100644 bsp/ht32/ht32f53252/Kconfig create mode 100644 bsp/ht32/ht32f53252/README.md create mode 100644 bsp/ht32/ht32f53252/SConscript create mode 100644 bsp/ht32/ht32f53252/SConstruct create mode 100644 bsp/ht32/ht32f53252/applications/SConscript create mode 100644 bsp/ht32/ht32f53252/applications/main.c create mode 100644 bsp/ht32/ht32f53252/applications/test.c create mode 100644 bsp/ht32/ht32f53252/board/Kconfig create mode 100644 bsp/ht32/ht32f53252/board/SConscript create mode 100644 bsp/ht32/ht32f53252/board/inc/board.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32_can_config.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32_msp.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_01_usbdconf.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_02_usbdconf.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_conf.h create mode 100644 bsp/ht32/ht32f53252/board/linker_scripts/link.icf create mode 100644 bsp/ht32/ht32f53252/board/linker_scripts/link.lds create mode 100644 bsp/ht32/ht32f53252/board/linker_scripts/link.sct create mode 100644 bsp/ht32/ht32f53252/board/src/board.c create mode 100644 bsp/ht32/ht32f53252/board/src/ht32_msp.c create mode 100644 bsp/ht32/ht32f53252/figures/board.jpg create mode 100644 bsp/ht32/ht32f53252/project.uvoptx create mode 100644 bsp/ht32/ht32f53252/project.uvprojx create mode 100644 bsp/ht32/ht32f53252/rtconfig.h create mode 100644 bsp/ht32/ht32f53252/rtconfig.py create mode 100644 bsp/ht32/ht32f53252/template.uvoptx create mode 100644 bsp/ht32/ht32f53252/template.uvprojx create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57541.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57552.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59045.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61052.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61730.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61741.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62140.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200u.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52231.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52352.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_nw32f61242.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_can_config0_calc.h create mode 100644 bsp/ht32/libraries/ht32_drivers/cpuport.h create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_can.c create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_can.h create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_sdio.c create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_sdio.h create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_usbd.c create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_usbd.h create mode 100644 bsp/ht32/libraries/usbd_library/SConscript create mode 100644 bsp/ht32/libraries/usbd_library/checkout.py create mode 100644 bsp/ht32/libraries/usbd_library/inc/ht32_usbd_core.h create mode 100644 bsp/ht32/libraries/usbd_library/inc/ht32_usbd_int.h create mode 100644 bsp/ht32/libraries/usbd_library/inc/usb_port.h create mode 100644 bsp/ht32/libraries/usbd_library/inc/usbd_code.h create mode 100644 bsp/ht32/libraries/usbd_library/src/ht32_usbd_core.c create mode 100644 bsp/ht32/libraries/usbd_library/src/ht32_usbd_int.c create mode 100644 bsp/ht32/libraries/usbd_library/src/usb_port.c create mode 100644 bsp/ht32/libraries/usbd_library/src/usbd_code.c diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index fcd219d33b..488583e39b 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -101,6 +101,7 @@ jobs: - "rm48x50" - "ht32/ht32f52352" - "ht32/ht32f12366" + - "ht32/ht32f53252" - "w60x" - "essemi/es32f0654" - "essemi/es32f365x" diff --git a/bsp/ht32/ht32f12366/.config b/bsp/ht32/ht32f12366/.config index 80ce545f3d..f0a158b051 100644 --- a/bsp/ht32/ht32f12366/.config +++ b/bsp/ht32/ht32f12366/.config @@ -1,15 +1,117 @@ -# -# Automatically generated file; DO NOT EDIT. -# RT-Thread Configuration -# # # RT-Thread Kernel # + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + 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_SMART is not set # CONFIG_RT_USING_AMP is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_CPUS_NR=1 @@ -19,26 +121,24 @@ 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_OVERFLOW_CHECK is not set 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_IDLE_THREAD_STACK_SIZE=512 # CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set # -# kservice optimization +# kservice options # -# 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 +# end of kservice options + +# CONFIG_RT_USING_DEBUG is not set +# CONFIG_RT_USING_CI_ACTION is not set # # Inter-Thread communication @@ -50,6 +150,7 @@ 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 +# end of Inter-Thread communication # # Memory Management @@ -68,21 +169,21 @@ CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMTRACE is not set # CONFIG_RT_USING_HEAP_ISR is not set CONFIG_RT_USING_HEAP=y +# end of Memory Management + CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set # CONFIG_RT_USING_THREADSAFE_PRINTF is not set -# CONFIG_RT_USING_SCHED_THREAD_CTX is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart0" CONFIG_RT_VER_NUM=0x50200 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 -# CONFIG_RT_USING_CACHE is not set +# end of RT-Thread Kernel + 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 @@ -117,12 +218,15 @@ CONFIG_FINSH_USING_OPTION_COMPLETION=y # DFS: device virtual file system # # CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + # CONFIG_RT_USING_FAL is not set # # Device Drivers # # CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_UNAMED_PIPE_NUMBER=64 # CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set @@ -131,53 +235,40 @@ 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_SERIAL_BYPASS is not set # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_CPUTIME is not set -CONFIG_RT_USING_I2C=y -# CONFIG_RT_I2C_DEBUG is not set -CONFIG_RT_USING_I2C_BITOPS=y -# CONFIG_RT_I2C_BITOPS_DEBUG is not set -# CONFIG_RT_USING_SOFT_I2C is not set +# CONFIG_RT_USING_I2C is not set # CONFIG_RT_USING_PHY is not set -CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_PHY_V2 is not set +# 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_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE 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=y -# CONFIG_RT_USING_SPI_BITOPS is not set -# CONFIG_RT_USING_QSPI is not set -# CONFIG_RT_USING_SPI_MSD is not set -# CONFIG_RT_USING_SFUD is not set -# CONFIG_RT_USING_ENC28J60 is not set -# CONFIG_RT_USING_SPI_WIFI is not set -CONFIG_RT_USING_WDT=y +# 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_BLK is not set # CONFIG_RT_USING_VIRTIO is not set CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_KTIME is not set # CONFIG_RT_USING_HWTIMER 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 +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers # # C/C++ and POSIX layer @@ -195,6 +286,8 @@ 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 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer # # POSIX (Portable Operating System Interface) layer @@ -216,7 +309,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # Socket is in the 'Network' category # +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + # CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer # # Network @@ -225,12 +322,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_NETDEV is not set # CONFIG_RT_USING_LWIP is not set # CONFIG_RT_USING_AT is not set +# end of Network # # Memory protection # # CONFIG_RT_USING_MEM_PROTECTION is not set # CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection # # Utilities @@ -242,12 +341,25 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RESOURCE_ID is not set # CONFIG_RT_USING_ADT is not set # CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + # CONFIG_RT_USING_VBUS is not set +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + # # RT-Thread Utestcases # # CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases # # RT-Thread online packages @@ -256,7 +368,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # 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 @@ -279,27 +390,35 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Marvell WiFi # # CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi # # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + # CONFIG_PKG_USING_RW007 is not set # # CYW43012 WiFi # # CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi # # BL808 WiFi # # CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi # # CYW43439 WiFi # # CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set @@ -322,6 +441,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set # CONFIG_PKG_USING_JOYLINK is not set # CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + # CONFIG_PKG_USING_NIMBLE is not set # CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set @@ -365,6 +486,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set # CONFIG_PKG_USING_LHC_MODBUS is not set # CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things # # security packages @@ -375,6 +497,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_TINYCRYPT is not set # CONFIG_PKG_USING_TFM is not set # CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages # # language packages @@ -390,18 +513,22 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_JSMN is not set # CONFIG_PKG_USING_AGILE_JSMN is not set # CONFIG_PKG_USING_PARSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format # # XML: Extensible Markup Language # # CONFIG_PKG_USING_SIMPLE_XML is not set # CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + # 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 +# end of language packages # # multimedia packages @@ -413,12 +540,15 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of LVGL: powerful and easy-to-use embedded GUI library # # u8g2: a monochrome graphic library # # CONFIG_PKG_USING_U8G2_OFFICIAL is not set # CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -438,6 +568,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_GUIENGINE is not set # CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages # # tools packages @@ -487,6 +618,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_VOFA_PLUS is not set # CONFIG_PKG_USING_RT_TRACE is not set # CONFIG_PKG_USING_ZDEBUG is not set +# end of tools packages # # system packages @@ -498,6 +630,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of enhanced kernel services + # CONFIG_PKG_USING_AUNITY is not set # @@ -506,6 +640,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of acceleration: Assembly language or algorithmic acceleration packages # # CMSIS: ARM Cortex-M Microcontroller Software Interface Standard @@ -516,6 +651,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_CMSIS_NN is not set # CONFIG_PKG_USING_CMSIS_RTOS1 is not set # CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard # # Micrium: Micrium software products porting for RT-Thread @@ -526,6 +662,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_LITEOS_SDK is not set # CONFIG_PKG_USING_TZ_DATABASE is not set @@ -573,6 +711,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RTP is not set # CONFIG_PKG_USING_REB is not set # CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages # # peripheral libraries and drivers @@ -589,6 +728,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set # CONFIG_PKG_USING_STM32WB55_SDK is not set # CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers # # Infineon HAL Packages @@ -603,6 +743,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_INFINEON_CSDIDAC is not set # CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set # CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + # CONFIG_PKG_USING_BLUETRUM_SDK is not set # CONFIG_PKG_USING_EMBARC_BSP is not set # CONFIG_PKG_USING_ESP_IDF is not set @@ -612,9 +754,12 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_K210_SDK is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + # CONFIG_PKG_USING_NRF5X_SDK is not set # CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers # # sensors drivers @@ -684,6 +829,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers # # touch drivers @@ -698,6 +844,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_XPT2046_TOUCH is not set # CONFIG_PKG_USING_CST816X is not set # CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set @@ -771,6 +919,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_BT_MX01 is not set # CONFIG_PKG_USING_RGPOWER is not set # CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers # # AI packages @@ -785,6 +934,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set # CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages # # Signal Processing and Control Algorithm Packages @@ -795,6 +945,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_DIGITALCTRL is not set # CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages # # miscellaneous packages @@ -803,6 +954,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # project laboratory # +# end of project laboratory # # samples: kernel and components samples @@ -811,6 +963,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples # # entertainment: terminal games and other interesting software packages @@ -827,6 +980,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_COWSAY is not set # CONFIG_PKG_USING_MORSE is not set # CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + # CONFIG_PKG_USING_LIBCSV is not set # CONFIG_PKG_USING_OPTPARSE is not set # CONFIG_PKG_USING_FASTLZ is not set @@ -860,6 +1015,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_SOEM is not set # CONFIG_PKG_USING_QPARAM is not set # CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages # # Arduino libraries @@ -875,6 +1031,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of Projects and Demos # # Sensors @@ -1015,6 +1172,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set # CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set # CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors # # Display @@ -1026,6 +1184,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of Display # # Timing @@ -1034,6 +1193,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set # CONFIG_PKG_USING_ARDUINO_TICKER is not set # CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing # # Data Processing @@ -1042,6 +1202,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set # CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set # CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing # # Data Storage @@ -1052,6 +1213,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication # # Device Control @@ -1063,12 +1225,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of Device Control # # Other # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other # # Signal IO @@ -1081,10 +1245,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of Signal IO # # Uncategorized # +# end of Arduino libraries +# end of RT-Thread online packages + CONFIG_SOC_FAMILY_HT32=y CONFIG_SOC_SERIES_HT32F1=y @@ -1103,11 +1271,13 @@ CONFIG_CORTEX_M3=y # CONFIG_SOC_HT32F12345 is not set # CONFIG_SOC_HT32F12364 is not set CONFIG_SOC_HT32F12366=y +# end of Chip Configuration # # Onboard Peripheral Drivers # # CONFIG_BSP_USING_TEST is not set +# end of Onboard Peripheral Drivers # # On-chip Peripheral Drivers @@ -1123,7 +1293,11 @@ CONFIG_BSP_USING_USART0_NAME="usart0" # CONFIG_BSP_USING_I2C is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_USBD is not set +# end of On-chip Peripheral Drivers # # Board extended module Drivers # +# end of Hardware Drivers Config diff --git a/bsp/ht32/ht32f12366/README.md b/bsp/ht32/ht32f12366/README.md index 04de7527d7..4f07d115d2 100644 --- a/bsp/ht32/ht32f12366/README.md +++ b/bsp/ht32/ht32f12366/README.md @@ -41,8 +41,8 @@ ESK32-30105使用32位ARM® Cortex®-M3高性能、低功耗单片机HT32F12366 | UART | 支持 | UART0/1 | | SPI | 支持 | SPI0/1 | | I2C | 支持 | 硬件 I2C0/1 | -| ADC | 暂不支持 | | -| WDT | 暂不支持 | | +| ADC | 支持 | | +| WDT | 支持 | | ## 使用说明 diff --git a/bsp/ht32/ht32f12366/SConstruct b/bsp/ht32/ht32f12366/SConstruct index 5fcd0e3860..218a226a5f 100644 --- a/bsp/ht32/ht32f12366/SConstruct +++ b/bsp/ht32/ht32f12366/SConstruct @@ -53,6 +53,9 @@ rtconfig.BSP_LIBRARY_TYPE = ht32_library # include libraries objs.extend(SConscript(os.path.join(libraries_path_prefix, ht32_library, 'SConscript'))) +# include usb libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'usbd_library', 'SConscript'))) + # include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'ht32_drivers', 'SConscript'))) diff --git a/bsp/ht32/ht32f12366/applications/test.c b/bsp/ht32/ht32f12366/applications/test.c index 1146f0aec6..50ab776ca1 100644 --- a/bsp/ht32/ht32f12366/applications/test.c +++ b/bsp/ht32/ht32f12366/applications/test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -58,10 +58,18 @@ static struct rt_semaphore rx_sem; static rt_mutex_t task_mutex = RT_NULL; /* task mutex */ /* device handle */ +#ifdef BSP_USING_UART static rt_device_t serial; +#endif +#ifdef BSP_USING_WDT static rt_device_t wdt_dev; +#endif +#ifdef BSP_USING_I2C struct rt_i2c_bus_device *i2c_dev; +#endif +#ifdef BSP_USING_SPI static struct rt_spi_device *spi_dev; +#endif /* In-file function declarations */ static void sys_run_dir(void *parameter); @@ -90,6 +98,7 @@ int task_registration(void) INIT_BOARD_EXPORT(task_registration); /* System operation indicator */ +#ifdef BSP_USING_GPIO static void sys_run_dir(void *parameter) { rt_uint32_t e; @@ -301,7 +310,9 @@ static int gpio_input_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(gpio_input_task, gpio input task operation); +#endif /* uart test */ +#ifdef BSP_USING_UART static rt_err_t uart_iqr_handle(rt_device_t dev, rt_size_t size) { /* Serial port callback function */ @@ -396,7 +407,9 @@ static int uart_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(uart_task, uart device sample); +#endif /* hw/sw iic test */ +#ifdef BSP_USING_I2C static void i2c_thread(void *parameter) { uint8_t write_addr = 0x00; @@ -497,7 +510,9 @@ static int i2c_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(i2c_task, i2c device sample); +#endif /* spi test */ +#ifdef BSP_USING_SPI static void spi_thread(void *parameter) { rt_uint8_t w25x_read_id = 0x9F; @@ -584,7 +599,9 @@ static int spi_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(spi_task, spi device sample); +#endif /* adc test */ +#ifdef BSP_USING_ADC static void adc_test(void *parameter) { rt_uint32_t adc0_ch11_val,adc0_ch12_val; @@ -640,8 +657,9 @@ static int adc_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(adc_task, adc task operation); - +#endif /* wdt test */ +#ifdef BSP_USING_WDT static void wdt_test(void) { rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); @@ -712,5 +730,106 @@ static int wdt_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(wdt_task, wdt task operation); +#endif +/* usbd test */ +#ifdef BSP_USING_USBD +static void usbd_test(void *parameter) +{ + rt_device_t dev = RT_NULL; + char dev_name[] = "vcom"; + char buf[] = "usbd vcom test!\r\n"; + dev = rt_device_find(dev_name); + + if (dev) + { + rt_device_open(dev, RT_DEVICE_FLAG_RDWR); + } + else + { + rt_kprintf("Device with name %s not found.\n",dev_name); + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + while (1) + { + rt_device_write(dev, 0, buf, rt_strlen(buf)); + rt_thread_mdelay(500); + } +} + +static int usbd_task(int argc, char *argv[]) +{ + rt_err_t ret = -RT_ERROR; + + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Gpio input test tasks */ + rt_thread_t usbd_vcom_task = rt_thread_create("usbd_vcom_task", + usbd_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (usbd_vcom_task != RT_NULL) + { + rt_thread_startup(usbd_vcom_task); + rt_kprintf("The usbd vcom task is registered.\n"); + } + else + { + rt_kprintf("usbd vcom task registration failed.\n"); + } + ret = RT_EOK; + } + else if(rt_strcmp(argv[1],"stop") == 0) + { + ret = RT_EOK; + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s stop\n",__func__); + } + return ret; +} +MSH_CMD_EXPORT(usbd_task, usbd task operation); +#endif +#ifdef BSP_USING_SDIO +int mnt_init(void) +{ + rt_device_t dev = RT_NULL; + char dev_name[] = BSP_USING_SDIO_NAME; + rt_thread_mdelay(1000); + + dev = rt_device_find(dev_name); + if(dev) + { + if(dfs_mount("sd0","/","elm",0,0) == RT_EOK) + { + rt_kprintf("dfs mount success!\r\n"); + } + else + { + rt_kprintf("dfs mount failed!\r\n"); + rt_kprintf("Formatting the SD card!\r\n"); + dfs_mkfs("elm",dev_name); + if(dfs_mount("sd0","/","elm",0,0) == RT_EOK) + { + rt_kprintf("dfs mount success!\r\n"); + } + else + { + rt_kprintf("dfs mount failed!\r\n"); + rt_kprintf("Exit SD card mount!\r\n"); + } + } + } + return 0; +} +INIT_FS_EXPORT(mnt_init); +#endif /* BSP_USING_SDIO */ #endif /* BSP_USING_TEST */ diff --git a/bsp/ht32/ht32f12366/board/Kconfig b/bsp/ht32/ht32f12366/board/Kconfig index 0623d4e30e..78fde32927 100644 --- a/bsp/ht32/ht32f12366/board/Kconfig +++ b/bsp/ht32/ht32f12366/board/Kconfig @@ -126,7 +126,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_UART bool "Enable UART" default n - select RT_USING_SERIAL + select RT_USING_SERIAL if BSP_USING_UART if BSP_USING_UART config BSP_USING_USART0 bool "Enable USART0" @@ -306,6 +306,141 @@ menu "On-chip Peripheral Drivers" depends on BSP_USING_WDT string "wdt device name" default "wdt" + + menuconfig BSP_USING_CAN + bool "Enable CAN" + depends on SOC_HT32F53241 || SOC_HT32F53242 || SOC_HT32F53252 + default n + select RT_USING_CAN if BSP_USING_CAN + config BSP_USING_CAN_NAME + depends on BSP_USING_CAN + string "can device name" + default "can" + if BSP_USING_CAN + config CAN_DEFAULT_BASE_CONFIGURATION + choice + prompt "Default CAN baud rate" + default BSP_USING_CAN500kBaud + config BSP_USING_CAN1MBaud + bool "CAN1MBaud" + config BSP_USING_CAN800kBaud + bool "CAN800kBaud" + config BSP_USING_CAN500kBaud + bool "CAN500kBaud" + config BSP_USING_CAN250kBaud + bool "CAN250kBaud" + config BSP_USING_CAN125kBaud + bool "CAN125kBaud" + config BSP_USING_CAN100kBaud + bool "CAN100kBaud" + config BSP_USING_CAN50kBaud + bool "CAN50kBaud" + config BSP_USING_CAN20kBaud + bool "CAN20kBaud" + config BSP_USING_CAN10kBaud + bool "CAN10kBaud" + endchoice + choice + prompt "Default CAN mode" + default BSP_USING_RT_CAN_MODE_NORMAL + config BSP_USING_RT_CAN_MODE_NORMAL + bool "RT_CAN_MODE_NORMAL" + config BSP_USING_RT_CAN_MODE_LISTEN + bool "RT_CAN_MODE_LISTEN" + config BSP_USING_RT_CAN_MODE_LOOPBACK + bool "RT_CAN_MODE_LOOPBACK" + config BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + bool "RT_CAN_MODE_LOOPBACKANLISTEN" + endchoice + + config BSP_USING_CAN_BAUD + int + default 1000000 if BSP_USING_CAN1MBaud + default 800000 if BSP_USING_CAN800kBaud + default 500000 if BSP_USING_CAN500kBaud + default 250000 if BSP_USING_CAN250kBaud + default 125000 if BSP_USING_CAN125kBaud + default 100000 if BSP_USING_CAN100kBaud + default 50000 if BSP_USING_CAN50kBaud + default 20000 if BSP_USING_CAN20kBaud + default 10000 if BSP_USING_CAN10kBaud + + config BSP_USING_CAN_MODE + int + default 0 if BSP_USING_RT_CAN_MODE_NORMAL + default 1 if BSP_USING_RT_CAN_MODE_LISTEN + default 2 if BSP_USING_RT_CAN_MODE_LOOPBACK + default 3 if BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + + config CAN_DEFAULT_FILTER_TABLE_CONFIGURATION + choice + prompt "Default filter id mode" + default BSP_USING_CAN_STD_ID + config BSP_USING_CAN_STD_ID + bool "CAN_STD_ID" + config BSP_USING_CAN_EXT_ID + bool "CAN_EXT_ID" + endchoice + + choice + prompt "Default filter frame mode" + default BSP_USING_CAN_DATA_FRAME + config BSP_USING_CAN_DATA_FRAME + bool "CAN_DATA_FRAME" + config BSP_USING_CAN_REMOTE_FRAME + bool "CAN_REMOTE_FRAME" + endchoice + + config BSP_USING_CAN_ID_MODE + int + default 0 if BSP_USING_CAN_STD_ID + default 1 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_FRAME_MODE + int + default 0 if BSP_USING_CAN_REMOTE_FRAME + default 1 if BSP_USING_CAN_DATA_FRAME + + config BSP_USING_CAN_MSG_NUM + int "Default filter table number" + range 0 31 + default 0 + + config BSP_USING_CAN_ID + hex "Default filter arbitration bit(ID)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x541 if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x541 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_MASK + hex "Default filter mask bit(MASK)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x7FF if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + + endif + + menuconfig BSP_USING_SDIO + bool "Enable SDIO" + depends on SOC_HT32F12345 || SOC_HT32F12365 || SOC_HT32F12366 + default n + select RT_USING_SDIO if BSP_USING_SDIO + select RT_USING_DFS if BSP_USING_SDIO + config BSP_USING_SDIO_NAME + depends on BSP_USING_SDIO + string "sdio device name" + default "sd0" + + menuconfig BSP_USING_USBD + bool "Enable USB BUS" + default n + select RT_USING_USB_DEVICE if BSP_USING_USBD + config BSP_USING_USBD_NAME + depends on BSP_USING_USBD + string "usbd device name" + default "usbd" endmenu menu "Board extended module Drivers" diff --git a/bsp/ht32/ht32f12366/board/inc/board.h b/bsp/ht32/ht32f12366/board/inc/board.h index c4a817d79b..91b93e424e 100644 --- a/bsp/ht32/ht32f12366/board/inc/board.h +++ b/bsp/ht32/ht32f12366/board/inc/board.h @@ -23,6 +23,10 @@ #include "drv_spi.h" #endif +#ifdef BSP_USING_SDIO +#include "dfs_fs.h" +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/bsp/ht32/ht32f12366/board/inc/ht32_msp.h b/bsp/ht32/ht32f12366/board/inc/ht32_msp.h index 3b6a4624e4..ba94061427 100644 --- a/bsp/ht32/ht32f12366/board/inc/ht32_msp.h +++ b/bsp/ht32/ht32f12366/board/inc/ht32_msp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -100,7 +100,7 @@ extern "C" { #define HTCFG_UART1_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART1_RX_GPION) #endif -#endif +#endif /* BSP_USING_UART */ /* SPI gpio */ #ifdef BSP_USING_SPI @@ -156,7 +156,7 @@ extern "C" { #define HTCFG_SPI1_MOSI_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI1_MOSI_GPION) #endif -#endif +#endif /* BSP_USING_SPI */ /* I2C gpio */ #ifdef BSP_USING_I2C_HW @@ -198,7 +198,8 @@ extern "C" { #define HTCFG_I2C1_SDA_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C1_SDA_GPION) #endif -#endif +#endif /* BSP_USING_I2C_HW */ + /* ADC gpio */ #ifdef BSP_USING_ADC #ifdef BSP_USING_ADC0 @@ -335,12 +336,66 @@ extern "C" { #define HTCFG_ADC1CH7_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH7_AFION) #endif -#endif +#endif /* BSP_USING_ADC */ +/* SDIO gpio */ +#ifdef BSP_USING_SDIO + #define HTCFG_SDIO_IPN SDIO + + #define _HTCFG_SDIO_CLK_GPIOX A + #define _HTCFG_SDIO_CLK_GPION 5 + + #define _HTCFG_SDIO_CMD_GPIOX A + #define _HTCFG_SDIO_CMD_GPION 4 + + #define _HTCFG_SDIO_DAT0_GPIOX C + #define _HTCFG_SDIO_DAT0_GPION 9 + + #define _HTCFG_SDIO_DAT1_GPIOX C + #define _HTCFG_SDIO_DAT1_GPION 10 + + #define _HTCFG_SDIO_DAT2_GPIOX C + #define _HTCFG_SDIO_DAT2_GPION 11 + + #define _HTCFG_SDIO_DAT3_GPIOX C + #define _HTCFG_SDIO_DAT3_GPION 12 + + #define HTCFG_SDIO_CLK_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_CLK_GPIOX) + #define HTCFG_SDIO_CLK_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_CLK_GPIOX) + #define HTCFG_SDIO_CLK_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_CLK_GPIOX) + #define HTCFG_SDIO_CLK_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_CLK_GPION) + + #define HTCFG_SDIO_CMD_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_CMD_GPIOX) + #define HTCFG_SDIO_CMD_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_CMD_GPIOX) + #define HTCFG_SDIO_CMD_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_CMD_GPIOX) + #define HTCFG_SDIO_CMD_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_CMD_GPION) + + #define HTCFG_SDIO_DAT0_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_DAT0_GPIOX) + #define HTCFG_SDIO_DAT0_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_DAT0_GPIOX) + #define HTCFG_SDIO_DAT0_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_DAT0_GPIOX) + #define HTCFG_SDIO_DAT0_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_DAT0_GPION) + + #define HTCFG_SDIO_DAT1_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_DAT1_GPIOX) + #define HTCFG_SDIO_DAT1_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_DAT1_GPIOX) + #define HTCFG_SDIO_DAT1_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_DAT1_GPIOX) + #define HTCFG_SDIO_DAT1_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_DAT1_GPION) + + #define HTCFG_SDIO_DAT2_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_DAT2_GPIOX) + #define HTCFG_SDIO_DAT2_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_DAT2_GPIOX) + #define HTCFG_SDIO_DAT2_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_DAT2_GPIOX) + #define HTCFG_SDIO_DAT2_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_DAT2_GPION) + + #define HTCFG_SDIO_DAT3_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_DAT3_GPIOX) + #define HTCFG_SDIO_DAT3_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_DAT3_GPIOX) + #define HTCFG_SDIO_DAT3_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_DAT3_GPIOX) + #define HTCFG_SDIO_DAT3_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_DAT3_GPION) + +#endif /* BSP_USING_SDIO */ void ht32_usart_gpio_init(void *instance); void ht32_spi_gpio_init(void *instance); void ht32_hardware_i2c_gpio_init(void *instance); void ht32_adc_gpio_init(void *instance,int8_t channel); +void ht32_sdio_gpio_init(void *instance); #ifdef __cplusplus } diff --git a/bsp/ht32/ht32f12366/board/inc/ht32f1xxxx_01_usbdconf.h b/bsp/ht32/ht32f12366/board/inc/ht32f1xxxx_01_usbdconf.h index 432b323d7a..e617b95e8a 100644 --- a/bsp/ht32/ht32f12366/board/inc/ht32f1xxxx_01_usbdconf.h +++ b/bsp/ht32/ht32f12366/board/inc/ht32f1xxxx_01_usbdconf.h @@ -58,7 +58,7 @@ // Endpoint5 Interrupt Enable (EP5IE) // Endpoint6 Interrupt Enable (EP6IE) // Endpoint7 Interrupt Enable (EP7IE) -#define _UIER (0x011D) +#define _UIER (0xFF1D) // @@ -96,7 +96,7 @@ /* Endpoint1 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint1 Configuration -#define _EP1_ENABLE (0) +#define _EP1_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -114,7 +114,7 @@ // Endpoint Transfer Type // <2=> Bulk // <3=> Interrupt -#define _EP1_TYPR (3) +#define _EP1_TYPR (2) // Endpoint Direction (EPDIR) // <1=> IN @@ -123,7 +123,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP1LEN_TMP (8) +#define _EP1LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -135,7 +135,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP1_IER (0x10) +#define _EP1_IER (0x12) // // @@ -144,7 +144,7 @@ /* Endpoint2 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint2 Configuration -#define _EP2_ENABLE (0) +#define _EP2_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -162,7 +162,7 @@ // Endpoint Transfer Type // <2=> Bulk // <3=> Interrupt -#define _EP2_TYPR (3) +#define _EP2_TYPR (2) // Endpoint Direction (EPDIR) // <1=> IN @@ -171,7 +171,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP2LEN_TMP (8) +#define _EP2LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -183,7 +183,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP2_IER (0x002) +#define _EP2_IER (0x012) // // @@ -191,7 +191,7 @@ /* Endpoint3 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint3 Configuration -#define _EP3_ENABLE (0) +#define _EP3_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -218,7 +218,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP3LEN_TMP (8) +#define _EP3LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -230,7 +230,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP3_IER (0x10) +#define _EP3_IER (0x12) // // @@ -238,7 +238,7 @@ /* Endpoint4 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint4 Configuration -#define _EP4_ENABLE (0) +#define _EP4_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -266,7 +266,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP4LEN_TMP (8) +#define _EP4LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -283,7 +283,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP4_IER (0x02) +#define _EP4_IER (0x12) // // @@ -292,7 +292,7 @@ /* Endpoint5 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint5 Configuration -#define _EP5_ENABLE (0) +#define _EP5_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -311,7 +311,7 @@ // <1=> Isochronous // <2=> Bulk // <3=> Interrupt -#define _EP5_TYPR (3) +#define _EP5_TYPR (1) // Endpoint Direction (EPDIR) // <1=> IN @@ -320,7 +320,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP5LEN_TMP (8) +#define _EP5LEN_TMP (64) // Single/Double Buffer Selection (SDBS) @@ -338,7 +338,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP5_IER (0x10) +#define _EP5_IER (0x12) // // @@ -347,7 +347,7 @@ /* Endpoint6 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint6 Configuration -#define _EP6_ENABLE (0) +#define _EP6_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -366,7 +366,7 @@ // <1=> Isochronous // <2=> Bulk // <3=> Interrupt -#define _EP6_TYPR (3) +#define _EP6_TYPR (1) // Endpoint Direction (EPDIR) // <1=> IN @@ -375,7 +375,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP6LEN_TMP (8) +#define _EP6LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -392,7 +392,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP6_IER (0x02) +#define _EP6_IER (0x12) // // @@ -401,7 +401,7 @@ /* Endpoint7 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint7 Configuration -#define _EP7_ENABLE (0) +#define _EP7_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -429,7 +429,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP7LEN_TMP (8) +#define _EP7LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -446,7 +446,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP7_IER (0x10) +#define _EP7_IER (0x12) // // diff --git a/bsp/ht32/ht32f12366/board/src/ht32_msp.c b/bsp/ht32/ht32f12366/board/src/ht32_msp.c index d8d055ef4e..0208647be3 100644 --- a/bsp/ht32/ht32f12366/board/src/ht32_msp.c +++ b/bsp/ht32/ht32f12366/board/src/ht32_msp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -69,7 +69,7 @@ void ht32_usart_gpio_init(void *instance) } #endif } -#endif +#endif /* BSP_USING_UART */ /* GPIO configuration for SPI */ #ifdef BSP_USING_SPI @@ -104,7 +104,7 @@ void ht32_spi_gpio_init(void *instance) } #endif } -#endif +#endif /* BSP_USING_SPI */ /* GPIO configuration for I2C */ #ifdef BSP_USING_I2C_HW @@ -135,7 +135,7 @@ void ht32_hardware_i2c_gpio_init(void *instance) } #endif } -#endif +#endif /* BSP_USING_I2C_HW */ /* GPIO configuration for ADC */ #ifdef BSP_USING_ADC void ht32_adc_gpio_init(void *instance,int8_t channel) @@ -247,4 +247,42 @@ void ht32_adc_gpio_init(void *instance,int8_t channel) } #endif } -#endif +#endif /* BSP_USING_ADC */ + +/* GPIO configuration for SDIO */ +#ifdef BSP_USING_SDIO +void ht32_sdio_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; + HT_SDIO_TypeDef *sdio_x = (HT_SDIO_TypeDef *)instance; + if(HT_SDIO == sdio_x) + { + CKCUClock.Bit.HTCFG_SDIO_CLK_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_CMD_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_DAT0_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_DAT1_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_DAT2_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_DAT3_GPIO_CLK = 1; + CKCUClock.Bit.SDIO = 1; + CKCUClock.Bit.PDMA = 1; + CKCUClock.Bit.AFIO = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + /* Configure SDIO pins */ + AFIO_GPxConfig(HTCFG_SDIO_CLK_GPIO_ID, HTCFG_SDIO_CLK_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_CMD_GPIO_ID, HTCFG_SDIO_CMD_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_DAT0_GPIO_ID, HTCFG_SDIO_DAT0_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_DAT1_GPIO_ID, HTCFG_SDIO_DAT1_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_DAT2_GPIO_ID, HTCFG_SDIO_DAT2_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_DAT3_GPIO_ID, HTCFG_SDIO_DAT3_GPIO_PIN, AFIO_FUN_SDIO); + /* 配置SDIO引脚驱动能力 */ + GPIO_DriveConfig(HTCFG_SDIO_CLK_GPIO_PORT, HTCFG_SDIO_CLK_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_CMD_GPIO_PORT, HTCFG_SDIO_CMD_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_DAT0_GPIO_PORT, HTCFG_SDIO_DAT0_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_DAT1_GPIO_PORT, HTCFG_SDIO_DAT1_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_DAT2_GPIO_PORT, HTCFG_SDIO_DAT2_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_DAT3_GPIO_PORT, HTCFG_SDIO_DAT3_GPIO_PIN, GPIO_DV_8MA); + + } +} +#endif /* BSP_USING_SDIO */ diff --git a/bsp/ht32/ht32f12366/project.uvoptx b/bsp/ht32/ht32f12366/project.uvoptx index 5e3bbba332..06f3300cfb 100644 --- a/bsp/ht32/ht32f12366/project.uvoptx +++ b/bsp/ht32/ht32f12366/project.uvoptx @@ -73,7 +73,7 @@ 0 - 1 + 0 0 1 @@ -186,18 +186,6 @@ 0 0 - - 1 - 2 - 1 - 0 - 0 - 0 - applications\test.c - test.c - 0 - 0 - @@ -208,7 +196,7 @@ 0 2 - 3 + 2 1 0 0 @@ -220,7 +208,7 @@ 2 - 4 + 3 1 0 0 @@ -232,7 +220,7 @@ 2 - 5 + 4 1 0 0 @@ -244,7 +232,7 @@ 2 - 6 + 5 1 0 0 @@ -256,7 +244,7 @@ 2 - 7 + 6 1 0 0 @@ -268,7 +256,7 @@ 2 - 8 + 7 1 0 0 @@ -280,7 +268,7 @@ 2 - 9 + 8 1 0 0 @@ -292,7 +280,7 @@ 2 - 10 + 9 1 0 0 @@ -312,7 +300,7 @@ 0 3 - 11 + 10 1 0 0 @@ -322,6 +310,18 @@ 0 0 + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + 3 12 @@ -329,8 +329,8 @@ 0 0 0 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - i2c-bit-ops.c + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c 0 0 @@ -341,42 +341,6 @@ 0 0 0 - ..\..\..\components\drivers\i2c\i2c_core.c - i2c_core.c - 0 - 0 - - - 3 - 14 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\i2c\i2c_dev.c - i2c_dev.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\ipc\completion.c - completion.c - 0 - 0 - - - 3 - 16 - 1 - 0 - 0 - 0 ..\..\..\components\drivers\ipc\condvar.c condvar.c 0 @@ -384,7 +348,7 @@ 3 - 17 + 14 1 0 0 @@ -396,7 +360,7 @@ 3 - 18 + 15 1 0 0 @@ -408,7 +372,7 @@ 3 - 19 + 16 1 0 0 @@ -420,7 +384,7 @@ 3 - 20 + 17 1 0 0 @@ -432,7 +396,7 @@ 3 - 21 + 18 1 0 0 @@ -444,7 +408,7 @@ 3 - 22 + 19 1 0 0 @@ -456,73 +420,25 @@ 3 - 23 + 20 1 0 0 0 - ..\..\..\components\drivers\misc\adc.c - adc.c + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c 0 0 3 - 24 + 21 1 0 0 0 - ..\..\..\components\drivers\pin\pin.c - pin.c - 0 - 0 - - - 3 - 25 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\serial\serial.c - serial.c - 0 - 0 - - - 3 - 26 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\spi\spi_core.c - spi_core.c - 0 - 0 - - - 3 - 27 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\spi\spi_dev.c - spi_dev.c - 0 - 0 - - - 3 - 28 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\watchdog\watchdog.c - watchdog.c + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c 0 0 @@ -536,7 +452,7 @@ 0 4 - 29 + 22 1 0 0 @@ -548,7 +464,7 @@ 4 - 30 + 23 1 0 0 @@ -560,7 +476,7 @@ 4 - 31 + 24 2 0 0 @@ -572,7 +488,7 @@ 4 - 32 + 25 1 0 0 @@ -584,7 +500,7 @@ 4 - 33 + 26 1 0 0 @@ -596,7 +512,7 @@ 4 - 34 + 27 1 0 0 @@ -616,7 +532,19 @@ 0 5 - 35 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 5 + 29 1 0 0 @@ -628,19 +556,7 @@ 5 - 36 - 1 - 0 - 0 - 0 - ..\..\..\components\finsh\msh.c - msh.c - 0 - 0 - - - 5 - 37 + 30 1 0 0 @@ -652,13 +568,13 @@ 5 - 38 + 31 1 0 0 0 - ..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\components\finsh\msh.c + msh.c 0 0 @@ -672,7 +588,7 @@ 0 6 - 39 + 32 1 0 0 @@ -684,7 +600,7 @@ 6 - 40 + 33 1 0 0 @@ -696,7 +612,31 @@ 6 - 41 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 36 1 0 0 @@ -708,7 +648,7 @@ 6 - 42 + 37 1 0 0 @@ -720,7 +660,7 @@ 6 - 43 + 38 1 0 0 @@ -732,31 +672,7 @@ 6 - 44 - 1 - 0 - 0 - 0 - ..\..\..\src\klibc\kstdio.c - kstdio.c - 0 - 0 - - - 6 - 45 - 1 - 0 - 0 - 0 - ..\..\..\src\klibc\kstring.c - kstring.c - 0 - 0 - - - 6 - 46 + 39 1 0 0 @@ -768,7 +684,7 @@ 6 - 47 + 40 1 0 0 @@ -780,7 +696,7 @@ 6 - 48 + 41 1 0 0 @@ -792,7 +708,7 @@ 6 - 49 + 42 1 0 0 @@ -804,7 +720,7 @@ 6 - 50 + 43 1 0 0 @@ -816,7 +732,7 @@ 6 - 51 + 44 1 0 0 @@ -828,7 +744,7 @@ 6 - 52 + 45 1 0 0 @@ -840,7 +756,7 @@ 6 - 53 + 46 1 0 0 @@ -852,7 +768,7 @@ 6 - 54 + 47 1 0 0 @@ -865,14 +781,82 @@ - libcpu + klibc 0 0 0 0 7 - 55 + 48 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 53 1 0 0 @@ -883,8 +867,8 @@ 0 - 7 - 56 + 8 + 54 1 0 0 @@ -895,8 +879,8 @@ 0 - 7 - 57 + 8 + 55 1 0 0 @@ -907,8 +891,8 @@ 0 - 7 - 58 + 8 + 56 2 0 0 @@ -919,8 +903,8 @@ 0 - 7 - 59 + 8 + 57 1 0 0 @@ -939,43 +923,67 @@ 0 0 - 8 + 9 + 58 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2s.c + ht32f1xxxx_i2s.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_mctm.c + ht32f1xxxx_mctm.c + 0 + 0 + + + 9 60 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_wdt.c - ht32f1xxxx_wdt.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_bftm.c + ht32f1xxxx_bftm.c 0 0 - 8 + 9 61 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sci.c - ht32f1xxxx_sci.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_flash.c + ht32f1xxxx_flash.c 0 0 - 8 + 9 62 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rstcu.c - ht32f1xxxx_rstcu.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_tm.c + ht32f1xxxx_tm.c 0 0 - 8 + 9 63 1 0 @@ -987,260 +995,20 @@ 0 - 8 + 9 64 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_tm.c - ht32f1xxxx_tm.c - 0 - 0 - - - 8 - 65 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ckcu.c - ht32f1xxxx_ckcu.c - 0 - 0 - - - 8 - 66 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usart.c - ht32f1xxxx_usart.c - 0 - 0 - - - 8 - 67 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_aes.c - ht32f1xxxx_aes.c - 0 - 0 - - - 8 - 68 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_flash.c - ht32f1xxxx_flash.c - 0 - 0 - - - 8 - 69 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_gpio.c - ht32f1xxxx_gpio.c - 0 - 0 - - - 8 - 70 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32_cm3_misc.c - ht32_cm3_misc.c - 0 - 0 - - - 8 - 71 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_crc.c - ht32f1xxxx_crc.c - 0 - 0 - - - 8 - 72 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sdio.c - ht32f1xxxx_sdio.c - 0 - 0 - - - 8 - 73 - 1 - 0 - 0 - 0 ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ebi.c ht32f1xxxx_ebi.c 0 0 - 8 - 74 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_cmp.c - ht32f1xxxx_cmp.c - 0 - 0 - - - 8 - 75 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f2xxxx_csif.c - ht32f2xxxx_csif.c - 0 - 0 - - - 8 - 76 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2c.c - ht32f1xxxx_i2c.c - 0 - 0 - - - 8 - 77 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_adc.c - ht32f1xxxx_adc.c - 0 - 0 - - - 8 - 78 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pwrcu.c - ht32f1xxxx_pwrcu.c - 0 - 0 - - - 8 - 79 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pdma.c - ht32f1xxxx_pdma.c - 0 - 0 - - - 8 - 80 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Source\system_ht32f1xxxx_02.c - system_ht32f1xxxx_02.c - 0 - 0 - - - 8 - 81 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_mctm.c - ht32f1xxxx_mctm.c - 0 - 0 - - - 8 - 82 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_spi.c - ht32f1xxxx_spi.c - 0 - 0 - - - 8 - 83 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_bftm.c - ht32f1xxxx_bftm.c - 0 - 0 - - - 8 - 84 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2s.c - ht32f1xxxx_i2s.c - 0 - 0 - - - 8 - 85 + 9 + 65 1 0 0 @@ -1251,8 +1019,20 @@ 0 - 8 - 86 + 9 + 66 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_crc.c + ht32f1xxxx_crc.c + 0 + 0 + + + 9 + 67 1 0 0 @@ -1262,6 +1042,210 @@ 0 0 + + 9 + 68 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rstcu.c + ht32f1xxxx_rstcu.c + 0 + 0 + + + 9 + 69 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_aes.c + ht32f1xxxx_aes.c + 0 + 0 + + + 9 + 70 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Source\system_ht32f1xxxx_02.c + system_ht32f1xxxx_02.c + 0 + 0 + + + 9 + 71 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_cmp.c + ht32f1xxxx_cmp.c + 0 + 0 + + + 9 + 72 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32_cm3_misc.c + ht32_cm3_misc.c + 0 + 0 + + + 9 + 73 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sci.c + ht32f1xxxx_sci.c + 0 + 0 + + + 9 + 74 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pwrcu.c + ht32f1xxxx_pwrcu.c + 0 + 0 + + + 9 + 75 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_spi.c + ht32f1xxxx_spi.c + 0 + 0 + + + 9 + 76 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_adc.c + ht32f1xxxx_adc.c + 0 + 0 + + + 9 + 77 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sdio.c + ht32f1xxxx_sdio.c + 0 + 0 + + + 9 + 78 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usart.c + ht32f1xxxx_usart.c + 0 + 0 + + + 9 + 79 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ckcu.c + ht32f1xxxx_ckcu.c + 0 + 0 + + + 9 + 80 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_gpio.c + ht32f1xxxx_gpio.c + 0 + 0 + + + 9 + 81 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pdma.c + ht32f1xxxx_pdma.c + 0 + 0 + + + 9 + 82 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f2xxxx_csif.c + ht32f2xxxx_csif.c + 0 + 0 + + + 9 + 83 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_wdt.c + ht32f1xxxx_wdt.c + 0 + 0 + + + 9 + 84 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2c.c + ht32f1xxxx_i2c.c + 0 + 0 + diff --git a/bsp/ht32/ht32f12366/project.uvprojx b/bsp/ht32/ht32f12366/project.uvprojx index 0bf964bce3..578dcd6fca 100644 --- a/bsp/ht32/ht32f12366/project.uvprojx +++ b/bsp/ht32/ht32f12366/project.uvprojx @@ -15,8 +15,8 @@ HT32F12366 Holtek - Holtek.HT32_DFP.1.0.19 - http://mcu.holtek.com.tw/pack + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack IRAM(0x20000000,0x20000) IROM(0x00000000,0x3FC00) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -332,10 +332,10 @@ 0 0 - - __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, RT_USING_LIBC, USE_HT32F12366_SK, USE_HT32F12365_66, USE_MEM_HT32F12366, __CLK_TCK=RT_TICK_PER_SECOND, USE_HT32_DRIVER, __RTTHREAD__ + --gnu + __CLK_TCK=RT_TICK_PER_SECOND, USE_HT32_DRIVER, USE_HT32F12366_SK, USE_HT32F12365_66, USE_MEM_HT32F12366, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_LIBC, RT_USING_ARMLIBC - ..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\include;..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\inc;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include;..\libraries\ht32_drivers;board\inc;..\..\..\libcpu\arm\common;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;applications;..\libraries\HT32_STD_1xxxx_FWLib\library\CMSIS\Include;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\drivers\include;.;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\poll;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\include;..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Include;..\..\..\components\finsh;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\libcpu\arm\cortex-m3 + ..\..\..\libcpu\arm\common;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\posix\io\eventfd;board\inc;..\..\..\libcpu\arm\cortex-m3;..\..\..\components\finsh;..\..\..\components\libc\posix\ipc;..\libraries\usbd_library\inc;..\libraries\ht32_drivers;applications;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\poll;..\..\..\include;..\..\..\components\drivers\smp_call;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\inc;.;..\libraries\HT32_STD_1xxxx_FWLib\library\CMSIS\Include;..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Include;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\phy;..\..\..\components\drivers\include @@ -384,11 +384,6 @@ 1 applications\main.c - - test.c - 1 - applications\test.c - @@ -495,9 +490,9 @@ - i2c-bit-ops.c + completion_comm.c 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c + ..\..\..\components\drivers\ipc\completion_comm.c 2 @@ -550,119 +545,9 @@ - i2c_core.c + completion_up.c 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c + ..\..\..\components\drivers\ipc\completion_up.c 2 @@ -1100,9 +985,9 @@ - adc.c + dev_pin.c 1 - ..\..\..\components\drivers\misc\adc.c + ..\..\..\components\drivers\pin\dev_pin.c 2 @@ -1155,229 +1040,9 @@ - pin.c + dev_serial.c 1 - ..\..\..\components\drivers\pin\pin.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c + ..\..\..\components\drivers\serial\dev_serial.c 2 @@ -1469,25 +1134,25 @@ Finsh + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + shell.c 1 ..\..\..\components\finsh\shell.c - - msh.c - 1 - ..\..\..\components\finsh\msh.c - msh_parse.c 1 ..\..\..\components\finsh\msh_parse.c - cmd.c + msh.c 1 - ..\..\..\components\finsh\cmd.c + ..\..\..\components\finsh\msh.c @@ -1604,6 +1269,116 @@ + + cpu_up.c + 1 + ..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + idle.c 1 @@ -1769,116 +1544,6 @@ - - kstdio.c - 1 - ..\..\..\src\klibc\kstdio.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_KERNEL_SOURCE__ - - - - - - - - - kstring.c - 1 - ..\..\..\src\klibc\kstring.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_KERNEL_SOURCE__ - - - - - - - kservice.c 1 @@ -2376,6 +2041,36 @@ + + klibc + + + kstdio.c + 1 + ..\..\..\src\klibc\kstdio.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kstring.c + 1 + ..\..\..\src\klibc\kstring.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + libcpu @@ -2410,140 +2105,140 @@ Libraries - ht32f1xxxx_wdt.c + ht32f1xxxx_i2s.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_wdt.c - - - ht32f1xxxx_sci.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sci.c - - - ht32f1xxxx_rstcu.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rstcu.c - - - ht32f1xxxx_usbd.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usbd.c - - - ht32f1xxxx_tm.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_tm.c - - - ht32f1xxxx_ckcu.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ckcu.c - - - ht32f1xxxx_usart.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usart.c - - - ht32f1xxxx_aes.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_aes.c - - - ht32f1xxxx_flash.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_flash.c - - - ht32f1xxxx_gpio.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_gpio.c - - - ht32_cm3_misc.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32_cm3_misc.c - - - ht32f1xxxx_crc.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_crc.c - - - ht32f1xxxx_sdio.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sdio.c - - - ht32f1xxxx_ebi.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ebi.c - - - ht32f1xxxx_cmp.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_cmp.c - - - ht32f2xxxx_csif.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f2xxxx_csif.c - - - ht32f1xxxx_i2c.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2c.c - - - ht32f1xxxx_adc.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_adc.c - - - ht32f1xxxx_pwrcu.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pwrcu.c - - - ht32f1xxxx_pdma.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pdma.c - - - system_ht32f1xxxx_02.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Source\system_ht32f1xxxx_02.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2s.c ht32f1xxxx_mctm.c 1 ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_mctm.c - - ht32f1xxxx_spi.c - 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_spi.c - ht32f1xxxx_bftm.c 1 ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_bftm.c - ht32f1xxxx_i2s.c + ht32f1xxxx_flash.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2s.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_flash.c + + + ht32f1xxxx_tm.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_tm.c + + + ht32f1xxxx_usbd.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usbd.c + + + ht32f1xxxx_ebi.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ebi.c ht32f1xxxx_exti.c 1 ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_exti.c + + ht32f1xxxx_crc.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_crc.c + ht32f1xxxx_rtc.c 1 ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rtc.c + + ht32f1xxxx_rstcu.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rstcu.c + + + ht32f1xxxx_aes.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_aes.c + + + system_ht32f1xxxx_02.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Source\system_ht32f1xxxx_02.c + + + ht32f1xxxx_cmp.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_cmp.c + + + ht32_cm3_misc.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32_cm3_misc.c + + + ht32f1xxxx_sci.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sci.c + + + ht32f1xxxx_pwrcu.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pwrcu.c + + + ht32f1xxxx_spi.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_spi.c + + + ht32f1xxxx_adc.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_adc.c + + + ht32f1xxxx_sdio.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sdio.c + + + ht32f1xxxx_usart.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usart.c + + + ht32f1xxxx_ckcu.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ckcu.c + + + ht32f1xxxx_gpio.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_gpio.c + + + ht32f1xxxx_pdma.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pdma.c + + + ht32f2xxxx_csif.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f2xxxx_csif.c + + + ht32f1xxxx_wdt.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_wdt.c + + + ht32f1xxxx_i2c.c + 1 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2c.c + diff --git a/bsp/ht32/ht32f12366/rtconfig.h b/bsp/ht32/ht32f12366/rtconfig.h index 39d7f03646..fa25b0a78e 100644 --- a/bsp/ht32/ht32f12366/rtconfig.h +++ b/bsp/ht32/ht32f12366/rtconfig.h @@ -1,29 +1,81 @@ #ifndef RT_CONFIG_H__ #define RT_CONFIG_H__ -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - /* RT-Thread Kernel */ +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ #define RT_NAME_MAX 8 #define RT_CPUS_NR 1 #define RT_ALIGN_SIZE 4 #define RT_THREAD_PRIORITY_32 #define RT_THREAD_PRIORITY_MAX 32 #define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK #define RT_HOOK_USING_FUNC_PTR #define RT_USING_IDLE_HOOK #define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 256 +#define IDLE_THREAD_STACK_SIZE 512 -/* kservice optimization */ +/* kservice options */ -#define RT_USING_DEBUG -#define RT_DEBUGING_COLOR -#define RT_DEBUGING_CONTEXT +/* end of kservice options */ /* Inter-Thread communication */ @@ -32,6 +84,7 @@ #define RT_USING_EVENT #define RT_USING_MAILBOX #define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ /* Memory Management */ @@ -41,12 +94,14 @@ #define RT_MEMHEAP_FAST_MODE #define RT_USING_SMALL_MEM_AS_HEAP #define RT_USING_HEAP +/* end of Memory Management */ #define RT_USING_DEVICE #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart0" #define RT_VER_NUM 0x50200 #define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC #define RT_USING_CPU_FFS #define ARCH_ARM @@ -76,6 +131,7 @@ /* DFS: device virtual file system */ +/* end of DFS: device virtual file system */ /* Device Drivers */ @@ -85,15 +141,8 @@ #define RT_USING_SERIAL_V1 #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_ADC -#define RT_USING_SPI -#define RT_USING_WDT #define RT_USING_PIN - -/* Using USB */ - +/* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -105,6 +154,8 @@ #define RT_LIBC_TZ_DEFAULT_HOUR 8 #define RT_LIBC_TZ_DEFAULT_MIN 0 #define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ /* POSIX (Portable Operating System Interface) layer */ @@ -114,18 +165,30 @@ /* Socket is in the 'Network' category */ +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ /* Network */ +/* end of Network */ /* Memory protection */ +/* end of Memory protection */ /* Utilities */ +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ /* RT-Thread Utestcases */ +/* end of RT-Thread Utestcases */ /* RT-Thread online packages */ @@ -136,57 +199,78 @@ /* Marvell WiFi */ +/* end of Marvell WiFi */ /* Wiced WiFi */ +/* end of Wiced WiFi */ /* CYW43012 WiFi */ +/* end of CYW43012 WiFi */ /* BL808 WiFi */ +/* end of BL808 WiFi */ /* CYW43439 WiFi */ +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ /* IoT Cloud */ +/* end of IoT Cloud */ +/* end of IoT - internet of things */ /* security packages */ +/* end of security packages */ /* language packages */ /* JSON: JavaScript Object Notation, a lightweight data-interchange format */ +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ /* XML: Extensible Markup Language */ +/* end of XML: Extensible Markup Language */ +/* end of language packages */ /* multimedia packages */ /* LVGL: powerful and easy-to-use embedded GUI library */ +/* end of LVGL: powerful and easy-to-use embedded GUI library */ /* u8g2: a monochrome graphic library */ +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ /* tools packages */ +/* end of tools packages */ /* system packages */ /* enhanced kernel services */ +/* end of enhanced kernel services */ /* acceleration: Assembly language or algorithmic acceleration packages */ +/* end of acceleration: Assembly language or algorithmic acceleration packages */ /* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ /* Micrium: Micrium software products porting for RT-Thread */ +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ /* peripheral libraries and drivers */ @@ -194,69 +278,94 @@ /* STM32 HAL & SDK Drivers */ +/* end of STM32 HAL & SDK Drivers */ /* Infineon HAL Packages */ +/* end of Infineon HAL Packages */ /* Kendryte SDK */ +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ /* sensors drivers */ +/* end of sensors drivers */ /* touch drivers */ +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ /* AI packages */ +/* end of AI packages */ /* Signal Processing and Control Algorithm Packages */ +/* end of Signal Processing and Control Algorithm Packages */ /* miscellaneous packages */ /* project laboratory */ +/* end of project laboratory */ + /* samples: kernel and components samples */ +/* end of samples: kernel and components samples */ /* entertainment: terminal games and other interesting software packages */ +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ /* Arduino libraries */ /* Projects and Demos */ +/* end of Projects and Demos */ /* Sensors */ +/* end of Sensors */ /* Display */ +/* end of Display */ /* Timing */ +/* end of Timing */ /* Data Processing */ +/* end of Data Processing */ /* Data Storage */ /* Communication */ +/* end of Communication */ /* Device Control */ +/* end of Device Control */ /* Other */ +/* end of Other */ /* Signal IO */ +/* end of Signal IO */ /* Uncategorized */ +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ #define SOC_FAMILY_HT32 #define SOC_SERIES_HT32F1 @@ -267,9 +376,11 @@ #define SOC_KERNEL #define CORTEX_M3 #define SOC_HT32F12366 +/* end of Chip Configuration */ /* Onboard Peripheral Drivers */ +/* end of Onboard Peripheral Drivers */ /* On-chip Peripheral Drivers */ @@ -277,8 +388,10 @@ #define BSP_USING_UART #define BSP_USING_USART0 #define BSP_USING_USART0_NAME "usart0" +/* end of On-chip Peripheral Drivers */ /* Board extended module Drivers */ +/* end of Hardware Drivers Config */ #endif diff --git a/bsp/ht32/ht32f12366/template.uvoptx b/bsp/ht32/ht32f12366/template.uvoptx index 4c6655f9dd..bca728b9ba 100644 --- a/bsp/ht32/ht32f12366/template.uvoptx +++ b/bsp/ht32/ht32f12366/template.uvoptx @@ -73,7 +73,7 @@ 0 - 1 + 0 0 1 diff --git a/bsp/ht32/ht32f12366/template.uvprojx b/bsp/ht32/ht32f12366/template.uvprojx index 9b24487b53..cc3940694f 100644 --- a/bsp/ht32/ht32f12366/template.uvprojx +++ b/bsp/ht32/ht32f12366/template.uvprojx @@ -15,8 +15,8 @@ HT32F12366 Holtek - Holtek.HT32_DFP.1.0.19 - http://mcu.holtek.com.tw/pack + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack IRAM(0x20000000,0x20000) IROM(0x00000000,0x3FC00) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -332,7 +332,7 @@ 0 0 - + --gnu diff --git a/bsp/ht32/ht32f52352/.config b/bsp/ht32/ht32f52352/.config index 6ee81a5871..8456d0fbe7 100644 --- a/bsp/ht32/ht32f52352/.config +++ b/bsp/ht32/ht32f52352/.config @@ -1,15 +1,117 @@ -# -# Automatically generated file; DO NOT EDIT. -# RT-Thread Configuration -# # # RT-Thread Kernel # + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + 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_SMART is not set # CONFIG_RT_USING_AMP is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_CPUS_NR=1 @@ -19,23 +121,24 @@ 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_OVERFLOW_CHECK is not set 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_IDLE_THREAD_STACK_SIZE=512 # CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set # -# kservice optimization +# kservice options # -# 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 +# end of kservice options + # CONFIG_RT_USING_DEBUG is not set +# CONFIG_RT_USING_CI_ACTION is not set # # Inter-Thread communication @@ -47,6 +150,7 @@ 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 +# end of Inter-Thread communication # # Memory Management @@ -65,22 +169,20 @@ CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMTRACE is not set # CONFIG_RT_USING_HEAP_ISR is not set CONFIG_RT_USING_HEAP=y +# end of Memory Management + CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set # CONFIG_RT_USING_THREADSAFE_PRINTF is not set -# CONFIG_RT_USING_SCHED_THREAD_CTX is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" CONFIG_RT_VER_NUM=0x50200 # 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 is not set -# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set -# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set -# CONFIG_RT_USING_CPU_FFS is not set +# end of RT-Thread Kernel + CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M0=y @@ -90,7 +192,7 @@ CONFIG_ARCH_ARM_CORTEX_M0=y # CONFIG_RT_USING_COMPONENTS_INIT=y CONFIG_RT_USING_USER_MAIN=y -CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_STACK_SIZE=1024 CONFIG_RT_MAIN_THREAD_PRIORITY=10 # CONFIG_RT_USING_LEGACY is not set CONFIG_RT_USING_MSH=y @@ -114,12 +216,15 @@ CONFIG_FINSH_USING_OPTION_COMPLETION=y # DFS: device virtual file system # # CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + # CONFIG_RT_USING_FAL is not set # # Device Drivers # # CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_UNAMED_PIPE_NUMBER=64 # CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set @@ -128,53 +233,40 @@ CONFIG_RT_USING_SERIAL_V1=y # CONFIG_RT_USING_SERIAL_V2 is not set # CONFIG_RT_SERIAL_USING_DMA is not set CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_CPUTIME is not set -CONFIG_RT_USING_I2C=y -# CONFIG_RT_I2C_DEBUG is not set -CONFIG_RT_USING_I2C_BITOPS=y -# CONFIG_RT_I2C_BITOPS_DEBUG is not set -# CONFIG_RT_USING_SOFT_I2C is not set +# CONFIG_RT_USING_I2C is not set # CONFIG_RT_USING_PHY is not set -CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_PHY_V2 is not set +# 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_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE 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=y -# CONFIG_RT_USING_SPI_BITOPS is not set -# CONFIG_RT_USING_QSPI is not set -# CONFIG_RT_USING_SPI_MSD is not set -# CONFIG_RT_USING_SFUD is not set -# CONFIG_RT_USING_ENC28J60 is not set -# CONFIG_RT_USING_SPI_WIFI is not set -CONFIG_RT_USING_WDT=y +# 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_BLK is not set # CONFIG_RT_USING_VIRTIO is not set CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_KTIME is not set # CONFIG_RT_USING_HWTIMER 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 +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers # # C/C++ and POSIX layer @@ -192,6 +284,8 @@ 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 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer # # POSIX (Portable Operating System Interface) layer @@ -213,7 +307,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # Socket is in the 'Network' category # +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + # CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer # # Network @@ -222,12 +320,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_NETDEV is not set # CONFIG_RT_USING_LWIP is not set # CONFIG_RT_USING_AT is not set +# end of Network # # Memory protection # # CONFIG_RT_USING_MEM_PROTECTION is not set # CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection # # Utilities @@ -239,12 +339,25 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RESOURCE_ID is not set # CONFIG_RT_USING_ADT is not set # CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + # CONFIG_RT_USING_VBUS is not set +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + # # RT-Thread Utestcases # # CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases # # RT-Thread online packages @@ -253,7 +366,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # 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 @@ -276,27 +388,35 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Marvell WiFi # # CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi # # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + # CONFIG_PKG_USING_RW007 is not set # # CYW43012 WiFi # # CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi # # BL808 WiFi # # CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi # # CYW43439 WiFi # # CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set @@ -319,6 +439,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set # CONFIG_PKG_USING_JOYLINK is not set # CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + # CONFIG_PKG_USING_NIMBLE is not set # CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set @@ -362,6 +484,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set # CONFIG_PKG_USING_LHC_MODBUS is not set # CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things # # security packages @@ -372,6 +495,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_TINYCRYPT is not set # CONFIG_PKG_USING_TFM is not set # CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages # # language packages @@ -387,18 +511,22 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_JSMN is not set # CONFIG_PKG_USING_AGILE_JSMN is not set # CONFIG_PKG_USING_PARSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format # # XML: Extensible Markup Language # # CONFIG_PKG_USING_SIMPLE_XML is not set # CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + # 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 +# end of language packages # # multimedia packages @@ -410,12 +538,15 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of LVGL: powerful and easy-to-use embedded GUI library # # u8g2: a monochrome graphic library # # CONFIG_PKG_USING_U8G2_OFFICIAL is not set # CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -435,6 +566,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_GUIENGINE is not set # CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages # # tools packages @@ -484,6 +616,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_VOFA_PLUS is not set # CONFIG_PKG_USING_RT_TRACE is not set # CONFIG_PKG_USING_ZDEBUG is not set +# end of tools packages # # system packages @@ -495,6 +628,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of enhanced kernel services + # CONFIG_PKG_USING_AUNITY is not set # @@ -503,6 +638,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of acceleration: Assembly language or algorithmic acceleration packages # # CMSIS: ARM Cortex-M Microcontroller Software Interface Standard @@ -513,6 +649,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_CMSIS_NN is not set # CONFIG_PKG_USING_CMSIS_RTOS1 is not set # CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard # # Micrium: Micrium software products porting for RT-Thread @@ -523,6 +660,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_LITEOS_SDK is not set # CONFIG_PKG_USING_TZ_DATABASE is not set @@ -570,6 +709,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RTP is not set # CONFIG_PKG_USING_REB is not set # CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages # # peripheral libraries and drivers @@ -586,6 +726,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set # CONFIG_PKG_USING_STM32WB55_SDK is not set # CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers # # Infineon HAL Packages @@ -600,6 +741,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_INFINEON_CSDIDAC is not set # CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set # CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + # CONFIG_PKG_USING_BLUETRUM_SDK is not set # CONFIG_PKG_USING_EMBARC_BSP is not set # CONFIG_PKG_USING_ESP_IDF is not set @@ -609,9 +752,12 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_K210_SDK is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + # CONFIG_PKG_USING_NRF5X_SDK is not set # CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers # # sensors drivers @@ -681,6 +827,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers # # touch drivers @@ -695,6 +842,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_XPT2046_TOUCH is not set # CONFIG_PKG_USING_CST816X is not set # CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set @@ -767,6 +916,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_BT_MX01 is not set # CONFIG_PKG_USING_RGPOWER is not set # CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers # # AI packages @@ -781,6 +931,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set # CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages # # Signal Processing and Control Algorithm Packages @@ -791,6 +942,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_DIGITALCTRL is not set # CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages # # miscellaneous packages @@ -799,6 +951,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # project laboratory # +# end of project laboratory # # samples: kernel and components samples @@ -807,6 +960,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples # # entertainment: terminal games and other interesting software packages @@ -823,6 +977,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_COWSAY is not set # CONFIG_PKG_USING_MORSE is not set # CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + # CONFIG_PKG_USING_LIBCSV is not set # CONFIG_PKG_USING_OPTPARSE is not set # CONFIG_PKG_USING_FASTLZ is not set @@ -856,6 +1012,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_SOEM is not set # CONFIG_PKG_USING_QPARAM is not set # CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages # # Arduino libraries @@ -871,6 +1028,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of Projects and Demos # # Sensors @@ -1011,6 +1169,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set # CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set # CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors # # Display @@ -1022,6 +1181,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of Display # # Timing @@ -1030,6 +1190,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set # CONFIG_PKG_USING_ARDUINO_TICKER is not set # CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing # # Data Processing @@ -1038,6 +1199,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set # CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set # CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing # # Data Storage @@ -1048,6 +1210,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication # # Device Control @@ -1059,12 +1222,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of Device Control # # Other # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other # # Signal IO @@ -1077,10 +1242,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # 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 +# end of Signal IO # # Uncategorized # +# end of Arduino libraries +# end of RT-Thread online packages + CONFIG_SOC_FAMILY_HT32=y CONFIG_SOC_SERIES_HT32F5=y @@ -1125,11 +1294,13 @@ CONFIG_SOC_HT32F52352=y # CONFIG_SOC_HT32F65240 is not set # CONFIG_SOC_HT32F67051 is not set # CONFIG_SOC_HT32F67741 is not set +# end of Chip Configuration # # Onboard Peripheral Drivers # # CONFIG_BSP_USING_TEST is not set +# end of Onboard Peripheral Drivers # # On-chip Peripheral Drivers @@ -1145,7 +1316,10 @@ CONFIG_BSP_USING_USART1_NAME="usart1" # CONFIG_BSP_USING_I2C is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_USBD is not set +# end of On-chip Peripheral Drivers # # Board extended module Drivers # +# end of Hardware Drivers Config diff --git a/bsp/ht32/ht32f52352/README.md b/bsp/ht32/ht32f52352/README.md index 10644a76a4..2b80c781f3 100644 --- a/bsp/ht32/ht32f52352/README.md +++ b/bsp/ht32/ht32f52352/README.md @@ -41,8 +41,8 @@ ESK32-30501使用32位Arm® Cortex®-M0+高性能、低功耗单片机HT32F52352 | UART | 支持 | UART0/1 | | SPI | 支持 | SPI0/1 | | I2C | 支持 | 硬件 I2C0/1 | -| ADC | 暂不支持 | | -| WDT | 暂不支持 | | +| ADC | 支持 | | +| WDT | 支持 | | ## 使用说明 diff --git a/bsp/ht32/ht32f52352/SConstruct b/bsp/ht32/ht32f52352/SConstruct index 9f16ec63d2..26ac123a47 100644 --- a/bsp/ht32/ht32f52352/SConstruct +++ b/bsp/ht32/ht32f52352/SConstruct @@ -53,6 +53,9 @@ rtconfig.BSP_LIBRARY_TYPE = ht32_library # include libraries objs.extend(SConscript(os.path.join(libraries_path_prefix, ht32_library, 'SConscript'))) +# include usb libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'usbd_library', 'SConscript'))) + # include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'ht32_drivers', 'SConscript'))) diff --git a/bsp/ht32/ht32f52352/applications/test.c b/bsp/ht32/ht32f52352/applications/test.c index 85e86ac883..967217b656 100644 --- a/bsp/ht32/ht32f52352/applications/test.c +++ b/bsp/ht32/ht32f52352/applications/test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -58,20 +58,29 @@ static struct rt_semaphore rx_sem; static rt_mutex_t task_mutex = RT_NULL; /* task mutex */ /* device handle */ +#ifdef BSP_USING_UART static rt_device_t serial; +#endif +#ifdef BSP_USING_WDT static rt_device_t wdt_dev; -struct rt_i2c_bus_device *i2c_dev; +#endif +#ifdef BSP_USING_I2C +static struct rt_i2c_bus_device *i2c_dev; +#endif +#ifdef BSP_USING_SPI static struct rt_spi_device *spi_dev; +#endif /* In-file function declarations */ -static void sys_run_dir(void *parameter); -static void gpio_output_test(void *parameter); -static void gpio_input_test(void *parameter); -static void key_iqr_handle(void *args); +//static void sys_run_dir(void *parameter); +//static void gpio_output_test(void *parameter); +//static void gpio_input_test(void *parameter); +//static void key_iqr_handle(void *args); /* Task registration */ int task_registration(void) { +// USB_Configuration(RT_NULL); /* Create a dynamic mutex */ task_mutex = rt_mutex_create("task_mutex", RT_IPC_FLAG_FIFO); if (task_mutex == RT_NULL) @@ -90,6 +99,7 @@ int task_registration(void) INIT_BOARD_EXPORT(task_registration); /* System operation indicator */ +#ifdef BSP_USING_GPIO static void sys_run_dir(void *parameter) { rt_uint32_t e; @@ -301,7 +311,9 @@ static int gpio_input_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(gpio_input_task, gpio input task operation); +#endif /* uart test */ +#ifdef BSP_USING_UART static rt_err_t uart_iqr_handle(rt_device_t dev, rt_size_t size) { /* Serial port callback function */ @@ -396,7 +408,9 @@ static int uart_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(uart_task, uart device sample); +#endif /* hw/sw iic test */ +#ifdef BSP_USING_I2C static void i2c_thread(void *parameter) { uint8_t write_addr = 0x00; @@ -497,7 +511,9 @@ static int i2c_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(i2c_task, i2c device sample); +#endif /* spi test */ +#ifdef BSP_USING_SPI static void spi_thread(void *parameter) { rt_uint8_t w25x_read_id = 0x9F; @@ -584,7 +600,9 @@ static int spi_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(spi_task, spi device sample); +#endif /* adc test */ +#ifdef BSP_USING_ADC static void adc_test(void *parameter) { rt_uint32_t adc0_ch6_val,adc0_ch7_val; @@ -640,8 +658,9 @@ static int adc_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(adc_task, adc task operation); - +#endif /* wdt test */ +#ifdef BSP_USING_WDT static void wdt_test(void) { rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); @@ -712,5 +731,74 @@ static int wdt_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(wdt_task, wdt task operation); +#endif +/* usbd test */ +#ifdef BSP_USING_USBD +static void usbd_test(void *parameter) +{ + rt_device_t dev = RT_NULL; + char dev_name[] = "vcom"; + char buf[] = "usbd vcom test!\r\n"; + dev = rt_device_find(dev_name); + + if (dev) + { + rt_device_open(dev, RT_DEVICE_FLAG_RDWR); + } + else + { + rt_kprintf("Device with name %s not found.\n",dev_name); + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + while (1) + { + rt_device_write(dev, 0, buf, rt_strlen(buf)); + rt_thread_mdelay(500); + } +} + +static int usbd_task(int argc, char *argv[]) +{ + rt_err_t ret = -RT_ERROR; + + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Gpio input test tasks */ + rt_thread_t usbd_vcom_task = rt_thread_create("usbd_vcom_task", + usbd_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (usbd_vcom_task != RT_NULL) + { + rt_thread_startup(usbd_vcom_task); + rt_kprintf("The usbd vcom task is registered.\n"); + } + else + { + rt_kprintf("usbd vcom task registration failed.\n"); + } + ret = RT_EOK; + } + else if(rt_strcmp(argv[1],"stop") == 0) + { + ret = RT_EOK; + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s stop\n",__func__); + } + return ret; +} +MSH_CMD_EXPORT(usbd_task, usbd task operation); + + +#endif #endif /* BSP_USING_TEST */ diff --git a/bsp/ht32/ht32f52352/board/Kconfig b/bsp/ht32/ht32f52352/board/Kconfig index 57aed30985..8ba20cd72d 100644 --- a/bsp/ht32/ht32f52352/board/Kconfig +++ b/bsp/ht32/ht32f52352/board/Kconfig @@ -306,6 +306,140 @@ menu "On-chip Peripheral Drivers" depends on BSP_USING_WDT string "wdt device name" default "wdt" + + menuconfig BSP_USING_CAN + bool "Enable CAN" + depends on SOC_HT32F53241 || SOC_HT32F53242 || SOC_HT32F53252 + default n + select RT_USING_CAN if BSP_USING_CAN + config BSP_USING_CAN_NAME + depends on BSP_USING_CAN + string "can device name" + default "can" + if BSP_USING_CAN + config CAN_DEFAULT_BASE_CONFIGURATION + choice + prompt "Default CAN baud rate" + default BSP_USING_CAN500kBaud + config BSP_USING_CAN1MBaud + bool "CAN1MBaud" + config BSP_USING_CAN800kBaud + bool "CAN800kBaud" + config BSP_USING_CAN500kBaud + bool "CAN500kBaud" + config BSP_USING_CAN250kBaud + bool "CAN250kBaud" + config BSP_USING_CAN125kBaud + bool "CAN125kBaud" + config BSP_USING_CAN100kBaud + bool "CAN100kBaud" + config BSP_USING_CAN50kBaud + bool "CAN50kBaud" + config BSP_USING_CAN20kBaud + bool "CAN20kBaud" + config BSP_USING_CAN10kBaud + bool "CAN10kBaud" + endchoice + choice + prompt "Default CAN mode" + default BSP_USING_RT_CAN_MODE_NORMAL + config BSP_USING_RT_CAN_MODE_NORMAL + bool "RT_CAN_MODE_NORMAL" + config BSP_USING_RT_CAN_MODE_LISTEN + bool "RT_CAN_MODE_LISTEN" + config BSP_USING_RT_CAN_MODE_LOOPBACK + bool "RT_CAN_MODE_LOOPBACK" + config BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + bool "RT_CAN_MODE_LOOPBACKANLISTEN" + endchoice + + config BSP_USING_CAN_BAUD + int + default 1000000 if BSP_USING_CAN1MBaud + default 800000 if BSP_USING_CAN800kBaud + default 500000 if BSP_USING_CAN500kBaud + default 250000 if BSP_USING_CAN250kBaud + default 125000 if BSP_USING_CAN125kBaud + default 100000 if BSP_USING_CAN100kBaud + default 50000 if BSP_USING_CAN50kBaud + default 20000 if BSP_USING_CAN20kBaud + default 10000 if BSP_USING_CAN10kBaud + + config BSP_USING_CAN_MODE + int + default 0 if BSP_USING_RT_CAN_MODE_NORMAL + default 1 if BSP_USING_RT_CAN_MODE_LISTEN + default 2 if BSP_USING_RT_CAN_MODE_LOOPBACK + default 3 if BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + + config CAN_DEFAULT_FILTER_TABLE_CONFIGURATION + choice + prompt "Default filter id mode" + default BSP_USING_CAN_STD_ID + config BSP_USING_CAN_STD_ID + bool "CAN_STD_ID" + config BSP_USING_CAN_EXT_ID + bool "CAN_EXT_ID" + endchoice + + choice + prompt "Default filter frame mode" + default BSP_USING_CAN_DATA_FRAME + config BSP_USING_CAN_DATA_FRAME + bool "CAN_DATA_FRAME" + config BSP_USING_CAN_REMOTE_FRAME + bool "CAN_REMOTE_FRAME" + endchoice + + config BSP_USING_CAN_ID_MODE + int + default 0 if BSP_USING_CAN_STD_ID + default 1 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_FRAME_MODE + int + default 0 if BSP_USING_CAN_REMOTE_FRAME + default 1 if BSP_USING_CAN_DATA_FRAME + + config BSP_USING_CAN_MSG_NUM + int "Default filter table number" + range 0 31 + default 0 + + config BSP_USING_CAN_ID + hex "Default filter arbitration bit(ID)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x541 if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x541 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_MASK + hex "Default filter mask bit(MASK)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x7FF if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + + endif + + menuconfig BSP_USING_SDIO + bool "Enable SDIO" + depends on SOC_HT32F12345 || SOC_HT32F12365 || SOC_HT32F12366 + default n + select RT_USING_SDIO if BSP_USING_SDIO + config BSP_USING_SDIO_NAME + depends on BSP_USING_SDIO + string "sdio device name" + default "sdio" + + menuconfig BSP_USING_USBD + bool "Enable USB BUS" + default n + select RT_USING_USB_DEVICE if BSP_USING_USBD + config BSP_USING_USBD_NAME + depends on BSP_USING_USBD + string "usbd device name" + default "usbd" endmenu menu "Board extended module Drivers" diff --git a/bsp/ht32/ht32f52352/board/inc/ht32f5xxxx_01_usbdconf.h b/bsp/ht32/ht32f52352/board/inc/ht32f5xxxx_01_usbdconf.h index a512579519..d1ef029d1b 100644 --- a/bsp/ht32/ht32f52352/board/inc/ht32f5xxxx_01_usbdconf.h +++ b/bsp/ht32/ht32f52352/board/inc/ht32f5xxxx_01_usbdconf.h @@ -58,7 +58,7 @@ // Endpoint5 Interrupt Enable (EP5IE) // Endpoint6 Interrupt Enable (EP6IE) // Endpoint7 Interrupt Enable (EP7IE) -#define _UIER (0x011D) +#define _UIER (0xFF1D) // @@ -96,7 +96,7 @@ /* Endpoint1 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint1 Configuration -#define _EP1_ENABLE (0) +#define _EP1_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -114,7 +114,7 @@ // Endpoint Transfer Type // <2=> Bulk // <3=> Interrupt -#define _EP1_TYPR (3) +#define _EP1_TYPR (2) // Endpoint Direction (EPDIR) // <1=> IN @@ -123,7 +123,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP1LEN_TMP (8) +#define _EP1LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -135,7 +135,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP1_IER (0x10) +#define _EP1_IER (0x12) // // @@ -144,7 +144,7 @@ /* Endpoint2 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint2 Configuration -#define _EP2_ENABLE (0) +#define _EP2_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -162,7 +162,7 @@ // Endpoint Transfer Type // <2=> Bulk // <3=> Interrupt -#define _EP2_TYPR (3) +#define _EP2_TYPR (2) // Endpoint Direction (EPDIR) // <1=> IN @@ -171,7 +171,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP2LEN_TMP (8) +#define _EP2LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -183,7 +183,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP2_IER (0x002) +#define _EP2_IER (0x012) // // @@ -191,7 +191,7 @@ /* Endpoint3 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint3 Configuration -#define _EP3_ENABLE (0) +#define _EP3_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -218,7 +218,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP3LEN_TMP (8) +#define _EP3LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -230,7 +230,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP3_IER (0x10) +#define _EP3_IER (0x12) // // @@ -238,7 +238,7 @@ /* Endpoint4 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint4 Configuration -#define _EP4_ENABLE (0) +#define _EP4_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -266,7 +266,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP4LEN_TMP (8) +#define _EP4LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -283,7 +283,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP4_IER (0x02) +#define _EP4_IER (0x12) // // @@ -292,7 +292,7 @@ /* Endpoint5 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint5 Configuration -#define _EP5_ENABLE (0) +#define _EP5_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -311,7 +311,7 @@ // <1=> Isochronous // <2=> Bulk // <3=> Interrupt -#define _EP5_TYPR (3) +#define _EP5_TYPR (1) // Endpoint Direction (EPDIR) // <1=> IN @@ -320,7 +320,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP5LEN_TMP (8) +#define _EP5LEN_TMP (64) // Single/Double Buffer Selection (SDBS) @@ -338,7 +338,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP5_IER (0x10) +#define _EP5_IER (0x12) // // @@ -347,7 +347,7 @@ /* Endpoint6 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint6 Configuration -#define _EP6_ENABLE (0) +#define _EP6_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -366,7 +366,7 @@ // <1=> Isochronous // <2=> Bulk // <3=> Interrupt -#define _EP6_TYPR (3) +#define _EP6_TYPR (1) // Endpoint Direction (EPDIR) // <1=> IN @@ -375,7 +375,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP6LEN_TMP (8) +#define _EP6LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -392,7 +392,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP6_IER (0x02) +#define _EP6_IER (0x12) // // @@ -401,7 +401,7 @@ /* Endpoint7 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint7 Configuration -#define _EP7_ENABLE (0) +#define _EP7_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -429,7 +429,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP7LEN_TMP (8) +#define _EP7LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -446,7 +446,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP7_IER (0x10) +#define _EP7_IER (0x12) // // diff --git a/bsp/ht32/ht32f52352/project.uvoptx b/bsp/ht32/ht32f52352/project.uvoptx index f767ec2636..50637f5197 100644 --- a/bsp/ht32/ht32f52352/project.uvoptx +++ b/bsp/ht32/ht32f52352/project.uvoptx @@ -73,7 +73,7 @@ 0 - 1 + 0 0 1 @@ -170,7 +170,7 @@ Applications - 1 + 0 0 0 0 @@ -317,8 +317,8 @@ 0 0 0 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - i2c-bit-ops.c + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c 0 0 @@ -329,8 +329,8 @@ 0 0 0 - ..\..\..\components\drivers\i2c\i2c_core.c - i2c_core.c + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c 0 0 @@ -341,30 +341,6 @@ 0 0 0 - ..\..\..\components\drivers\i2c\i2c_dev.c - i2c_dev.c - 0 - 0 - - - 3 - 14 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\ipc\completion.c - completion.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 ..\..\..\components\drivers\ipc\condvar.c condvar.c 0 @@ -372,7 +348,7 @@ 3 - 16 + 14 1 0 0 @@ -384,7 +360,7 @@ 3 - 17 + 15 1 0 0 @@ -396,7 +372,7 @@ 3 - 18 + 16 1 0 0 @@ -408,7 +384,7 @@ 3 - 19 + 17 1 0 0 @@ -420,7 +396,7 @@ 3 - 20 + 18 1 0 0 @@ -432,7 +408,7 @@ 3 - 21 + 19 1 0 0 @@ -444,73 +420,25 @@ 3 - 22 + 20 1 0 0 0 - ..\..\..\components\drivers\misc\adc.c - adc.c + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c 0 0 3 - 23 + 21 1 0 0 0 - ..\..\..\components\drivers\pin\pin.c - pin.c - 0 - 0 - - - 3 - 24 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\serial\serial.c - serial.c - 0 - 0 - - - 3 - 25 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\spi\spi_core.c - spi_core.c - 0 - 0 - - - 3 - 26 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\spi\spi_dev.c - spi_dev.c - 0 - 0 - - - 3 - 27 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\watchdog\watchdog.c - watchdog.c + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c 0 0 @@ -518,13 +446,13 @@ Drivers - 1 + 0 0 0 0 4 - 28 + 22 1 0 0 @@ -536,7 +464,7 @@ 4 - 29 + 23 1 0 0 @@ -548,7 +476,7 @@ 4 - 30 + 24 2 0 0 @@ -560,7 +488,7 @@ 4 - 31 + 25 1 0 0 @@ -572,7 +500,7 @@ 4 - 32 + 26 1 0 0 @@ -584,7 +512,7 @@ 4 - 33 + 27 1 0 0 @@ -604,19 +532,7 @@ 0 5 - 34 - 1 - 0 - 0 - 0 - ..\..\..\components\finsh\shell.c - shell.c - 0 - 0 - - - 5 - 35 + 28 1 0 0 @@ -628,7 +544,19 @@ 5 - 36 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 5 + 30 1 0 0 @@ -640,13 +568,13 @@ 5 - 37 + 31 1 0 0 0 - ..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\components\finsh\shell.c + shell.c 0 0 @@ -660,7 +588,7 @@ 0 6 - 38 + 32 1 0 0 @@ -672,7 +600,7 @@ 6 - 39 + 33 1 0 0 @@ -684,7 +612,31 @@ 6 - 40 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 36 1 0 0 @@ -696,7 +648,7 @@ 6 - 41 + 37 1 0 0 @@ -708,7 +660,7 @@ 6 - 42 + 38 1 0 0 @@ -720,31 +672,7 @@ 6 - 43 - 1 - 0 - 0 - 0 - ..\..\..\src\klibc\kstdio.c - kstdio.c - 0 - 0 - - - 6 - 44 - 1 - 0 - 0 - 0 - ..\..\..\src\klibc\kstring.c - kstring.c - 0 - 0 - - - 6 - 45 + 39 1 0 0 @@ -756,7 +684,7 @@ 6 - 46 + 40 1 0 0 @@ -768,7 +696,7 @@ 6 - 47 + 41 1 0 0 @@ -780,7 +708,7 @@ 6 - 48 + 42 1 0 0 @@ -792,7 +720,7 @@ 6 - 49 + 43 1 0 0 @@ -804,7 +732,7 @@ 6 - 50 + 44 1 0 0 @@ -816,7 +744,7 @@ 6 - 51 + 45 1 0 0 @@ -828,7 +756,7 @@ 6 - 52 + 46 1 0 0 @@ -840,7 +768,7 @@ 6 - 53 + 47 1 0 0 @@ -853,14 +781,82 @@ - libcpu + klibc 0 0 0 0 7 - 54 + 48 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 53 1 0 0 @@ -871,8 +867,8 @@ 0 - 7 - 55 + 8 + 54 1 0 0 @@ -883,8 +879,8 @@ 0 - 7 - 56 + 8 + 55 2 0 0 @@ -895,8 +891,8 @@ 0 - 7 - 57 + 8 + 56 1 0 0 @@ -915,200 +911,8 @@ 0 0 - 8 - 58 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_sci.c - ht32f5xxxx_sci.c - 0 - 0 - - - 8 - 59 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c - ht32f5xxxx_rstcu.c - 0 - 0 - - - 8 - 60 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c - ht32f5xxxx_adc.c - 0 - 0 - - - 8 - 61 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c - ht32f5xxxx_cmp.c - 0 - 0 - - - 8 - 62 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c - ht32_cm0plus_misc.c - 0 - 0 - - - 8 - 63 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_crc.c - ht32f5xxxx_crc.c - 0 - 0 - - - 8 - 64 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c - ht32f5xxxx_spi.c - 0 - 0 - - - 8 - 65 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c - ht32f5xxxx_pwrcu.c - 0 - 0 - - - 8 - 66 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c - ht32f5xxxx_pdma.c - 0 - 0 - - - 8 - 67 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c - ht32f5xxxx_mctm.c - 0 - 0 - - - 8 - 68 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c - ht32f5xxxx_rtc.c - 0 - 0 - - - 8 - 69 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2s.c - ht32f5xxxx_i2s.c - 0 - 0 - - - 8 - 70 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usbd.c - ht32f5xxxx_usbd.c - 0 - 0 - - - 8 - 71 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c - ht32f5xxxx_wdt.c - 0 - 0 - - - 8 - 72 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c - ht32f5xxxx_ebi.c - 0 - 0 - - - 8 - 73 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c - ht32f5xxxx_tm.c - 0 - 0 - - - 8 - 74 + 9 + 57 1 0 0 @@ -1119,7 +923,211 @@ 0 - 8 + 9 + 58 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c + ht32f5xxxx_pwrcu.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c + ht32f5xxxx_wdt.c + 0 + 0 + + + 9 + 60 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c + ht32f5xxxx_mctm.c + 0 + 0 + + + 9 + 61 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + ht32f5xxxx_usart.c + 0 + 0 + + + 9 + 62 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + ht32f5xxxx_ebi.c + 0 + 0 + + + 9 + 63 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c + ht32f5xxxx_exti.c + 0 + 0 + + + 9 + 64 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_crc.c + ht32f5xxxx_crc.c + 0 + 0 + + + 9 + 65 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c + ht32f5xxxx_spi.c + 0 + 0 + + + 9 + 66 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_sci.c + ht32f5xxxx_sci.c + 0 + 0 + + + 9 + 67 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c + ht32f5xxxx_i2c.c + 0 + 0 + + + 9 + 68 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c + ht32f5xxxx_tm.c + 0 + 0 + + + 9 + 69 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c + ht32f5xxxx_pdma.c + 0 + 0 + + + 9 + 70 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + ht32f5xxxx_adc.c + 0 + 0 + + + 9 + 71 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usbd.c + ht32f5xxxx_usbd.c + 0 + 0 + + + 9 + 72 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_01.c + system_ht32f5xxxx_01.c + 0 + 0 + + + 9 + 73 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + ht32f5xxxx_rstcu.c + 0 + 0 + + + 9 + 74 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + ht32f5xxxx_flash.c + 0 + 0 + + + 9 75 1 0 @@ -1131,19 +1139,19 @@ 0 - 8 + 9 76 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c - ht32f5xxxx_exti.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + ht32_cm0plus_misc.c 0 0 - 8 + 9 77 1 0 @@ -1155,50 +1163,38 @@ 0 - 8 + 9 78 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c - ht32f5xxxx_usart.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2s.c + ht32f5xxxx_i2s.c 0 0 - 8 + 9 79 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c - ht32f5xxxx_i2c.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c + ht32f5xxxx_rtc.c 0 0 - 8 + 9 80 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c - ht32f5xxxx_flash.c - 0 - 0 - - - 8 - 81 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_01.c - system_ht32f5xxxx_01.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + ht32f5xxxx_cmp.c 0 0 diff --git a/bsp/ht32/ht32f52352/project.uvprojx b/bsp/ht32/ht32f52352/project.uvprojx index 602e06a775..8f9e53c870 100644 --- a/bsp/ht32/ht32f52352/project.uvprojx +++ b/bsp/ht32/ht32f52352/project.uvprojx @@ -15,8 +15,8 @@ HT32F52352 Holtek - Holtek.HT32_DFP.1.0.19 - http://mcu.holtek.com.tw/pack + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack IRAM(0x20000000,0x4000) IROM(0x00000000,0x1FE00) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE @@ -332,10 +332,10 @@ 0 0 - - __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, USE_HT32_DRIVER, __RTTHREAD__, USE_HT32F52352_SK, USE_HT32F52342_52, USE_MEM_HT32F52352 + --gnu + RT_USING_LIBC, RT_USING_ARMLIBC, __RTTHREAD__, USE_HT32F52352_SK, USE_HT32F52342_52, USE_MEM_HT32F52352, __CLK_TCK=RT_TICK_PER_SECOND, __STDC_LIMIT_MACROS, USE_HT32_DRIVER - ..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\include;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include;..\libraries\ht32_drivers;..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Include;..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\inc;..\..\..\libcpu\arm\common;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\HT32_STD_5xxxx_FWLib\library\CMSIS\Include;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\eventfd;board\inc;..\..\..\components\drivers\include;..\..\..\components\drivers\include;.;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;applications;..\..\..\components\drivers\spi;..\..\..\libcpu\arm\cortex-m0 + ..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\smp_call;..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\inc;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\libc\posix\ipc;..\libraries\ht32_drivers;..\..\..\components\libc\posix\io\poll;..\libraries\usbd_library\inc;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;.;..\..\..\components\drivers\phy;board\inc;..\..\..\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\finsh;applications;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\HT32_STD_5xxxx_FWLib\library\CMSIS\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\posix\io\eventfd;..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Include @@ -490,9 +490,9 @@ - i2c-bit-ops.c + completion_comm.c 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c + ..\..\..\components\drivers\ipc\completion_comm.c 2 @@ -545,119 +545,9 @@ - i2c_core.c + completion_up.c 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c + ..\..\..\components\drivers\ipc\completion_up.c 2 @@ -1095,9 +985,9 @@ - adc.c + dev_pin.c 1 - ..\..\..\components\drivers\misc\adc.c + ..\..\..\components\drivers\pin\dev_pin.c 2 @@ -1150,229 +1040,9 @@ - pin.c + dev_serial.c 1 - ..\..\..\components\drivers\pin\pin.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c + ..\..\..\components\drivers\serial\dev_serial.c 2 @@ -1464,25 +1134,25 @@ Finsh - - shell.c - 1 - ..\..\..\components\finsh\shell.c - msh.c 1 ..\..\..\components\finsh\msh.c + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + msh_parse.c 1 ..\..\..\components\finsh\msh_parse.c - cmd.c + shell.c 1 - ..\..\..\components\finsh\cmd.c + ..\..\..\components\finsh\shell.c @@ -1599,6 +1269,116 @@ + + cpu_up.c + 1 + ..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + idle.c 1 @@ -1764,116 +1544,6 @@ - - kstdio.c - 1 - ..\..\..\src\klibc\kstdio.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_KERNEL_SOURCE__ - - - - - - - - - kstring.c - 1 - ..\..\..\src\klibc\kstring.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_KERNEL_SOURCE__ - - - - - - - kservice.c 1 @@ -2371,6 +2041,36 @@ + + klibc + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kstdio.c + 1 + ..\..\..\src\klibc\kstdio.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + kstring.c + 1 + ..\..\..\src\klibc\kstring.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + libcpu @@ -2400,29 +2100,39 @@ Libraries - ht32f5xxxx_sci.c + ht32f5xxxx_ckcu.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_sci.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c - ht32f5xxxx_rstcu.c + ht32f5xxxx_pwrcu.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c - ht32f5xxxx_adc.c + ht32f5xxxx_wdt.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c - ht32f5xxxx_cmp.c + ht32f5xxxx_mctm.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c - ht32_cm0plus_misc.c + ht32f5xxxx_usart.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + + + ht32f5xxxx_ebi.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + + + ht32f5xxxx_exti.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c ht32f5xxxx_crc.c @@ -2435,74 +2145,9 @@ ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c - ht32f5xxxx_pwrcu.c + ht32f5xxxx_sci.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c - - - ht32f5xxxx_pdma.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c - - - ht32f5xxxx_mctm.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c - - - ht32f5xxxx_rtc.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c - - - ht32f5xxxx_i2s.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2s.c - - - ht32f5xxxx_usbd.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usbd.c - - - ht32f5xxxx_wdt.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c - - - ht32f5xxxx_ebi.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c - - - ht32f5xxxx_tm.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c - - - ht32f5xxxx_ckcu.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c - - - ht32f5xxxx_gpio.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_gpio.c - - - ht32f5xxxx_exti.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c - - - ht32f5xxxx_bftm.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_bftm.c - - - ht32f5xxxx_usart.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_sci.c ht32f5xxxx_i2c.c @@ -2510,15 +2155,70 @@ ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c - ht32f5xxxx_flash.c + ht32f5xxxx_tm.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c + + + ht32f5xxxx_pdma.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c + + + ht32f5xxxx_adc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + + + ht32f5xxxx_usbd.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usbd.c system_ht32f5xxxx_01.c 1 ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_01.c + + ht32f5xxxx_rstcu.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + + + ht32f5xxxx_flash.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + + + ht32f5xxxx_gpio.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_gpio.c + + + ht32_cm0plus_misc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + + + ht32f5xxxx_bftm.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_bftm.c + + + ht32f5xxxx_i2s.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2s.c + + + ht32f5xxxx_rtc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c + + + ht32f5xxxx_cmp.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + diff --git a/bsp/ht32/ht32f52352/rtconfig.h b/bsp/ht32/ht32f52352/rtconfig.h index a2410d0967..b7406d9fc7 100644 --- a/bsp/ht32/ht32f52352/rtconfig.h +++ b/bsp/ht32/ht32f52352/rtconfig.h @@ -1,26 +1,81 @@ #ifndef RT_CONFIG_H__ #define RT_CONFIG_H__ -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - /* RT-Thread Kernel */ +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ #define RT_NAME_MAX 8 #define RT_CPUS_NR 1 #define RT_ALIGN_SIZE 4 #define RT_THREAD_PRIORITY_32 #define RT_THREAD_PRIORITY_MAX 32 #define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK #define RT_HOOK_USING_FUNC_PTR #define RT_USING_IDLE_HOOK #define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 256 +#define IDLE_THREAD_STACK_SIZE 512 -/* kservice optimization */ +/* kservice options */ +/* end of kservice options */ /* Inter-Thread communication */ @@ -29,6 +84,7 @@ #define RT_USING_EVENT #define RT_USING_MAILBOX #define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ /* Memory Management */ @@ -38,12 +94,14 @@ #define RT_MEMHEAP_FAST_MODE #define RT_USING_SMALL_MEM_AS_HEAP #define RT_USING_HEAP +/* end of Memory Management */ #define RT_USING_DEVICE #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" #define RT_VER_NUM 0x50200 #define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M0 @@ -52,7 +110,7 @@ #define RT_USING_COMPONENTS_INIT #define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_STACK_SIZE 1024 #define RT_MAIN_THREAD_PRIORITY 10 #define RT_USING_MSH #define RT_USING_FINSH @@ -71,6 +129,7 @@ /* DFS: device virtual file system */ +/* end of DFS: device virtual file system */ /* Device Drivers */ @@ -79,15 +138,8 @@ #define RT_USING_SERIAL #define RT_USING_SERIAL_V1 #define RT_SERIAL_RB_BUFSZ 64 -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_ADC -#define RT_USING_SPI -#define RT_USING_WDT #define RT_USING_PIN - -/* Using USB */ - +/* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -99,6 +151,8 @@ #define RT_LIBC_TZ_DEFAULT_HOUR 8 #define RT_LIBC_TZ_DEFAULT_MIN 0 #define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ /* POSIX (Portable Operating System Interface) layer */ @@ -108,18 +162,30 @@ /* Socket is in the 'Network' category */ +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ /* Network */ +/* end of Network */ /* Memory protection */ +/* end of Memory protection */ /* Utilities */ +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ /* RT-Thread Utestcases */ +/* end of RT-Thread Utestcases */ /* RT-Thread online packages */ @@ -130,57 +196,78 @@ /* Marvell WiFi */ +/* end of Marvell WiFi */ /* Wiced WiFi */ +/* end of Wiced WiFi */ /* CYW43012 WiFi */ +/* end of CYW43012 WiFi */ /* BL808 WiFi */ +/* end of BL808 WiFi */ /* CYW43439 WiFi */ +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ /* IoT Cloud */ +/* end of IoT Cloud */ +/* end of IoT - internet of things */ /* security packages */ +/* end of security packages */ /* language packages */ /* JSON: JavaScript Object Notation, a lightweight data-interchange format */ +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ /* XML: Extensible Markup Language */ +/* end of XML: Extensible Markup Language */ +/* end of language packages */ /* multimedia packages */ /* LVGL: powerful and easy-to-use embedded GUI library */ +/* end of LVGL: powerful and easy-to-use embedded GUI library */ /* u8g2: a monochrome graphic library */ +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ /* tools packages */ +/* end of tools packages */ /* system packages */ /* enhanced kernel services */ +/* end of enhanced kernel services */ /* acceleration: Assembly language or algorithmic acceleration packages */ +/* end of acceleration: Assembly language or algorithmic acceleration packages */ /* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ /* Micrium: Micrium software products porting for RT-Thread */ +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ /* peripheral libraries and drivers */ @@ -188,69 +275,94 @@ /* STM32 HAL & SDK Drivers */ +/* end of STM32 HAL & SDK Drivers */ /* Infineon HAL Packages */ +/* end of Infineon HAL Packages */ /* Kendryte SDK */ +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ /* sensors drivers */ +/* end of sensors drivers */ /* touch drivers */ +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ /* AI packages */ +/* end of AI packages */ /* Signal Processing and Control Algorithm Packages */ +/* end of Signal Processing and Control Algorithm Packages */ /* miscellaneous packages */ /* project laboratory */ +/* end of project laboratory */ + /* samples: kernel and components samples */ +/* end of samples: kernel and components samples */ /* entertainment: terminal games and other interesting software packages */ +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ /* Arduino libraries */ /* Projects and Demos */ +/* end of Projects and Demos */ /* Sensors */ +/* end of Sensors */ /* Display */ +/* end of Display */ /* Timing */ +/* end of Timing */ /* Data Processing */ +/* end of Data Processing */ /* Data Storage */ /* Communication */ +/* end of Communication */ /* Device Control */ +/* end of Device Control */ /* Other */ +/* end of Other */ /* Signal IO */ +/* end of Signal IO */ /* Uncategorized */ +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ #define SOC_FAMILY_HT32 #define SOC_SERIES_HT32F5 @@ -261,9 +373,11 @@ #define SOC_KERNEL #define CORTEX_M0 #define SOC_HT32F52352 +/* end of Chip Configuration */ /* Onboard Peripheral Drivers */ +/* end of Onboard Peripheral Drivers */ /* On-chip Peripheral Drivers */ @@ -271,8 +385,10 @@ #define BSP_USING_UART #define BSP_USING_USART1 #define BSP_USING_USART1_NAME "usart1" +/* end of On-chip Peripheral Drivers */ /* Board extended module Drivers */ +/* end of Hardware Drivers Config */ #endif diff --git a/bsp/ht32/ht32f52352/template.uvprojx b/bsp/ht32/ht32f52352/template.uvprojx index 2530ad2a7e..039f087c17 100644 --- a/bsp/ht32/ht32f52352/template.uvprojx +++ b/bsp/ht32/ht32f52352/template.uvprojx @@ -15,8 +15,8 @@ HT32F52352 Holtek - Holtek.HT32_DFP.1.0.19 - http://mcu.holtek.com.tw/pack + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack IRAM(0x20000000,0x4000) IROM(0x00000000,0x1FE00) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE @@ -332,7 +332,7 @@ 0 0 - + --gnu diff --git a/bsp/ht32/ht32f53252/.ci/attachconfig/ci.attachconfig.yml b/bsp/ht32/ht32f53252/.ci/attachconfig/ci.attachconfig.yml new file mode 100644 index 0000000000..817cf4e3d0 --- /dev/null +++ b/bsp/ht32/ht32f53252/.ci/attachconfig/ci.attachconfig.yml @@ -0,0 +1,18 @@ +devices.strict: + depend_scons_arg: + - '--strict' +devices.gpio: + depends: + - devices.strict + kconfig: + - CONFIG_BSP_USING_GPIO=y +devices.uart: + kconfig: + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_USART1=y +# ------ SEGGER CI ------ +segger: + kconfig: + - CONFIG_BSP_USING_GPIO=y + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_USART1=y \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/.config b/bsp/ht32/ht32f53252/.config new file mode 100644 index 0000000000..7dc7e334d3 --- /dev/null +++ b/bsp/ht32/ht32f53252/.config @@ -0,0 +1,1326 @@ + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART 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=4 +# 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 is not set +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=512 +# CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +# CONFIG_RT_USING_DEBUG is not set +# CONFIG_RT_USING_CI_ACTION 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 +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +CONFIG_RT_USING_MEMHEAP=y +CONFIG_RT_MEMHEAP_FAST_MODE=y +# CONFIG_RT_MEMHEAP_BEST_MODE 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 +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" +CONFIG_RT_VER_NUM=0x50200 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M0=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=1024 +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=1024 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=32 +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 +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +# CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN 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_PHY_V2 is not set +# 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_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE 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_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# 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 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# 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 +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# 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 +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# 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 +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# 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 +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# 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 +# end of IoT Cloud + +# 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 +# CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things + +# +# 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 +# end of security packages + +# +# 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 +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# 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 +# end of language packages + +# +# 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 +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# 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_3GPP_AMRNB is not set +# end of multimedia packages + +# +# 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 +# end of tools packages + +# +# 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 +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY 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 +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# 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 +# end of Micrium: Micrium software products porting for RT-Thread + +# 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_LEVELX 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 +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK 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 +# end of sensors drivers + +# +# 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_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA 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_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_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_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_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_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_RGPOWER is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# 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 +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# 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 +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of 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 +# end of samples: kernel and components samples + +# +# 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 +# end of entertainment: terminal games and other interesting software packages + +# 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 +# end of miscellaneous packages + +# +# 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 +# end of Projects and Demos + +# +# 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 +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# 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 +# end of Display + +# +# 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 +# end of Timing + +# +# 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 +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# 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 +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# 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 +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +CONFIG_SOC_FAMILY_HT32=y +CONFIG_SOC_SERIES_HT32F5=y + +# +# Hardware Drivers Config +# + +# +# Chip Configuration +# +CONFIG_SOC_KERNEL=y +CONFIG_CORTEX_M0=y +# CONFIG_CORTEX_M3 is not set +# CONFIG_SOC_HT32F0006 is not set +# CONFIG_SOC_HT32F0008 is not set +# CONFIG_SOC_HT32F50241 is not set +# CONFIG_SOC_HT32F50343 is not set +# CONFIG_SOC_HT32F50441 is not set +# CONFIG_SOC_HT32F50452 is not set +# CONFIG_SOC_HT32F52241 is not set +# CONFIG_SOC_HT32F52244 is not set +# CONFIG_SOC_HT32F52253 is not set +# CONFIG_SOC_HT32F52341 is not set +# CONFIG_SOC_HT32F52352 is not set +# CONFIG_SOC_HT32F52354 is not set +# CONFIG_SOC_HT32F52367 is not set +# CONFIG_SOC_HT32F53241 is not set +CONFIG_SOC_HT32F53252=y +# CONFIG_SOC_HT32F54241 is not set +# CONFIG_SOC_HT32F54253 is not set +# CONFIG_SOC_HT32F57341 is not set +# CONFIG_SOC_HT32F57352 is not set +# CONFIG_SOC_HT32F5828 is not set +# CONFIG_SOC_HT32F59041 is not set +# CONFIG_SOC_HT32F59741 is not set +# CONFIG_SOC_HT32F61141 is not set +# CONFIG_SOC_HT32F61245 is not set +# CONFIG_SOC_HT32F61355 is not set +# CONFIG_SOC_HT32F61356 is not set +# CONFIG_SOC_HT32F61357 is not set +# CONFIG_SOC_HT32F61641 is not set +# CONFIG_SOC_HT32F65240 is not set +# CONFIG_SOC_HT32F67051 is not set +# CONFIG_SOC_HT32F67741 is not set +# end of Chip Configuration + +# +# Onboard Peripheral Drivers +# +# CONFIG_BSP_USING_TEST is not set +# end of Onboard Peripheral Drivers + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +# CONFIG_BSP_USING_USART0 is not set +CONFIG_BSP_USING_USART1=y +CONFIG_BSP_USING_USART1_NAME="usart1" +# CONFIG_BSP_USING_UART0 is not set +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2C is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_USBD is not set +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/ht32/ht32f53252/Kconfig b/bsp/ht32/ht32f53252/Kconfig new file mode 100644 index 0000000000..73238d3a13 --- /dev/null +++ b/bsp/ht32/ht32f53252/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/ht32/ht32f53252/README.md b/bsp/ht32/ht32f53252/README.md new file mode 100644 index 0000000000..e35b8f00b3 --- /dev/null +++ b/bsp/ht32/ht32f53252/README.md @@ -0,0 +1,108 @@ +# HT32F53252 BSP 说明 + +## 简介 + +ESK32-30522是合泰基于HT32F53252芯片并针对Cortex®-M0+入门而设计的评估板。本文档是为ESK32-30522开发板提供的BSP(板级支持包)说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。 + +## 开发板介绍 + +ESK32-30522使用32位Arm® Cortex®-M0+高性能、低功耗单片机HT32F53252,针对Cortex®-M0+入门而设计。开发板外观如下图所示: + +![board.png](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:HT32F53252,主频 60MHz,128KB FLASH ,16KB SRAM +- 常用外设 + - LED:2个,(绿色,PC14、PC15) +- 常用接口:USB 转串口 、USB SLAVE +- 调试接口:板载的 e-Link32 Lite SWD 下载 + +开发板更多详细信息请参考合泰官网的相关文档[ESK32-30522](https://www.holtek.com.cn/page/detail/dev_kit/ESK32-30522)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :--- | :---: | :--- | +| USB 转串口 | 支持 | 使用 USART1 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1...PD3 ---> PIN: 0, 1...51 | +| USART | 支持 | USART0/1 | +| UART | 支持 | UART0/1 | +| SPI | 支持 | SPI0/1 | +| I2C | 支持 | 硬件 I2C0/1 | +| ADC | 暂不支持 | | +| WDT | 暂不支持 | | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多片上资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为仅为开发者提供MDK5的工程。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线通过板载的 e-Link32 Lite将芯片连接到 PC。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 注:工程默认配置使用CMSIS-DAP下载方式,在通过 e-Link32 Lite 连接开发板的基础上,点击下载按钮即可下载程序到开发板。 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,LED1和LED2交替闪烁。 + +连接开发板对应串口到 PC(也可以通过e-Link32 Lite的模拟串口将开发板连接到PC), 在终端工具里调整好串口配置(115200-8-1-N)并打开相应的串口,复位设备后,可以看到 RT-Thread 的输出信息: + +> 注:由于RT-Thread的finsh控制台使用的是命令行的输入形式,推荐使用串口调试工具如:Tabby terminal 或者 Tera Term。 + +```bash + \ | / +- RT - Thread Operating System + / | \ 5.1.0 build Apr 10 2024 14:39:43 + 2006 - 2024 Copyright by RT-Thread team +msh > +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 USART1 的功能,如果需使用更多的片上资源,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`scons --target=mdk5` 命令重新生成工程。 + +## 注意事项 + +开发板和芯片的相关资料可以在[合泰官网](https://www.holtek.com.cn/page/index)进行查找和下载,如芯片的数据手册和开发使用手册、开发板的原理图、Keil_v5的pack安装包等。 + +## 联系人信息 + +维护人: + +- [QT-one](https://github.com/QT-one) \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/SConscript b/bsp/ht32/ht32f53252/SConscript new file mode 100644 index 0000000000..682f94215c --- /dev/null +++ b/bsp/ht32/ht32f53252/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os #包含os库 +Import('RTT_ROOT') #导入RTT_ROOT对象(RTT_ROOT代表的是RT-Thread源码包) +from building import * #把building模块的所有内容都导入到当前模块中 + +cwd = GetCurrentDir() #获取当前路径,并将该路径信息保存到变量cwd中 +objs = [] #创建一个list型变量objs +list = os.listdir(cwd) #得到当前目录下的所有子目录,并保存到变量list中 + +for d in list: #for循环用d记录循环的次数,直到寻遍所有路径 + path = os.path.join(cwd, d) #根据d获取到不同的路径 + if os.path.isfile(os.path.join(path, 'SConscript')): #如果该路径下存在名为SConscript的文件 + objs = objs + SConscript(os.path.join(d, 'SConscript')) #将路径中SConscript文件内的源码读取到objs中 + +Return('objs') #将objs返回出去 diff --git a/bsp/ht32/ht32f53252/SConstruct b/bsp/ht32/ht32f53252/SConstruct new file mode 100644 index 0000000000..26ac123a47 --- /dev/null +++ b/bsp/ht32/ht32f53252/SConstruct @@ -0,0 +1,63 @@ +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 = 'rt-thread.' + 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 == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.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) + +ht32_library = 'HT32_STD_5xxxx_FWLib' +rtconfig.BSP_LIBRARY_TYPE = ht32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, ht32_library, 'SConscript'))) + +# include usb libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'usbd_library', 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'ht32_drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/ht32/ht32f53252/applications/SConscript b/bsp/ht32/ht32f53252/applications/SConscript new file mode 100644 index 0000000000..395a120290 --- /dev/null +++ b/bsp/ht32/ht32f53252/applications/SConscript @@ -0,0 +1,26 @@ +#导入其他模块的变量 +Import('RTT_ROOT') +Import('rtconfig') + +#导入使用到的模块 +from building import * + +#获取当前目录的路径 +cwd = GetCurrentDir() + +#创建一个列表,用于保存需要使用到的C文件路径 +#src = Glob('*.c') +src = Split(""" +main.c +""") +if GetDepend(['BSP_USING_TEST']): + src += ['test.c'] + +#创建一个列表,用于保存需要包含的H文件路径 +path = [cwd] + +#创建一个组别 +group = DefineGroup('Applications', src, depend = [''], CPPPATH = path) + +#返回创建好的组别 +Return('group') \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/applications/main.c b/bsp/ht32/ht32f53252/applications/main.c new file mode 100644 index 0000000000..8e5d2d47c6 --- /dev/null +++ b/bsp/ht32/ht32f53252/applications/main.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#include +#include +#include "board.h" + +/* defined the led1 pin: pc14 */ +#define LED1_PIN GET_PIN(C, 14) +/* defined the led2 pin: pc15 */ +#define LED2_PIN GET_PIN(C, 15) + +int main(void) +{ + rt_uint32_t speed = 200; + /* set led1 pin mode to output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + /* set led2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (1) + { + rt_pin_write(LED1_PIN, PIN_LOW); + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(speed); + rt_pin_write(LED1_PIN, PIN_HIGH); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(speed); + } +} diff --git a/bsp/ht32/ht32f53252/applications/test.c b/bsp/ht32/ht32f53252/applications/test.c new file mode 100644 index 0000000000..894f7a1898 --- /dev/null +++ b/bsp/ht32/ht32f53252/applications/test.c @@ -0,0 +1,941 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-06-17 QT-one first version + */ + +#include "board.h" + +#ifdef BSP_USING_TEST + +/* Task stack */ +#define THREAD_PRIORITY 25 +#define THREAD_STACK_SIZE 512 +#define THREAD_TIMESLICE 5 + +/* Test pins */ +#define TEST_LED0_PIN GET_PIN(C, 14) +#define TEST_LED1_PIN GET_PIN(C, 15) +#define TEST_LED2_PIN GET_PIN(C, 1) + +#define TEST_WAKEUP_PIN GET_PIN(B, 12) +#define TEST_KEY1_PIN GET_PIN(D, 1) +#define TEST_KEY2_PIN GET_PIN(D, 2) + +#define TEST_OTHER_PIN GET_PIN(B, 12) +#define TEST_OUTPUT_PIN GET_PIN(C, 1) + +#define TEST_INPUT_PIN GET_PIN(D, 1) +#define TEST_INT_PIN GET_PIN(D, 2) +#define TEST_RES_PIN GET_PIN(C, 1) + + +/* Event flags */ +#define TEST_GPIO_INT_ENV (1 << 10) +#define TEST_GPIO_KEY_ENV (1 << 15) +static struct rt_event led_event; /* LED event */ +#define TASK_KILL_FLAG (1 << 10) +static struct rt_event task_event; /* Task event */ + +/* EEPROM Read/Write Data Structure */ +typedef union +{ + rt_uint8_t data[30]; + struct + { + rt_uint8_t write_addr; + char write_date[29]; + }in_data; +}eeprom_write_type; +/* Semaphore variables */ +static struct rt_semaphore rx_sem; + +/* Mutually exclusive variables */ +static rt_mutex_t task_mutex = RT_NULL; /* task mutex */ + +/* device handle */ +#ifdef BSP_USING_UART +static rt_device_t serial; +#endif +#ifdef BSP_USING_WDT +static rt_device_t wdt_dev; +#endif +#ifdef BSP_USING_I2C +static struct rt_i2c_bus_device *i2c_dev; +#endif +#ifdef BSP_USING_SPI +static struct rt_spi_device *spi_dev; +#endif + +/* In-file function declarations */ +//static void sys_run_dir(void *parameter); +//static void gpio_output_test(void *parameter); +//static void gpio_input_test(void *parameter); +//static void key_iqr_handle(void *args); + +/* Task registration */ +int task_registration(void) +{ +// USB_Configuration(RT_NULL); + /* Create a dynamic mutex */ + task_mutex = rt_mutex_create("task_mutex", RT_IPC_FLAG_FIFO); + if (task_mutex == RT_NULL) + { + rt_kprintf("rt_mutex_create error.\n"); + return -1; + } + /* Create a task event */ + if(rt_event_init(&task_event,"task_event",RT_IPC_FLAG_FIFO) != RT_EOK) + { + rt_kprintf("rt_mutex_create error.\n"); + return -1; + } + return 0; +} +INIT_BOARD_EXPORT(task_registration); + +/* System operation indicator */ +#ifdef BSP_USING_GPIO +static void sys_run_dir(void *parameter) +{ + rt_uint32_t e; + rt_pin_mode(TEST_LED2_PIN, PIN_MODE_OUTPUT); + while(1) + { + if(rt_event_recv(&task_event,TASK_KILL_FLAG, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, &e) == RT_EOK) + { + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + rt_pin_write(TEST_LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + rt_pin_write(TEST_LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + } +} + +static int sys_run_task(int argc, char *argv[]) +{ + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK) + { + rt_kprintf("The test thread is occupied.\n"); + return -RT_ERROR; + } + else + { + /* Register the system indicator task */ + rt_thread_t sys_led_task = rt_thread_create("sys_led_task", + sys_run_dir, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (sys_led_task != RT_NULL) + rt_thread_startup(sys_led_task); + rt_kprintf("The sys run task is registered.\n"); + } + } + else if(rt_strcmp(argv[1],"end") == 0) + { + rt_event_send(&task_event,TASK_KILL_FLAG); + rt_mutex_release(task_mutex); + rt_kprintf("The sys run task has been deleted.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(sys_run_task, sys run task operation); + +/* Gpio output test */ +static void gpio_output_test(void *parameter) +{ + rt_uint32_t e; + rt_pin_mode(TEST_OUTPUT_PIN, PIN_MODE_OUTPUT); + while(1) + { + if(rt_event_recv(&task_event,TASK_KILL_FLAG, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, &e) == RT_EOK) + { + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + rt_pin_write(TEST_OUTPUT_PIN, PIN_LOW); + rt_thread_mdelay(500); + rt_pin_write(TEST_OUTPUT_PIN, PIN_HIGH); + rt_thread_mdelay(500); + } +} + +static int gpio_output_task(int argc, char *argv[]) +{ + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK) + { + rt_kprintf("The test thread is occupied.\n"); + return -RT_ERROR; + } + else + { + /* Gpio output test tasks */ + rt_thread_t gpio_output_task = rt_thread_create("gpio_output_task", + gpio_output_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (gpio_output_task != RT_NULL) + rt_thread_startup(gpio_output_task); + rt_kprintf("The gpio output task is registered.\n"); + } + } + else if(rt_strcmp(argv[1],"end") == 0) + { + rt_event_send(&task_event,TASK_KILL_FLAG); + rt_mutex_release(task_mutex); + rt_kprintf("The gpio output task has been deleted.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(gpio_output_task, gpio output task operation); +/* Gpio input test */ +static void key_iqr_handle(void *args) +{ + /* gpio iqr fun */ + rt_event_send(&led_event,TEST_GPIO_INT_ENV); +} + +static void gpio_input_test(void *parameter) +{ + uint8_t led_flag = PIN_LOW; + rt_uint32_t e; + + rt_pin_mode(TEST_RES_PIN, PIN_MODE_OUTPUT); + rt_pin_write(TEST_RES_PIN, PIN_LOW); + + rt_pin_mode(TEST_WAKEUP_PIN,PIN_MODE_INPUT_PULLDOWN); + rt_pin_mode(TEST_INPUT_PIN,PIN_MODE_INPUT_PULLUP); + + rt_pin_attach_irq(TEST_INT_PIN,PIN_IRQ_MODE_FALLING,key_iqr_handle,RT_NULL); + rt_pin_irq_enable(TEST_INT_PIN,PIN_IRQ_ENABLE); + + if(rt_event_init(&led_event,"led_event",RT_IPC_FLAG_FIFO) != RT_EOK) + { + rt_kprintf("rt_mutex_create error.\n"); + } + while(1) + { + if(PIN_LOW == rt_pin_read(TEST_INPUT_PIN)) + { + while(PIN_LOW == rt_pin_read(TEST_INPUT_PIN)); + rt_event_send(&led_event,TEST_GPIO_KEY_ENV); + } + if(rt_event_recv(&led_event,(TEST_GPIO_INT_ENV|TEST_GPIO_KEY_ENV), + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, &e) == RT_EOK) + { + led_flag = (led_flag == PIN_LOW)?PIN_HIGH:PIN_LOW; + rt_pin_write(TEST_RES_PIN, led_flag); + } + if(rt_event_recv(&task_event,TASK_KILL_FLAG, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, &e) == RT_EOK) + { + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + } +} + +static int gpio_input_task(int argc, char *argv[]) +{ + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK) + { + rt_kprintf("The test thread is occupied.\n"); + return -RT_ERROR; + } + /* Gpio input test tasks */ + rt_thread_t gpio_input_task = rt_thread_create("gpio_input_task", + gpio_input_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (gpio_input_task != RT_NULL) + rt_thread_startup(gpio_input_task); + rt_kprintf("The gpio input task is registered.\n"); + } + else if(rt_strcmp(argv[1],"end") == 0) + { + rt_event_send(&task_event,TASK_KILL_FLAG); + rt_mutex_release(task_mutex); + rt_kprintf("The gpio input task has been deleted.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(gpio_input_task, gpio input task operation); +#endif +/* uart test */ +#ifdef BSP_USING_UART +static rt_err_t uart_iqr_handle(rt_device_t dev, rt_size_t size) +{ + /* Serial port callback function */ + rt_sem_release(&rx_sem); + return RT_EOK; +} + +static void uart_thread(void *parameter) +{ + char ch; + while (1) + { + /* Serial port readout */ + while (rt_device_read(serial, -1, &ch, 1) != 1) + { + /* semaphore blocking */ + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + } + /* Output the data obtained from the serial port */ + rt_device_write(serial, 0, &ch, 1); + rt_device_write(serial,0,"\n",1); + } +} + +static int uart_task(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + + char uart_name[RT_NAME_MAX] = "uart1"; + char str[] = "hello RT-Thread!\r\n"; + if (argc == 3) + { + if(rt_strcmp(argv[2],"start") == 0) + { + rt_strncpy(uart_name, argv[1], RT_NAME_MAX); + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else + { + rt_kprintf("Incomplete instruction.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start/end\n",__func__); + rt_kprintf("or\n"); + rt_kprintf("%s start/end\n",__func__); + return -1; + } + /* Find Serial Devices */ + serial = rt_device_find(uart_name); + if (!serial) + { + rt_kprintf("find %s failed!\n", uart_name); + return -RT_ERROR; + } + /* Initializing a Signal */ + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + /* Open the serial device with read/write and interrupt reception. */ + rt_device_open(serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); + /* Setting the receive callback function */ + rt_device_set_rx_indicate(serial, uart_iqr_handle); + /* Send String */ + rt_device_write(serial, 0, str, (sizeof(str) - 1)); + /* Creating a serial thread */ + rt_thread_t thread = rt_thread_create("serial", + uart_thread, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (thread != RT_NULL) + rt_thread_startup(thread); + + return ret; +} +MSH_CMD_EXPORT(uart_task, uart device sample); +#endif +/* hw/sw iic test */ +#ifdef BSP_USING_I2C +static void i2c_thread(void *parameter) +{ + uint8_t write_addr = 0x00; + eeprom_write_type eeprom_date; + char send_dat[] = "i2c write eeprom"; + char read_dat[20] = {0}; + struct rt_i2c_msg msg1[2]; + + eeprom_date.in_data.write_addr = write_addr; + rt_strncpy(eeprom_date.in_data.write_date, send_dat, rt_strlen(send_dat)); + + msg1[0].addr = 0x51; + msg1[0].flags = RT_I2C_WR; + msg1[0].buf = eeprom_date.data; + msg1[0].len = (rt_strlen(send_dat) + 1); + if (rt_i2c_transfer(i2c_dev, msg1, 1) == 1) + { + rt_kprintf("eeprom write succeed!\n"); + rt_kprintf("write_dat = %s\r\n",send_dat); + } + else + { + rt_kprintf("eeprom write error!\n"); + } + msg1[0].addr = 0x51; + msg1[0].flags = RT_I2C_WR; + msg1[0].buf = &write_addr; + msg1[0].len = 1; + + msg1[1].addr = 0x51; + msg1[1].flags = RT_I2C_RD; + msg1[1].buf = (uint8_t *)read_dat; + msg1[1].len = rt_strlen(send_dat); + + if (rt_i2c_transfer(i2c_dev, msg1, 2) == 2) + { + rt_kprintf("eeprom read succeed!\n"); + rt_kprintf("read_dat = %s\r\n",read_dat); + } + else + { + rt_kprintf("eeprom read error!\n"); + } +} + +static int i2c_task(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + + char i2c_name[RT_NAME_MAX] = "hw_i2c1"; + if (argc == 3) + { + if(rt_strcmp(argv[2],"start") == 0) + { + rt_strncpy(i2c_name, argv[1], RT_NAME_MAX); + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else + { + rt_kprintf("Incomplete instruction.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start/end\n",__func__); + rt_kprintf("or\n"); + rt_kprintf("%s start/end\n",__func__); + return -1; + } + /* Find I2C Devices */ + i2c_dev = (struct rt_i2c_bus_device *)rt_device_find(i2c_name); + if (!i2c_dev) + { + rt_kprintf("find %s failed!\n", i2c_name); + return -RT_ERROR; + } + /* Execute I2C read/write eeprom function */ + i2c_thread(RT_NULL); + return ret; +} +MSH_CMD_EXPORT(i2c_task, i2c device sample); +#endif +/* spi test */ +#ifdef BSP_USING_SPI +static void spi_thread(void *parameter) +{ + rt_uint8_t w25x_read_id = 0x9F; + rt_uint8_t id[5] = {0}; + + /* Use rt_spi_send_then_recv() to send commands to read IDs */ + rt_spi_take_bus(spi_dev); + rt_spi_take(spi_dev); + rt_spi_send_then_recv(spi_dev, &w25x_read_id, 1, id, 3); + rt_spi_release(spi_dev); + rt_spi_release_bus(spi_dev); + rt_kprintf("use rt_spi_send_then_recv() read MX25L6406 ID is:0x%X%X%X\n", id[0], id[1], id[2]); +} + +static int spi_task(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + struct rt_spi_configuration cfg; + char spi_name[RT_NAME_MAX] = "spi1"; + char flash_name[RT_NAME_MAX] = "flash"; + + if (argc == 3) + { + if(rt_strcmp(argv[2],"start") == 0) + { + rt_strncpy(spi_name, argv[1], RT_NAME_MAX); + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else + { + rt_kprintf("Incomplete instruction.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start/end\n",__func__); + rt_kprintf("or\n"); + rt_kprintf("%s start/end\n",__func__); + return -1; + } + /* Binding CS pin */ + ret = rt_hw_spi_device_attach(spi_name,flash_name,HT_GPIOD,GPIO_PIN_0); + if(ret != RT_EOK) + { + rt_kprintf("Failed CS pin binding for %s!\n", spi_name); + return -RT_ERROR; + } + /* Find flash devices */ + spi_dev = (struct rt_spi_device*)rt_device_find(flash_name); + if (!spi_dev) + { + rt_kprintf("find %s failed!\n", spi_name); + return -RT_ERROR; + } + /* Configuring the SPI Bus */ + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB; + cfg.max_hz = 8; + rt_spi_configure(spi_dev,&cfg); + rt_kprintf("SPI0 initialization succeeded!\n"); + + /* Execute flash read and write functions */ + spi_thread(RT_NULL); + rt_device_unregister((rt_device_t)spi_dev); + return ret; +} +MSH_CMD_EXPORT(spi_task, spi device sample); +#endif +/* adc test */ +#ifdef BSP_USING_ADC +static void adc_test(void *parameter) +{ + rt_uint32_t adc0_ch6_val,adc0_ch7_val; + rt_adc_device_t adc_dev = (rt_adc_device_t)rt_device_find("adc0"); + if (!adc_dev) + { + rt_kprintf("No ADC0 device found!\n"); + } + else + { + rt_adc_enable(adc_dev,ADC_CH_6); + rt_adc_enable(adc_dev,ADC_CH_7); + } + while(1) + { + adc0_ch6_val = rt_adc_read(adc_dev,6); + adc0_ch7_val = rt_adc_read(adc_dev,7); + rt_kprintf("adc0_ch6_val = %d\n",adc0_ch6_val); + rt_kprintf("adc0_ch7_val = %d\n",adc0_ch7_val); + rt_thread_mdelay(50); + } +} + +static int adc_task(int argc, char *argv[]) +{ + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Adc test tasks */ + rt_thread_t adc_task = rt_thread_create("adc_task", + adc_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (adc_task != RT_NULL) + rt_thread_startup(adc_task); + rt_kprintf("The adc task is registered.\n"); + } + else if(rt_strcmp(argv[1],"end") == 0) + { + rt_event_send(&task_event,TASK_KILL_FLAG); + rt_kprintf("The adc task has been deleted.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(adc_task, adc task operation); +#endif +/* wdt test */ +#ifdef BSP_USING_WDT +static void wdt_test(void) +{ + rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); +} + +static int wdt_task(int argc, char *argv[]) +{ + rt_err_t ret = -RT_ERROR; + rt_uint16_t wdt_time = 5; + char dev_name[] = "wdt"; + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Find wdt devices */ + wdt_dev = rt_device_find(dev_name); + if(wdt_dev == RT_NULL) + { + rt_kprintf("No corresponding equipment found.\n"); + return -1; + } + /* Configuring the Watchdog */ + ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &wdt_time); + if(ret != RT_EOK) + { + rt_kprintf("wdt configuration failed.\n"); + return -1; + } + /* Start the Watchdog */ + ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); + if(ret != RT_EOK) + { + rt_kprintf("wdt start failed.\n"); + return -1; + } + /* Setting up idle threads */ + rt_thread_idle_sethook(wdt_test); + rt_kprintf("Watchdog started successfully.\n"); + } + else if(rt_strcmp(argv[1],"stop") == 0) + { + /* Verify device handle */ + if(wdt_dev == RT_NULL) + { + rt_kprintf("Device handle does not exist.\n"); + return -1; + } + /* Stop the Watchdog */ + ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_STOP, RT_NULL); + if(ret != RT_EOK) + { + rt_kprintf("wdt start failed.\n"); + return -1; + } + /* Hook function to delete idle threads */ + rt_thread_idle_delhook(wdt_test); + rt_kprintf("Watchdog has stopped.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s stop\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(wdt_task, wdt task operation); +#endif +/* usbd test */ +#ifdef BSP_USING_USBD +static void usbd_test(void *parameter) +{ + rt_device_t dev = RT_NULL; + char dev_name[] = "vcom"; + char buf[] = "usbd vcom test!\r\n"; + + dev = rt_device_find(dev_name); + + if (dev) + { + rt_device_open(dev, RT_DEVICE_FLAG_RDWR); + } + else + { + rt_kprintf("Device with name %s not found.\n",dev_name); + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + while (1) + { + rt_device_write(dev, 0, buf, rt_strlen(buf)); + rt_thread_mdelay(500); + } +} + +static int usbd_task(int argc, char *argv[]) +{ + rt_err_t ret = -RT_ERROR; + + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Gpio input test tasks */ + rt_thread_t usbd_vcom_task = rt_thread_create("usbd_vcom_task", + usbd_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (usbd_vcom_task != RT_NULL) + { + rt_thread_startup(usbd_vcom_task); + rt_kprintf("The usbd vcom task is registered.\n"); + } + else + { + rt_kprintf("usbd vcom task registration failed.\n"); + } + ret = RT_EOK; + } + else if(rt_strcmp(argv[1],"stop") == 0) + { + ret = RT_EOK; + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s stop\n",__func__); + } + return ret; +} +MSH_CMD_EXPORT(usbd_task, usbd task operation); + +#endif /* BSP_USING_USBD */ + +#ifdef BSP_USING_CAN + +#define CAN_DEV_NAME BSP_USING_CAN_NAME + +static struct rt_semaphore rx_sem; +static rt_device_t can_dev; + +static rt_err_t can_rx_call(rt_device_t dev, rt_size_t size) +{ + rt_sem_release(&rx_sem); + return RT_EOK; +} +static rt_err_t can_tx_data(void) +{ + struct rt_can_msg msg = {0}; + rt_size_t size; + + msg.id = 0x540; + msg.ide = RT_CAN_STDID; + msg.rtr = RT_CAN_DTR; + msg.len = 8; + + msg.data[0] = 0x00; + msg.data[1] = 0x01; + msg.data[2] = 0x02; + msg.data[3] = 0x03; + msg.data[4] = 0x04; + msg.data[5] = 0x05; + msg.data[6] = 0x06; + msg.data[7] = 0x07; + + size = rt_device_write(can_dev, 0, &msg, sizeof(msg)); + if (size == 0) + { + rt_kprintf("can dev write data failed!\n"); + } + return 0; +} + +static void can_rx_thread(void *parameter) +{ + int i; + rt_size_t size; + rt_uint8_t send_cut = 0; + struct rt_can_msg rxmsg = {0}; + + /* Setting the receive callback function */ + rt_device_set_rx_indicate(can_dev, can_rx_call); + + /* Setting the Hardware Filter Table */ + struct rt_can_filter_item items[1] = + { /* id ide rtr mode mask */ + RT_CAN_FILTER_ITEM_INIT(0x541, RT_CAN_STDID, RT_CAN_DTR, 0, 0x7ff), + }; + struct rt_can_filter_config cfg = {1, 1, items}; + rt_device_control(can_dev, RT_CAN_CMD_SET_FILTER, &cfg); + + can_tx_data(); + while (1) + { + + rxmsg.hdr_index = -1; + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + rt_device_read(can_dev, 0, &rxmsg, sizeof(rxmsg)); + + rt_kprintf("ID:%x ", rxmsg.id); + for (i = 0; i < 8; i++) + { + rt_kprintf(" %2x", rxmsg.data[i]); + rxmsg.data[i] += 1; + } + rt_kprintf(" \n"); + rxmsg.id = 0x540; + rxmsg.ide = RT_CAN_STDID; + rxmsg.rtr = RT_CAN_DTR; + rxmsg.len = 8; + rt_thread_mdelay(1000); + if(send_cut < 10) + { + size = rt_device_write(can_dev, 0, &rxmsg, sizeof(rxmsg)); + send_cut++; + if (size == 0) + { + rt_kprintf("can dev write data failed!\n"); + } + } + } +} + +int can_test(int argc, char *argv[]) +{ + rt_err_t res; + rt_thread_t thread; + char can_name[RT_NAME_MAX]; + + if (argc == 2) + { + rt_strncpy(can_name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(can_name, CAN_DEV_NAME, RT_NAME_MAX); + } + + /* Find a CAN Device */ + can_dev = rt_device_find(can_name); + if (!can_dev) + { + rt_kprintf("find %s failed!\n", can_name); + return -RT_ERROR; + } + + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + + res = rt_device_open(can_dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX); + RT_ASSERT(res == RT_EOK); + + res = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD, (void *)CAN500kBaud); + RT_ASSERT(res == RT_EOK); + + thread = rt_thread_create("can_rx", can_rx_thread, RT_NULL, 1024, 25, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + rt_kprintf("create can_rx thread failed!\n"); + } + + return res; +} + +MSH_CMD_EXPORT(can_test, can device sample); + +#endif /* BSP_USING_CAN */ + +#endif /* BSP_USING_TEST */ diff --git a/bsp/ht32/ht32f53252/board/Kconfig b/bsp/ht32/ht32f53252/board/Kconfig new file mode 100644 index 0000000000..8ba20cd72d --- /dev/null +++ b/bsp/ht32/ht32f53252/board/Kconfig @@ -0,0 +1,449 @@ +menu "Hardware Drivers Config" + +menu "Chip Configuration" + config SOC_KERNEL + bool + select SOC_SERIES_HT32F5 if CORTEX_M0 + select SOC_SERIES_HT32F1 if CORTEX_M3 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + choice + prompt "Select the kernel" + default CORTEX_M0 + config CORTEX_M0 + bool "CORTEX_M0" + config CORTEX_M3 + bool "CORTEX_M3" + endchoice + + choice + prompt "Select the chip you are using" + depends on CORTEX_M0 + default HT32F52352 + config SOC_HT32F0006 + bool "HT32F0006" + config SOC_HT32F0008 + bool "HT32F0008" + config SOC_HT32F50241 + bool "HT32F50241" + config SOC_HT32F50343 + bool "HT32F50343" + config SOC_HT32F50441 + bool "HT32F50441" + config SOC_HT32F50452 + bool "HT32F50452" + config SOC_HT32F52241 + bool "HT32F52241" + config SOC_HT32F52244 + bool "HT32F52244" + config SOC_HT32F52253 + bool "HT32F52253" + config SOC_HT32F52341 + bool "HT32F52341" + config SOC_HT32F52352 + bool "HT32F52352" + config SOC_HT32F52354 + bool "HT32F52354" + config SOC_HT32F52367 + bool "HT32F52367" + config SOC_HT32F53241 + bool "HT32F53241" + config SOC_HT32F53252 + bool "HT32F53252" + config SOC_HT32F54241 + bool "HT32F54241" + config SOC_HT32F54253 + bool "HT32F54253" + config SOC_HT32F57341 + bool "HT32F57341" + config SOC_HT32F57352 + bool "HT32F57352" + config SOC_HT32F5828 + bool "HT32F5828" + config SOC_HT32F59041 + bool "HT32F59041" + config SOC_HT32F59741 + bool "HT32F59741" + config SOC_HT32F61141 + bool "HT32F61141" + config SOC_HT32F61245 + bool "HT32F61245" + config SOC_HT32F61355 + bool "HT32F61355" + config SOC_HT32F61356 + bool "HT32F61356" + config SOC_HT32F61357 + bool "HT32F61357" + config SOC_HT32F61641 + bool "HT32F61641" + config SOC_HT32F65240 + bool "HT32F65240" + config SOC_HT32F67051 + bool "HT32F67051" + config SOC_HT32F67741 + bool "HT32F67741" + endchoice + + choice + prompt "Select the chip you are using" + depends on CORTEX_M3 + default HT32F52352 + config SOC_HT32F1654 + bool "HT32F1654" + config SOC_HT32F1656 + bool "HT32F1656" + config SOC_HT32F12345 + bool "HT32F12345" + config SOC_HT32F12364 + bool "HT32F12364" + config SOC_HT32F12366 + bool "HT32F12366" + endchoice +endmenu + +menu "Onboard Peripheral Drivers" + + config BSP_USING_TEST + bool "Enable test" + default n + + if RT_USING_CONSOLE + config RT_CONSOLE_DEVICE_NAME + string "the device name for console" + default "usart1" + endif + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN if BSP_USING_GPIO + default n + + menuconfig BSP_USING_UART + bool "Enable UART" + default n + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_USART0 + bool "Enable USART0" + default n + config BSP_USING_USART0_NAME + depends on BSP_USING_USART0 + string "usart0 bus name" + default "usart0" + + config BSP_USING_USART1 + bool "Enable USART1" + default n + config BSP_USING_USART1_NAME + depends on BSP_USING_USART1 + string "usart1 bus name" + default "usart1" + + config BSP_USING_UART0 + bool "Enable UART0" + default n + config BSP_USING_UART0_NAME + depends on BSP_USING_UART0 + string "uart0 bus name" + default "uart0" + + config BSP_USING_UART1 + bool "Enable UART1" + default n + config BSP_USING_UART1_NAME + depends on BSP_USING_UART1 + string "uart1 bus name" + default "uart1" + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI Bus" + default n + select RT_USING_SPI if BSP_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI0 + bool "Enable SPI0 Bus" + default n + config BSP_USING_SPI0_NAME + depends on BSP_USING_SPI0 + string "spi0 bus name" + default "spi0" + + config BSP_USING_SPI1 + bool "Enable SPI1 Bus" + default n + config BSP_USING_SPI1_NAME + depends on BSP_USING_SPI1 + string "spi1 bus name" + default "spi1" + endif + + menuconfig BSP_USING_I2C + bool "Enable I2C Bus" + default n + if BSP_USING_I2C + menuconfig BSP_USING_I2C_HW + bool "Enable I2C Bus(hardware)" + default n + select RT_USING_I2C if BSP_USING_I2C_HW + if BSP_USING_I2C_HW + config BSP_USING_I2C0_HW + bool "Enable Hardware I2C0 Bus" + default n + config BSP_USING_I2C0_HW_NAME + depends on BSP_USING_I2C0_HW + string "hardware i2c0 name" + default "hw_i2c0" + + config BSP_USING_I2C1_HW + bool "Enable Hardware I2C1 Bus" + default n + config BSP_USING_I2C1_HW_NAME + depends on BSP_USING_I2C1_HW + string "hardware i2c1 name" + default "hw_i2c1" + endif + + menuconfig BSP_USING_I2C_SW + bool "Enable I2C Bus(software)" + default n + select BSP_USING_GPIO if BSP_USING_I2C_SW + select RT_USING_I2C if BSP_USING_I2C_SW + + if BSP_USING_I2C_SW + config BSP_USING_I2C0_SW + bool "Enable Software I2C0 Bus" + default n + config BSP_USING_I2C0_SW_NAME + depends on BSP_USING_I2C0_SW + string "software i2c0 name" + default "sw_i2c0" + if BSP_USING_I2C0_SW + config BSP_I2C0_SLC_PIN + int "i2c0 slc pin number" + range 0 51 + default 22 + + config BSP_I2C0_SDA_PIN + int "i2c0 sda pin number" + range 0 51 + default 23 + endif + + config BSP_USING_I2C1_SW + bool "Enable Software I2C1 Bus" + default n + config BSP_USING_I2C1_SW_NAME + depends on BSP_USING_I2C1_SW + string "software i2c1 name" + default "sw_i2c1" + if BSP_USING_I2C1_SW + config BSP_I2C1_SLC_PIN + int "i2c1 slc pin number" + range 0 51 + default 24 + + config BSP_I2C1_SDA_PIN + int "i2c1 sda pin number" + range 0 51 + default 25 + endif + + config BSP_USING_I2C2_SW + bool "Enable Software I2C2 Bus" + default n + config BSP_USING_I2C2_SW_NAME + depends on BSP_USING_I2C2_SW + string "software i2c2 name" + default "sw_i2c2" + if BSP_USING_I2C2_SW + config BSP_I2C2_SLC_PIN + int "i2c2 slc pin number" + range 0 51 + default 26 + + config BSP_I2C2_SDA_PIN + int "i2c2 sda pin number" + range 0 51 + default 27 + endif + endif + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC if BSP_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC0 + bool "Enable ADC0" + default n + config BSP_USING_ADC0_NAME + depends on BSP_USING_ADC0 + string "adc0 device name" + default "adc0" + + config BSP_USING_ADC1 + bool "Enable ADC1" + depends on SOC_HT32F65240 + default n + config BSP_USING_ADC1_NAME + depends on BSP_USING_ADC1 + string "adc1 device name" + default "adc1" + endif + + menuconfig BSP_USING_WDT + bool "Enable WDT" + default n + select RT_USING_WDT if BSP_USING_WDT + config BSP_USING_WDT_NAME + depends on BSP_USING_WDT + string "wdt device name" + default "wdt" + + menuconfig BSP_USING_CAN + bool "Enable CAN" + depends on SOC_HT32F53241 || SOC_HT32F53242 || SOC_HT32F53252 + default n + select RT_USING_CAN if BSP_USING_CAN + config BSP_USING_CAN_NAME + depends on BSP_USING_CAN + string "can device name" + default "can" + if BSP_USING_CAN + config CAN_DEFAULT_BASE_CONFIGURATION + choice + prompt "Default CAN baud rate" + default BSP_USING_CAN500kBaud + config BSP_USING_CAN1MBaud + bool "CAN1MBaud" + config BSP_USING_CAN800kBaud + bool "CAN800kBaud" + config BSP_USING_CAN500kBaud + bool "CAN500kBaud" + config BSP_USING_CAN250kBaud + bool "CAN250kBaud" + config BSP_USING_CAN125kBaud + bool "CAN125kBaud" + config BSP_USING_CAN100kBaud + bool "CAN100kBaud" + config BSP_USING_CAN50kBaud + bool "CAN50kBaud" + config BSP_USING_CAN20kBaud + bool "CAN20kBaud" + config BSP_USING_CAN10kBaud + bool "CAN10kBaud" + endchoice + choice + prompt "Default CAN mode" + default BSP_USING_RT_CAN_MODE_NORMAL + config BSP_USING_RT_CAN_MODE_NORMAL + bool "RT_CAN_MODE_NORMAL" + config BSP_USING_RT_CAN_MODE_LISTEN + bool "RT_CAN_MODE_LISTEN" + config BSP_USING_RT_CAN_MODE_LOOPBACK + bool "RT_CAN_MODE_LOOPBACK" + config BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + bool "RT_CAN_MODE_LOOPBACKANLISTEN" + endchoice + + config BSP_USING_CAN_BAUD + int + default 1000000 if BSP_USING_CAN1MBaud + default 800000 if BSP_USING_CAN800kBaud + default 500000 if BSP_USING_CAN500kBaud + default 250000 if BSP_USING_CAN250kBaud + default 125000 if BSP_USING_CAN125kBaud + default 100000 if BSP_USING_CAN100kBaud + default 50000 if BSP_USING_CAN50kBaud + default 20000 if BSP_USING_CAN20kBaud + default 10000 if BSP_USING_CAN10kBaud + + config BSP_USING_CAN_MODE + int + default 0 if BSP_USING_RT_CAN_MODE_NORMAL + default 1 if BSP_USING_RT_CAN_MODE_LISTEN + default 2 if BSP_USING_RT_CAN_MODE_LOOPBACK + default 3 if BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + + config CAN_DEFAULT_FILTER_TABLE_CONFIGURATION + choice + prompt "Default filter id mode" + default BSP_USING_CAN_STD_ID + config BSP_USING_CAN_STD_ID + bool "CAN_STD_ID" + config BSP_USING_CAN_EXT_ID + bool "CAN_EXT_ID" + endchoice + + choice + prompt "Default filter frame mode" + default BSP_USING_CAN_DATA_FRAME + config BSP_USING_CAN_DATA_FRAME + bool "CAN_DATA_FRAME" + config BSP_USING_CAN_REMOTE_FRAME + bool "CAN_REMOTE_FRAME" + endchoice + + config BSP_USING_CAN_ID_MODE + int + default 0 if BSP_USING_CAN_STD_ID + default 1 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_FRAME_MODE + int + default 0 if BSP_USING_CAN_REMOTE_FRAME + default 1 if BSP_USING_CAN_DATA_FRAME + + config BSP_USING_CAN_MSG_NUM + int "Default filter table number" + range 0 31 + default 0 + + config BSP_USING_CAN_ID + hex "Default filter arbitration bit(ID)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x541 if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x541 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_MASK + hex "Default filter mask bit(MASK)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x7FF if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + + endif + + menuconfig BSP_USING_SDIO + bool "Enable SDIO" + depends on SOC_HT32F12345 || SOC_HT32F12365 || SOC_HT32F12366 + default n + select RT_USING_SDIO if BSP_USING_SDIO + config BSP_USING_SDIO_NAME + depends on BSP_USING_SDIO + string "sdio device name" + default "sdio" + + menuconfig BSP_USING_USBD + bool "Enable USB BUS" + default n + select RT_USING_USB_DEVICE if BSP_USING_USBD + config BSP_USING_USBD_NAME + depends on BSP_USING_USBD + string "usbd device name" + default "usbd" +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/ht32/ht32f53252/board/SConscript b/bsp/ht32/ht32f53252/board/SConscript new file mode 100644 index 0000000000..e92da4da29 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/SConscript @@ -0,0 +1,27 @@ + +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +src = Glob('src/*.c') + +startup_path_prefix = SDK_LIB +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s'] + +path = [cwd] +path = [cwd + '/inc'] + +CPPDEFINES = ['USE_HT32F53252_SK, USE_HT32F53242_52, USE_MEM_HT32F53252'] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/board/inc/board.h b/bsp/ht32/ht32f53252/board/inc/board.h new file mode 100644 index 0000000000..c4a817d79b --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/board.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include "ht32.h" +#include "ht32_msp.h" + +#ifdef BSP_USING_GPIO + #include "drv_gpio.h" +#endif + +#ifdef BSP_USING_SPI + #include "drv_spi.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* whether use board external SRAM memory */ +#define HT32_EXT_SRAM 0 +#define HT32_EXT_SRAM_BEGIN 0x68000000 +#define HT32_EXT_SRAM_END (HT32_EXT_SRAM_BEGIN + HT32_EXT_SRAM*1024) + +/* internal sram memory size */ +#define HT32_SRAM_END (0x20000000 + LIBCFG_RAM_SIZE) + +#ifdef __CC_ARM +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="HEAP" +#define HEAP_BEGIN (__segment_end("HEAP")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif +#define HEAP_END HT32_SRAM_END + +void rt_hw_board_clock_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/ht32/ht32f53252/board/inc/ht32_can_config.h b/bsp/ht32/ht32f53252/board/inc/ht32_can_config.h new file mode 100644 index 0000000000..bbef2115c9 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32_can_config.h @@ -0,0 +1,111 @@ +/*********************************************************************************************************//** + * @file CAN/Send_DATA/ht32_can_config.h + * @version $Rev:: 8164 $ + * @date $Date:: 2024-09-20 #$ + * @brief The header file of CAN baudrate configuration. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +//-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32_CAN_CONFIG_H +#define __HT32_CAN_CONFIG_H + +#ifdef __cplusplus + extern "C" { +#endif + + +// Enable CAN Config Check +// Display related setting by printf(). +#define HTCFG_CAN_CONF_CHECK_ENABLE (0) + +// Core Clock Setting +// +// -- Core Clock Calculation Setting +// HTCFG_CAN_CORECLKSEL +// Define the Core Clock by default maximum clock setting or manual input. +// 0 = Default Maximum (LIBCFG_MAX_SPEED) +// 1 = Manual Input (HTCFG_CAN_CORECLK_MANUAL) +// <0=> Default Maximum (LIBCFG_MAX_SPEED) +// <1=> Manual Input (HTCFG_CAN_CORECLK_MANUAL) +// Note: CK_CAN = (Core Clock) / (CAN Peripheral Clock Prescaler) +// -- Core Clock Manual Input (Hz) +// HTCFG_CAN_CORECLK_MANUAL +// Only meaningful when HTCFG_CAN_CLKSEL = 1 (Manual Input) +#define HTCFG_CAN_CORECLKSEL (0) // 0 = Default Maximum (LIBCFG_MAX_SPEED), 1 = Manual Input (HTCFG_CAN_CORECLK_MANUAL) +#define HTCFG_CAN_CORECLK_MANUAL (8000000) // Only meaningful when HTCFG_CAN_CORECLKSEL = 1 (Manual Input) + +// ------------------------------------------ +// + +// CAN Config 0 Setting +// +// CAN Peripheral Clock Selection (CANnPCLK) +// HTCFG_CAN_CLK_PRESCALER +// <0=> Div 1 +// <1=> Div 2 +// <2=> Div 4 +// <3=> Div 8 +#define HTCFG_CAN_CF0_CLK_DIV (0) // 0 = /1, 1 = /2, 2 = /4, 3 = /8 + +/* +// CAN Baudrate +// HTCFG_CAN_BAUDRATE +// <1000000=> 1000 kbps +// <800000=> 800 kbps +// <500000=> 500 kbps +// <250000=> 250 kbps +// <125000=> 125 kbps +// <100000=> 100 kbps +// <50000=> 50 kbps +// <20000=> 20 kbps +// <10000=> 10 kbps +// <5000=> 5 kbps +// The CAN baudrate specifies the frequency of transitions occurring per second. +*/ +#define HTCFG_CAN_CF0_BAUDRATE (500000) + +/* +// CAN Sample Point Target (%) <50-90:1> +// HTCFG_CAN_SAMPLE_POINT +// The Sample Point is the specific location within each bit period where the CAN_Core samples the CAN bus's state (dominant or recessive). +// Notice: The real calculation result may small than the HTCFG_CAN_SAMPLE_POINT setting. +*/ +#define HTCFG_CAN_CF0_SAMPLE_POINT (70) + +// CAN SJW (Synchronisation Jump Width) +// HTCFG_CAN_BIT_TIME_SJW +// The (Re-)Synchronisation Jump Width. +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +#define HTCFG_CAN_CF0_BIT_TIME_SJW (1) // 1 ~ 4 + +#include "ht32_can_config0_calc.h" + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/ht32/ht32f53252/board/inc/ht32_msp.h b/bsp/ht32/ht32f53252/board/inc/ht32_msp.h new file mode 100644 index 0000000000..e45294becb --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32_msp.h @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#ifndef __HT32_MSP_H__ +#define __HT32_MSP_H__ + +#include +#include "ht32.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* UART gpio */ +#ifdef BSP_USING_UART +#ifdef BSP_USING_USART0 +#define HTCFG_USART0_IPN USART0 + +#define _HTCFG_USART0_TX_GPIOX A +#define _HTCFG_USART0_TX_GPION 2 +#define _HTCFG_USART0_RX_GPIOX A +#define _HTCFG_USART0_RX_GPION 3 + +#define HTCFG_USART0_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_USART0_TX_GPIOX) +#define HTCFG_USART0_TX_GPIO_CLK STRCAT2(P, _HTCFG_USART0_TX_GPIOX) +#define HTCFG_USART0_TX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_USART0_TX_GPIOX) +#define HTCFG_USART0_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_USART0_TX_GPION) + +#define HTCFG_USART0_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_USART0_RX_GPIOX) +#define HTCFG_USART0_RX_GPIO_CLK STRCAT2(P, _HTCFG_USART0_RX_GPIOX) +#define HTCFG_USART0_RX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_USART0_RX_GPIOX) +#define HTCFG_USART0_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_USART0_RX_GPION) + +#endif +#ifdef BSP_USING_USART1 + +#define HTCFG_USART1_IPN USART1 + +#define _HTCFG_USART1_TX_GPIOX A +#define _HTCFG_USART1_TX_GPION 4 +#define _HTCFG_USART1_RX_GPIOX A +#define _HTCFG_USART1_RX_GPION 5 + +#define HTCFG_USART1_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_USART1_TX_GPIOX) +#define HTCFG_USART1_TX_GPIO_CLK STRCAT2(P, _HTCFG_USART1_TX_GPIOX) +#define HTCFG_USART1_TX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_USART1_TX_GPIOX) +#define HTCFG_USART1_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_USART1_TX_GPION) + +#define HTCFG_USART1_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_USART1_RX_GPIOX) +#define HTCFG_USART1_RX_GPIO_CLK STRCAT2(P, _HTCFG_USART1_RX_GPIOX) +#define HTCFG_USART1_RX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_USART1_RX_GPIOX) +#define HTCFG_USART1_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_USART1_RX_GPION) + +#endif +#ifdef BSP_USING_UART0 + +#define HTCFG_UART0_IPN UART0 + +#define _HTCFG_UART0_TX_GPIOX B +#define _HTCFG_UART0_TX_GPION 2 +#define _HTCFG_UART0_RX_GPIOX B +#define _HTCFG_UART0_RX_GPION 3 + +#define HTCFG_UART0_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_UART0_TX_GPIOX) +#define HTCFG_UART0_TX_GPIO_CLK STRCAT2(P, _HTCFG_UART0_TX_GPIOX) +#define HTCFG_UART0_TX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_UART0_TX_GPIOX) +#define HTCFG_UART0_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART0_TX_GPION) + +#define HTCFG_UART0_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_UART0_RX_GPIOX) +#define HTCFG_UART0_RX_GPIO_CLK STRCAT2(P, _HTCFG_UART0_RX_GPIOX) +#define HTCFG_UART0_RX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_UART0_RX_GPIOX) +#define HTCFG_UART0_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART0_RX_GPION) + +#endif +#ifdef BSP_USING_UART1 + +#define HTCFG_UART1_IPN UART1 + +#define _HTCFG_UART1_TX_GPIOX B +#define _HTCFG_UART1_TX_GPION 4 +#define _HTCFG_UART1_RX_GPIOX B +#define _HTCFG_UART1_RX_GPION 5 + +#define HTCFG_UART1_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_UART1_TX_GPIOX) +#define HTCFG_UART1_TX_GPIO_CLK STRCAT2(P, _HTCFG_UART1_TX_GPIOX) +#define HTCFG_UART1_TX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_UART1_TX_GPIOX) +#define HTCFG_UART1_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART1_TX_GPION) + +#define HTCFG_UART1_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_UART1_RX_GPIOX) +#define HTCFG_UART1_RX_GPIO_CLK STRCAT2(P, _HTCFG_UART1_RX_GPIOX) +#define HTCFG_UART1_RX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_UART1_RX_GPIOX) +#define HTCFG_UART1_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART1_RX_GPION) + +#endif +#endif + +/* SPI gpio */ +#ifdef BSP_USING_SPI +#ifdef BSP_USING_SPI0 + +#define HTCFG_SPI0_IPN SPI0 + +#define _HTCFG_SPI0_SCK_GPIOX C +#define _HTCFG_SPI0_SCK_GPION 0 + +#define _HTCFG_SPI0_MISO_GPIOX A +#define _HTCFG_SPI0_MISO_GPION 11 + +#define _HTCFG_SPI0_MOSI_GPIOX A +#define _HTCFG_SPI0_MOSI_GPION 9 + +#define HTCFG_SPI0_SCK_GPIO_CLK STRCAT2(P, _HTCFG_SPI0_SCK_GPIOX) +#define HTCFG_SPI0_SCK_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI0_SCK_GPIOX) +#define HTCFG_SPI0_SCK_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI0_SCK_GPION) + +#define HTCFG_SPI0_MISO_GPIO_CLK STRCAT2(P, _HTCFG_SPI0_MISO_GPIOX) +#define HTCFG_SPI0_MISO_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI0_MISO_GPIOX) +#define HTCFG_SPI0_MISO_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI0_MISO_GPION) + +#define HTCFG_SPI0_MOSI_GPIO_CLK STRCAT2(P, _HTCFG_SPI0_MOSI_GPIOX) +#define HTCFG_SPI0_MOSI_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI0_MOSI_GPIOX) +#define HTCFG_SPI0_MOSI_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI0_MOSI_GPION) + +#endif +#ifdef BSP_USING_SPI1 + +#define HTCFG_SPI1_IPN SPI1 + +#define _HTCFG_SPI1_SCK_GPIOX C +#define _HTCFG_SPI1_SCK_GPION 5 + +#define _HTCFG_SPI1_MISO_GPIOX C +#define _HTCFG_SPI1_MISO_GPION 9 + +#define _HTCFG_SPI1_MOSI_GPIOX C +#define _HTCFG_SPI1_MOSI_GPION 8 + +#define HTCFG_SPI1_SCK_GPIO_CLK STRCAT2(P, _HTCFG_SPI1_SCK_GPIOX) +#define HTCFG_SPI1_SCK_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI1_SCK_GPIOX) +#define HTCFG_SPI1_SCK_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI1_SCK_GPION) + +#define HTCFG_SPI1_MISO_GPIO_CLK STRCAT2(P, _HTCFG_SPI1_MISO_GPIOX) +#define HTCFG_SPI1_MISO_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI1_MISO_GPIOX) +#define HTCFG_SPI1_MISO_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI1_MISO_GPION) + +#define HTCFG_SPI1_MOSI_GPIO_CLK STRCAT2(P, _HTCFG_SPI1_MOSI_GPIOX) +#define HTCFG_SPI1_MOSI_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI1_MOSI_GPIOX) +#define HTCFG_SPI1_MOSI_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI1_MOSI_GPION) + +#endif +#endif + +/* I2C gpio */ +#ifdef BSP_USING_I2C_HW +#ifdef BSP_USING_I2C0_HW + +#define HTCFG_I2C0_IPN I2C0 + +#define _HTCFG_I2C0_SCL_GPIOX C +#define _HTCFG_I2C0_SCL_GPION 12 + +#define _HTCFG_I2C0_SDA_GPIOX C +#define _HTCFG_I2C0_SDA_GPION 13 + +#define HTCFG_I2C0_SCL_GPIO_CLK STRCAT2(P, _HTCFG_I2C0_SCL_GPIOX) +#define HTCFG_I2C0_SCL_GPIO_ID STRCAT2(GPIO_P, _HTCFG_I2C0_SCL_GPIOX) +#define HTCFG_I2C0_SCL_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C0_SCL_GPION) + +#define HTCFG_I2C0_SDA_GPIO_CLK STRCAT2(P, _HTCFG_I2C0_SDA_GPIOX) +#define HTCFG_I2C0_SDA_GPIO_ID STRCAT2(GPIO_P, _HTCFG_I2C0_SDA_GPIOX) +#define HTCFG_I2C0_SDA_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C0_SDA_GPION) + +#endif +#ifdef BSP_USING_I2C1_HW + +#define HTCFG_I2C1_IPN I2C1 + +#define _HTCFG_I2C1_SCL_GPIOX A +#define _HTCFG_I2C1_SCL_GPION 0 + +#define _HTCFG_I2C1_SDA_GPIOX A +#define _HTCFG_I2C1_SDA_GPION 1 + +#define HTCFG_I2C1_SCL_GPIO_CLK STRCAT2(P, _HTCFG_I2C1_SCL_GPIOX) +#define HTCFG_I2C1_SCL_GPIO_ID STRCAT2(GPIO_P, _HTCFG_I2C1_SCL_GPIOX) +#define HTCFG_I2C1_SCL_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C1_SCL_GPION) + +#define HTCFG_I2C1_SDA_GPIO_CLK STRCAT2(P, _HTCFG_I2C1_SDA_GPIOX) +#define HTCFG_I2C1_SDA_GPIO_ID STRCAT2(GPIO_P, _HTCFG_I2C1_SDA_GPIOX) +#define HTCFG_I2C1_SDA_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C1_SDA_GPION) + +#endif +#endif + +/* ADC gpio */ +#ifdef BSP_USING_ADC +#ifdef BSP_USING_ADC0 + +#define HTCFG_ADC0_IPN ADC0 + +#define _HTCFG_ADC0CH0_GPIOX A +#define _HTCFG_ADC0CH0_AFION 0 + +#define _HTCFG_ADC0CH1_GPIOX A +#define _HTCFG_ADC0CH1_AFION 1 + +#define _HTCFG_ADC0CH2_GPIOX A +#define _HTCFG_ADC0CH2_AFION 2 + +#define _HTCFG_ADC0CH3_GPIOX A +#define _HTCFG_ADC0CH3_AFION 3 + +#define _HTCFG_ADC0CH4_GPIOX A +#define _HTCFG_ADC0CH4_AFION 4 + +#define _HTCFG_ADC0CH5_GPIOX A +#define _HTCFG_ADC0CH5_AFION 5 + +#define _HTCFG_ADC0CH6_GPIOX A +#define _HTCFG_ADC0CH6_AFION 6 + +#define _HTCFG_ADC0CH7_GPIOX A +#define _HTCFG_ADC0CH7_AFION 7 + +#define _HTCFG_ADC0CH8_GPIOX C +#define _HTCFG_ADC0CH8_AFION 4 + +#define _HTCFG_ADC0CH9_GPIOX C +#define _HTCFG_ADC0CH9_AFION 5 + +#define _HTCFG_ADC0CH10_GPIOX C +#define _HTCFG_ADC0CH10_AFION 8 + +#define _HTCFG_ADC0CH11_GPIOX C +#define _HTCFG_ADC0CH11_AFION 9 + +#define _HTCFG_ADC0CH12_GPIOX C +#define _HTCFG_ADC0CH12_AFION 1 + +#define _HTCFG_ADC0CH13_GPIOX C +#define _HTCFG_ADC0CH13_AFION 1 + +#define _HTCFG_ADC0CH14_GPIOX C +#define _HTCFG_ADC0CH14_AFION 1 + +#define _HTCFG_ADC0CH15_GPIOX C +#define _HTCFG_ADC0CH15_AFION 1 + +#define HTCFG_ADC0CH0_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH0_GPIOX) +#define HTCFG_ADC0CH1_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH1_GPIOX) +#define HTCFG_ADC0CH2_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH2_GPIOX) +#define HTCFG_ADC0CH3_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH3_GPIOX) +#define HTCFG_ADC0CH4_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH4_GPIOX) +#define HTCFG_ADC0CH5_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH5_GPIOX) +#define HTCFG_ADC0CH6_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH6_GPIOX) +#define HTCFG_ADC0CH7_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH7_GPIOX) +#define HTCFG_ADC0CH8_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH8_GPIOX) +#define HTCFG_ADC0CH9_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH9_GPIOX) +#define HTCFG_ADC0CH10_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH10_GPIOX) +#define HTCFG_ADC0CH11_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH11_GPIOX) +#define HTCFG_ADC0CH12_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH12_GPIOX) +#define HTCFG_ADC0CH13_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH13_GPIOX) +#define HTCFG_ADC0CH14_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH14_GPIOX) +#define HTCFG_ADC0CH15_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH15_GPIOX) + +#define HTCFG_ADC0CH0_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH0_AFION) +#define HTCFG_ADC0CH1_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH1_AFION) +#define HTCFG_ADC0CH2_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH2_AFION) +#define HTCFG_ADC0CH3_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH3_AFION) +#define HTCFG_ADC0CH4_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH4_AFION) +#define HTCFG_ADC0CH5_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH5_AFION) +#define HTCFG_ADC0CH6_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH6_AFION) +#define HTCFG_ADC0CH7_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH7_AFION) +#define HTCFG_ADC0CH8_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH8_AFION) +#define HTCFG_ADC0CH9_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH9_AFION) +#define HTCFG_ADC0CH10_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH10_AFION) +#define HTCFG_ADC0CH11_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH11_AFION) +#define HTCFG_ADC0CH12_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH12_AFION) +#define HTCFG_ADC0CH13_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH13_AFION) +#define HTCFG_ADC0CH14_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH14_AFION) +#define HTCFG_ADC0CH15_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH15_AFION) + +#endif +#ifdef BSP_USING_ADC1 + +#define HTCFG_ADC1_IPN ADC1 + +#define _HTCFG_ADC1CH0_GPIOX B +#define _HTCFG_ADC1CH0_AFION 8 + +#define _HTCFG_ADC1CH1_GPIOX A +#define _HTCFG_ADC1CH1_AFION 0 + +#define _HTCFG_ADC1CH2_GPIOX A +#define _HTCFG_ADC1CH2_AFION 1 + +#define _HTCFG_ADC1CH3_GPIOX A +#define _HTCFG_ADC1CH3_AFION 2 + +#define _HTCFG_ADC1CH4_GPIOX A +#define _HTCFG_ADC1CH4_AFION 3 + +#define _HTCFG_ADC1CH5_GPIOX A +#define _HTCFG_ADC1CH5_AFION 4 + +#define _HTCFG_ADC1CH6_GPIOX A +#define _HTCFG_ADC1CH6_AFION 5 + +#define _HTCFG_ADC1CH7_GPIOX A +#define _HTCFG_ADC1CH7_AFION 6 + +#define HTCFG_ADC1CH0_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH0_GPIOX) +#define HTCFG_ADC1CH1_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH1_GPIOX) +#define HTCFG_ADC1CH2_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH2_GPIOX) +#define HTCFG_ADC1CH3_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH3_GPIOX) +#define HTCFG_ADC1CH4_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH4_GPIOX) +#define HTCFG_ADC1CH5_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH5_GPIOX) +#define HTCFG_ADC1CH6_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH6_GPIOX) +#define HTCFG_ADC1CH7_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH7_GPIOX) + +#define HTCFG_ADC1CH0_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH0_AFION) +#define HTCFG_ADC1CH1_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH1_AFION) +#define HTCFG_ADC1CH2_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH2_AFION) +#define HTCFG_ADC1CH3_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH3_AFION) +#define HTCFG_ADC1CH4_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH4_AFION) +#define HTCFG_ADC1CH5_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH5_AFION) +#define HTCFG_ADC1CH6_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH6_AFION) +#define HTCFG_ADC1CH7_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH7_AFION) + +#endif +#endif +/* CAN gpio */ +#ifdef BSP_USING_CAN +#define HTCFG_CAN_IPN CAN0 + +#define _HTCFG_CAN_TX_GPIOX C +#define _HTCFG_CAN_TX_GPION 6 + +#define _HTCFG_CAN_RX_GPIOX C +#define _HTCFG_CAN_RX_GPION 7 + +#define HTCFG_CAN_TX_GPIO_CLK STRCAT2(P, _HTCFG_CAN_TX_GPIOX) +#define HTCFG_CAN_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_CAN_TX_GPIOX) +#define HTCFG_CAN_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_CAN_TX_GPION) + +#define HTCFG_CAN_RX_GPIO_CLK STRCAT2(P, _HTCFG_CAN_RX_GPIOX) +#define HTCFG_CAN_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_CAN_RX_GPIOX) +#define HTCFG_CAN_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_CAN_RX_GPION) +#endif + +void ht32_usart_gpio_init(void *instance); +void ht32_spi_gpio_init(void *instance); +void ht32_hardware_i2c_gpio_init(void *instance); +void ht32_adc_gpio_init(void *instance,int8_t channel); +void ht32_can_gpio_init(void *instance); + +#ifdef __cplusplus +} +#endif + +#endif /* __HT32_MSP_H__ */ diff --git a/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_01_usbdconf.h b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_01_usbdconf.h new file mode 100644 index 0000000000..d1ef029d1b --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_01_usbdconf.h @@ -0,0 +1,453 @@ +/*********************************************************************************************************//** + * @file IP/Example/ht32f5xxxx_01_usbdconf.h + * @version $Rev:: 2390 $ + * @date $Date:: 2017-12-21 #$ + * @brief The configuration file of USB Device Driver. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +// <<< Use Configuration Wizard in Context Menu >>> + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32F5XXXX_01_USBDCONF_H +#define __HT32F5XXXX_01_USBDCONF_H + +// Enter Low Power mode when Suspended +#define USBDCORE_ENABLE_LOW_POWER (0) +// + +#if (USBDCORE_ENABLE_LOW_POWER == 1) + #define USBDCore_LowPower() PWRCU_DeepSleep1(PWRCU_SLEEP_ENTRY_WFE) +#else + #define USBDCore_LowPower(...) +#endif + +/*----------------------------------------------------------------------------------------------------------*/ +/* USB Interrupt Enable */ +/*----------------------------------------------------------------------------------------------------------*/ +// USB Interrupt Setting (UIER) +// USB Global Interrupt Enable (UGIE) (Default) +// Start Of Frame Interrupt Enable (SOFIE) +// USB Reset Interrupt Enable (URSTIE) (Default) +// Resume Interrupt Enable (RSMIE) (Default) +// Suspend Interrupt Enable (SUSPIE) (Default) +// Expected Start of Frame Interrupt Enable (ESOFE) +// Control Endpoint Interrupt Enable (EP0IE) (Default) +// Endpoint1 Interrupt Enable (EP1IE) +// Endpoint2 Interrupt Enable (EP2IE) +// Endpoint3 Interrupt Enable (EP3IE) +// Endpoint4 Interrupt Enable (EP4IE) +// Endpoint5 Interrupt Enable (EP5IE) +// Endpoint6 Interrupt Enable (EP6IE) +// Endpoint7 Interrupt Enable (EP7IE) +#define _UIER (0xFF1D) +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint0 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Control Endpoint0 Configuration +// Endpoint Buffer Length (EPLEN) +// <8=> 8 bytes +// <16=> 16 bytes +// <32=> 32 bytes +// <64=> 64 bytes + /* Maximum: 64 Bytes */ +#define _EP0LEN (64) + + +// Control Endpoint0 Interrupt Enable Settings (EP0IER) +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) (Default) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) (Default) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +// SETUP Token Packet Received Interrupt Enable (STRXIE) +// SETUP Data Packet Received Interrupt Enable (SDRXIE) (Default) +// SETUP Data Error Interrupt Enable (SDERIE) +// Zero Length Data Packet Received Interrupt Enable (ZLRXIE) +#define _EP0_IER (0x212) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint1 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint1 Configuration +#define _EP1_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP1_CFG_EPADR (1) + +// Endpoint Enable (EPEN) +#define _EP1_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP1_TYPR (2) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP1_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP1LEN_TMP (64) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP1_IER (0x12) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint2 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint2 Configuration +#define _EP2_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP2_CFG_EPADR (2) + +// Endpoint Enable (EPEN) +#define _EP2_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP2_TYPR (2) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP2_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP2LEN_TMP (64) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP2_IER (0x012) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint3 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint3 Configuration +#define _EP3_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP3_CFG_EPADR (3) + +// Endpoint Enable (EPEN) +#define _EP3_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP3_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP3_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP3LEN_TMP (64) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP3_IER (0x12) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint4 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint4 Configuration +#define _EP4_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP4_CFG_EPADR (4) + +// Endpoint Enable (EPEN) +#define _EP4_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP4_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP4_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP4LEN_TMP (64) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP4_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP4_IER (0x12) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint5 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint5 Configuration +#define _EP5_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP5_CFG_EPADR (5) + +// Endpoint Enable (EPEN) +#define _EP5_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP5_TYPR (1) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP5_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP5LEN_TMP (64) + + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP5_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP5_IER (0x12) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint6 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint6 Configuration +#define _EP6_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP6_CFG_EPADR (6) + +// Endpoint Enable (EPEN) +#define _EP6_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP6_TYPR (1) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP6_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP6LEN_TMP (64) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP6_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP6_IER (0x12) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint7 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint7 Configuration +#define _EP7_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP7_CFG_EPADR (7) + +// Endpoint Enable (EPEN) +#define _EP7_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP7_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP7_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP7LEN_TMP (64) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP7_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP7_IER (0x12) +// +// + +#endif diff --git a/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_02_usbdconf.h b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_02_usbdconf.h new file mode 100644 index 0000000000..272e8cd127 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_02_usbdconf.h @@ -0,0 +1,569 @@ +/*********************************************************************************************************//** + * @file IP/Example/ht32f5xxxx_02_usbdconf.h + * @version $Rev:: 5656 $ + * @date $Date:: 2021-11-24 #$ + * @brief The configuration file of USB Device Driver. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +// <<< Use Configuration Wizard in Context Menu >>> + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32F5XXXX_02_USBDCONF_H +#define __HT32F5XXXX_02_USBDCONF_H + +// Enter Low Power mode when Suspended +#define USBDCORE_ENABLE_LOW_POWER (0) +// + +#if (USBDCORE_ENABLE_LOW_POWER == 1) + #define USBDCore_LowPower() PWRCU_DeepSleep1(PWRCU_SLEEP_ENTRY_WFE) +#else + #define USBDCore_LowPower(...) +#endif + +/*----------------------------------------------------------------------------------------------------------*/ +/* USB Interrupt Enable */ +/*----------------------------------------------------------------------------------------------------------*/ +// USB Interrupt Setting (UIER) +// USB Global Interrupt Enable (UGIE) (Default) +// Start Of Frame Interrupt Enable (SOFIE) +// USB Reset Interrupt Enable (URSTIE) (Default) +// Resume Interrupt Enable (RSMIE) (Default) +// Suspend Interrupt Enable (SUSPIE) (Default) +// Expected Start of Frame Interrupt Enable (ESOFE) +// Control Endpoint Interrupt Enable (EP0IE) (Default) +// Endpoint1 Interrupt Enable (EP1IE) +// Endpoint2 Interrupt Enable (EP2IE) +// Endpoint3 Interrupt Enable (EP3IE) +// Endpoint4 Interrupt Enable (EP4IE) +// Endpoint5 Interrupt Enable (EP5IE) +// Endpoint6 Interrupt Enable (EP6IE) +// Endpoint7 Interrupt Enable (EP7IE) +// Endpoint8 Interrupt Enable (EP8IE) +// Endpoint9 Interrupt Enable (EP9IE) +#define _UIER (0x011D) +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint0 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Control Endpoint0 Configuration +// Endpoint Buffer Length (EPLEN) +// <8=> 8 bytes +// <16=> 16 bytes +// <32=> 32 bytes +// <64=> 64 bytes + /* Maximum: 64 Bytes */ +#define _EP0LEN (64) + + +// Control Endpoint0 Interrupt Enable Settings (EP0IER) +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) (Default) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) (Default) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +// SETUP Token Packet Received Interrupt Enable (STRXIE) +// SETUP Data Packet Received Interrupt Enable (SDRXIE) (Default) +// SETUP Data Error Interrupt Enable (SDERIE) +// Zero Length Data Packet Received Interrupt Enable (ZLRXIE) +#define _EP0_IER (0x212) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint1 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint1 Configuration +#define _EP1_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP1_CFG_EPADR (1) + +// Endpoint Enable (EPEN) +#define _EP1_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP1_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP1_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP1LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP1_IER (0x10) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint2 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint2 Configuration +#define _EP2_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP2_CFG_EPADR (2) + +// Endpoint Enable (EPEN) +#define _EP2_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP2_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP2_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP2LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP2_IER (0x002) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint3 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint3 Configuration +#define _EP3_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP3_CFG_EPADR (3) + +// Endpoint Enable (EPEN) +#define _EP3_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP3_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP3_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP3LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP3_IER (0x10) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint4 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint4 Configuration +#define _EP4_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP4_CFG_EPADR (4) + +// Endpoint Enable (EPEN) +#define _EP4_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP4_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP4_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP4LEN_TMP (8) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP4_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP4_IER (0x02) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint5 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint5 Configuration +#define _EP5_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP5_CFG_EPADR (5) + +// Endpoint Enable (EPEN) +#define _EP5_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP5_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP5_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP5LEN_TMP (8) + + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP5_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP5_IER (0x10) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint6 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint6 Configuration +#define _EP6_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP6_CFG_EPADR (6) + +// Endpoint Enable (EPEN) +#define _EP6_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP6_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP6_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP6LEN_TMP (8) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP6_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP6_IER (0x02) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint7 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint7 Configuration +#define _EP7_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP7_CFG_EPADR (7) + +// Endpoint Enable (EPEN) +#define _EP7_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP7_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP7_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP7LEN_TMP (8) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP7_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP7_IER (0x10) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint8 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint8 Configuration +#define _EP8_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP8_CFG_EPADR (8) + +// Endpoint Enable (EPEN) +#define _EP8_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP8_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP8_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP8LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP8_IER (0x10) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint9 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint9 Configuration +#define _EP9_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP9_CFG_EPADR (9) + +// Endpoint Enable (EPEN) +#define _EP9_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP9_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP9_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP9LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP9_IER (0x10) +// +// + +#endif diff --git a/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_conf.h b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_conf.h new file mode 100644 index 0000000000..c78b9bb75d --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_conf.h @@ -0,0 +1,556 @@ +/*********************************************************************************************************//** + * @file IP/Example/ht32f5xxxx_conf.h + * @version $Rev:: 7109 $ + * @date $Date:: 2023-08-10 #$ + * @brief Library configuration file. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +//-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32F5XXXX_CONF_H +#define __HT32F5XXXX_CONF_H + +/* Exported constants --------------------------------------------------------------------------------------*/ + +#define RETARGET_USB 1 +#define RETARGET_SYSLOG 2 +#define RETARGET_COM1 10 +#define RETARGET_COM2 11 +#define RETARGET_USART0 12 +#define RETARGET_USART1 13 +#define RETARGET_UART0 14 +#define RETARGET_UART1 15 +#define RETARGET_UART2 16 +#define RETARGET_UART3 17 + + +/* Retarget settings of the C standard I/O library functions (printf, scanf, getchar, ...etc.) */ +/* +// Enable Retarget +// Retarget Port +// <1=> USB Virtual COM +// <2=> Syslog +// <10=> COM1 +// <11=> COM2 +// <12=> USART0 +// <13=> USART1 +// <14=> UART0 +// <15=> UART1 +// <16=> UART2 +// <17=> UART3 +// Enable Auto Return +// Auto Return function adds "\r" before "\n" automatically when print message by Retarget. +*/ +#define _RETARGET 1 +#define RETARGET_PORT 10 +#define _AUTO_RETURN 0 + +#ifndef AUTO_RETURN +#if (_AUTO_RETURN == 1) +#define AUTO_RETURN +#endif +#endif + +/* Enable Interrupt Mode for UxART Retarget +// Retarget COM/UxART Setting +// UxART Baudrate +// Enable Interrupt Mode for UxART Tx Retarget +// Define UxARTn_IRQHandler By Retarget (ht32_serial.c) +// Disable (RETARGET_DEFINE_HANDLER = 0) if application already have UxARTn_IRQHandler. +// RETARGET_UART_IRQHandler() shall be called by UxARTn_IRQHandler when disable. +// Tx Buffer Length (in byte) +// +*/ +#define RETARGET_UxART_BAUDRATE 115200 +#define RETARGET_INT_MODE 0 +#define RETARGET_DEFINE_HANDLER 1 +#define RETARGET_INT_BUFFER_SIZE 64 + +#if (_RETARGET == 1) +#if (RETARGET_PORT == RETARGET_USB) + #define RETARGET_IS_USB +// Retarget USB Virtual COM Setting +// Communication (Interrupt IN) +// <1=> Endpoint 1 +// <2=> Endpoint 2 +// <3=> Endpoint 3 +// <4=> Endpoint 4 +// <5=> Endpoint 5 +// <6=> Endpoint 6 +// <7=> Endpoint 7 +// Data Rx (Bulk OUT) +// <1=> Endpoint 1 +// <2=> Endpoint 2 +// <3=> Endpoint 3 +// <4=> Endpoint 4 +// <5=> Endpoint 5 +// <6=> Endpoint 6 +// <7=> Endpoint 7 +// Data Tx (Bulk IN) +// <1=> Endpoint 1 +// <2=> Endpoint 2 +// <3=> Endpoint 3 +// <4=> Endpoint 4 +// <5=> Endpoint 5 +// <6=> Endpoint 6 +// <7=> Endpoint 7 +// Communication Endpoint Buffer Length (in byte) <4-64:4> +// Data Rx Endpoint Buffer Length (in byte) <4-64:4> +// Data Tx Endpoint Buffer Length (in byte) <4-64:4> +// Rx Buffer Length (in byte) <64-1024:4> +// Tx Buffer Length (in byte) <1-63:1> +// Please use "SERIAL_Flush()" to sent out the buffer data immediately when Tx Buffer Length > 1. +// USB Tx Mode (BULK IN) +// <0=> Block Mode (Wait until both USB and terminal software are ready) +// <1=> Non-Block Mode (Drop data if USB or terminal software is not ready) +// Enable HSI Auto Trim By USB Function +// Need turn on if the USB clock source is from HSI (PLL USBPLL clock Source). + #define RETARGET_CTRL_EPT (5) + #define RETARGET_RX_EPT (6) + #define RETARGET_TX_EPT (7) + #define RETARGET_CTRL_EPTLEN (8) + #define RETARGET_RX_EPTLEN (64) + #define RETARGET_TX_EPTLEN (64) + #define RETARGET_BUFFER_SIZE (64) + #define RETARGET_TXBUFFER_SIZE (1) // Use "SERIAL_Flush()" to sent out the buffer data immediately when Tx Buffer Length > 1. + #define RETARGET_USB_MODE (0) + #define RETARGET_HSI_ATM (1) +// +#elif (RETARGET_PORT == RETARGET_COM1) + #define RETARGET_COM_PORT COM1 + #define RETARGET_USART_PORT COM1_PORT + #define RETARGET_UART_IRQn COM1_IRQn + #define RETARGET_UART_IRQHandler COM1_IRQHandler + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_COM2) + #define RETARGET_COM_PORT COM2 + #define RETARGET_USART_PORT COM2_PORT + #define RETARGET_UART_IRQn COM2_IRQn + #define RETARGET_UART_IRQHandler COM2_IRQHandler + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_USART0) + #define RETARGET_UxART_IPN USART0 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_USART1) + #define RETARGET_UxART_IPN USART1 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_UART0) + #define RETARGET_UxART_IPN UART0 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_UART1) + #define RETARGET_UxART_IPN UART1 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_UART2) + #define RETARGET_UxART_IPN UART2 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_UART3) + #define RETARGET_UxART_IPN UART3 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#endif + extern void RETARGET_Configuration(void); +#else + #define RETARGET_Configuration(...) + #undef printf + #undef getchar + #define printf(...) + #define getchar() (0) +#endif + +#if (RETARGET_DEFINE_HANDLER == 0) +#undef RETARGET_UART_IRQHandler +#endif + +/* +// Enable HT32 Time Function +// Provide "Time_GetTick()" and "Time_Dealy()" functions. + +// Timer Selection +// <0=> BFTM0 +// <1=> BFTM1 +// <2=> SCTM0 +// <3=> SCTM1 +// <4=> SCTM2 +// <5=> SCTM3 +// <6=> PWM0 +// <7=> PWM1 +// <8=> PWM2 +// <9=> GPTM0 +// <10=> GPTM1 +// <11=> MCTM0 + +// Timer Clock Setting +// +// Timer Clock = (Core Clock) / (APB Peripheral Clock Prescaler) +// HTCFG_TIME_CLKSRC = _HTCFG_TIME_CORECLK / (2^HTCFG_TIME_PCLK_DIV) +// _HTCFG_TIME_CORECLK = LIBCFG_MAX_SPEED or HTCFG_TIME_CLK_MANUAL (selected by HTCFG_TIME_CLKSEL) + +// -- Core Clock Setting (CK_AHB) +// HTCFG_TIME_CLKSEL +// 0 = Default Maximum (LIBCFG_MAX_SPEED) +// 1 = Manual Input (HTCFG_TIME_CLK_MANUAL) +// <0=> Default Maximum (LIBCFG_MAX_SPEED) +// <1=> Manual Input (HTCFG_TIME_CLK_MANUAL) + +// -- Core Clock Manual Input (Hz) +// HTCFG_TIME_CLK_MANUAL +// Only meaningful when Core Clock Setting (HTCFG_TIME_CLKSEL) = Manual Input (1) + +// -- APB Peripheral Clock Prescaler +// HTCFG_TIME_PCLK_DIV +// <0=> /1 +// <1=> /2 +// <2=> /4 +// <3=> /8 + +// Time Tick (Hz, not applicable for BFTM) <1-1000000:100> +// Not applicable for BFTM, fixed TICKHZ to HTCFG_TIME_CLKSRC for BFTM. +*/ +#if (0) // Enable HT32 Time Function +#define HTCFG_TIME_IPSEL (0) +#define HTCFG_TIME_CLKSEL (0) // 0 = Default Maximum (LIBCFG_MAX_SPEED), 1 = Manual Input (HTCFG_TIME_CLKSRC) +#define HTCFG_TIME_CLK_MANUAL (20000000) // Only meaningful when HTCFG_TIME_CLKSEL = 1 (Manual Input) +#define HTCFG_TIME_PCLK_DIV (0) // 0 ~ 3. (/1, /2, /4, /8) +#define HTCFG_TIME_TICKHZ (1000) // Hz, not applicable for BFTM, fixed TICKHZ to HTCFG_TIME_CLKSRC for BFTM +#define HTCFG_TIME_MULTIPLE (1) // MUST be 1, 2, 4, 8. TICK = COUNT / MULTIPLE. Not applicable for BFTM. +/* + + Timer Clock = (Core Clock) / (APB Peripheral Clock Prescaler) + HTCFG_TIME_CLKSRC = (_HTCFG_TIME_CORECLK) / (2^HTCFG_TIME_PCLK_DIV) + where _HTCFG_TIME_CORECLK can be LIBCFG_MAX_SPEED or HTCFG_TIME_CLK_MANUAL (selected by HTCFG_TIME_CLKSEL) + + Tick Range: 0 ~ 2^32 / HTCFG_TIME_TICKHZ (maximum tick time) + Interrupt Time: _HTCFG_TIME_OVERFLOW_VALUE / (HTCFG_TIME_TICKHZ * HTCFG_TIME_MULTIPLE) Second + (Interrupt Time is not applicable for BFTM) + + Example: 32-bit BFTM with 48 MHz Timer Clock + HTCFG_TIME_TICKHZ = HTCFG_TIME_CLKSRC = 48000000 + Tick Range: 0 ~ 2^32 / 48000000 = 0 ~ 89.478485 Second (maximum tick time, return to 0 every 89.478485 Second) + BFTM do not use interrupt + + Example: 16-bit GPTM with 1 ms tick + HTCFG_TIME_TICKHZ = 1000 (Hz) + HTCFG_TIME_MULTIPLE = 1 (1 Timer Count = 1 Tick) + Tick Range: 0 ~ 2^32 / 1000 = 0 ~ 4294967 Second = 0 ~ 49.7 Day (maximum tick time, return to 0 every 49.7 Day) + Interrupt Time: 65536 / (1000 * 1) = 65.536 Second (Trigger interrupt every 65.536 Second) +*/ +#endif +/* +// +*/ + +/* !!! NOTICE !!! + * How to adjust the value of High Speed External oscillator (HSE)? + The default value of HSE is define by "HSE_VALUE" in "ht32fxxxxx_nn.h". + If your board uses a different HSE speed, please add a new compiler preprocessor + C define, "HSE_VALUE=n000000" ("n" represents n MHz) in the toolchain/IDE, + or edit the "HSE_VALUE" in the "ht32f5xxxx_conf.h" file (this file). +*/ +/* +// Enable User Define HSE Value +// Enable user define HSE value to overwrite default "HSE_VALUE" define in "ht32fxxxxx_nn.h". +// HSE Value (Hz) +*/ +#if (0) +#define HSE_VALUE 16000000 +#endif +/* +// +*/ + +/* +// Enable CKOUT Function +*/ +#define ENABLE_CKOUT 0 + +/* +// Enable Get CK_ADC of "CKCU_GetClocksFrequency()" +// Enable ADC0_Freq and ADC1_Freq of the "CKCU_GetClocksFrequency()" function. It required the division calculation (by C Library) and increased the code size. +*/ +#define HT32_LIB_ENABLE_GET_CK_ADC 0 + +/* The DEBUG definition to enter debug mode for library */ +/* +// Library Debug Mode +*/ +#define HT32_LIB_DEBUG 0 + + +/* Enable/disable the specific peripheral inclusion */ + +// Library Inclusion Configuration +/* ADC -----------------------------------------------------------------------------------------------------*/ +/* +// ADC Library +*/ +#define _ADC 1 + +/* AES -----------------------------------------------------------------------------------------------------*/ +/* +// AES Library +*/ +#define _AES 1 + +/* BFTM ----------------------------------------------------------------------------------------------------*/ +/* +// BFTM Library +*/ +#define _BFTM 1 + +/* CAN -----------------------------------------------------------------------------------------------------*/ +/* +// CAN Library +*/ +#define _CAN 1 + +/* Clock Control -------------------------------------------------------------------------------------------*/ +/* +// Clock Control Library +*/ +#define _CKCU 1 + +/* Comparator ----------------------------------------------------------------------------------------------*/ +/* +// Comparator Library +*/ +#define _CMP 1 + +/* CRC -----------------------------------------------------------------------------------------------------*/ +/* +// CRC Library +*/ +#define _CRC 1 + +/* DAC -----------------------------------------------------------------------------------------------------*/ +/* +// DAC Library +*/ +#define _DAC 1 + +/* DAC Dual 16-bit -----------------------------------------------------------------------------------------*/ +/* +// DAC_Dual16 Library +*/ +#define _DAC_DUAL16 1 + +/* DIV -----------------------------------------------------------------------------------------------------*/ +/* +// DIV Library +*/ +#define _DIV 1 + +/* EBI -----------------------------------------------------------------------------------------------------*/ +/* +// EBI Library +*/ +#define _EBI 1 + +/* EXTI ----------------------------------------------------------------------------------------------------*/ +/* +// EXTI Library +*/ +#define _EXTI 1 + +/* Flash ---------------------------------------------------------------------------------------------------*/ +/* +// Flash Library +*/ +#define _FLASH 1 + +/* GPIO ----------------------------------------------------------------------------------------------------*/ +/* +// GPIO Library +*/ +#define _GPIO 1 + +/* GPTM ----------------------------------------------------------------------------------------------------*/ +/* +// GPTM Library +*/ +#define _GPTM 1 + +/* I2C -----------------------------------------------------------------------------------------------------*/ +/* +// I2C Library +*/ +#define _I2C 1 + +/* I2S -----------------------------------------------------------------------------------------------------*/ +/* +// I2S Library +*/ +#define _I2S 1 + +/* LCD -----------------------------------------------------------------------------------------------------*/ +/* +// LCD Library +*/ +#define _LCD 1 + +/* LEDC ----------------------------------------------------------------------------------------------------*/ +/* +// LEDC Library +*/ +#define _LEDC 1 + +/* MCTM ----------------------------------------------------------------------------------------------------*/ +/* +// MCTM Library +*/ +#define _MCTM 1 + +/* MIDI ----------------------------------------------------------------------------------------------------*/ +/* +// MIDI Library +*/ +#define _MIDI 1 + +/* OPA -----------------------------------------------------------------------------------------------------*/ +/* +// OPA +*/ +#define _OPA 1 + +/* PDMA ----------------------------------------------------------------------------------------------------*/ +/* +// PDMA Library +*/ +#define _PDMA 1 + +/* PWM -----------------------------------------------------------------------------------------------------*/ +/* +// PWM Library +*/ +#define _PWM 1 + +/* PWRCU ---------------------------------------------------------------------------------------------------*/ +/* +// PWRCU Library +*/ +#define _PWRCU 1 + +/* RSTCU ---------------------------------------------------------------------------------------------------*/ +/* +// RSTCU Library +*/ +#define _RSTCU 1 + +/* RTC -----------------------------------------------------------------------------------------------------*/ +/* +// RTC Library +*/ +#define _RTC 1 + +/* SCI -----------------------------------------------------------------------------------------------------*/ +/* +// SCI Library +*/ +#define _SCI 1 + +/* SCTM ----------------------------------------------------------------------------------------------------*/ +/* +// SCTM Library +*/ +#define _SCTM 1 + +/* SLED ----------------------------------------------------------------------------------------------------*/ +/* +// SLED Library +*/ +#define _SLED 1 + +/* SPI -----------------------------------------------------------------------------------------------------*/ +/* +// SPI Library +*/ +#define _SPI 1 + +/* TKEY ----------------------------------------------------------------------------------------------------*/ +/* +// TKEY Library +*/ +#define _TKEY 1 + +/* USART ---------------------------------------------------------------------------------------------------*/ +/* +// USART/UART Library +*/ +#define _USART 1 + +/* USBD ----------------------------------------------------------------------------------------------------*/ +/* +// USB Library +*/ +#define _USB 1 + +/* WDT -----------------------------------------------------------------------------------------------------*/ +/* +// WDT Library +*/ +#define _WDT 1 + +/* Misc ----------------------------------------------------------------------------------------------------*/ +/* +// Misc Library +*/ +#define _MISC 1 + +/* Serial --------------------------------------------------------------------------------------------------*/ +/* +// Serial Library +*/ +#define _SERIAL 1 + +/* Software DIV --------------------------------------------------------------------------------------------*/ +/* +// Software Divider Library +*/ +#define _SWDIV 1 + +/* Software Random Number ----------------------------------------------------------------------------------*/ +/* +// Software Random Number Library +*/ +#define _SWRAND 1 + + +// + +#endif diff --git a/bsp/ht32/ht32f53252/board/linker_scripts/link.icf b/bsp/ht32/ht32f53252/board/linker_scripts/link.icf new file mode 100644 index 0000000000..65c2bfc8b7 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +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 RAM_region { readwrite, last block CSTACK}; \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/board/linker_scripts/link.lds b/bsp/ht32/ht32f53252/board/linker_scripts/link.lds new file mode 100644 index 0000000000..27269dd77e --- /dev/null +++ b/bsp/ht32/ht32f53252/board/linker_scripts/link.lds @@ -0,0 +1,156 @@ +/* + * linker script for AT32 with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 96k /* 96K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .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 = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* 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/ht32/ht32f53252/board/linker_scripts/link.sct b/bsp/ht32/ht32f53252/board/linker_scripts/link.sct new file mode 100644 index 0000000000..ece577cb3e --- /dev/null +++ b/bsp/ht32/ht32f53252/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x00000000 0x0001FE00 { ; load region size_region + ER_IROM1 0x00000000 0x0001FE00 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00004000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/ht32/ht32f53252/board/src/board.c b/bsp/ht32/ht32f53252/board/src/board.c new file mode 100644 index 0000000000..e0160468e9 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/src/board.c @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#include "board.h" + +/* This feature will initialize the HT32 chip clock */ +void rt_hw_board_clock_init(void) +{ + +} diff --git a/bsp/ht32/ht32f53252/board/src/ht32_msp.c b/bsp/ht32/ht32f53252/board/src/ht32_msp.c new file mode 100644 index 0000000000..6d57bd4d4b --- /dev/null +++ b/bsp/ht32/ht32f53252/board/src/ht32_msp.c @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#include "ht32_msp.h" + +/* GPIO configuration for UART */ +#ifdef BSP_USING_UART +void ht32_usart_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; + HT_USART_TypeDef *usart_x = (HT_USART_TypeDef *)instance; +#ifdef BSP_USING_USART0 + if (HT_USART0 == usart_x) + { + CKCUClock.Bit.HTCFG_USART0_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_USART0_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Turn on UxART Rx internal pull up resistor to prevent unknow state */ + GPIO_PullResistorConfig(HTCFG_USART0_RX_GPIO_PORT, HTCFG_USART0_RX_GPIO_PIN, GPIO_PR_UP); + /* Config AFIO mode as UxART function */ + AFIO_GPxConfig(HTCFG_USART0_TX_GPIO_ID, HTCFG_USART0_TX_GPIO_PIN, AFIO_FUN_USART_UART); + AFIO_GPxConfig(HTCFG_USART0_RX_GPIO_ID, HTCFG_USART0_RX_GPIO_PIN, AFIO_FUN_USART_UART); + } +#endif +#ifdef BSP_USING_USART1 + if (HT_USART1 == usart_x) + { + CKCUClock.Bit.HTCFG_USART1_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_USART1_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Turn on UxART Rx internal pull up resistor to prevent unknow state */ + GPIO_PullResistorConfig(HTCFG_USART1_RX_GPIO_PORT, HTCFG_USART1_RX_GPIO_PIN, GPIO_PR_UP); + /* Config AFIO mode as UxART function */ + AFIO_GPxConfig(HTCFG_USART1_TX_GPIO_ID, HTCFG_USART1_TX_GPIO_PIN, AFIO_FUN_USART_UART); + AFIO_GPxConfig(HTCFG_USART1_RX_GPIO_ID, HTCFG_USART1_RX_GPIO_PIN, AFIO_FUN_USART_UART); + } +#endif +#ifdef BSP_USING_UART0 + if (HT_UART0 == usart_x) + { + CKCUClock.Bit.HTCFG_UART0_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_UART0_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Turn on UxART Rx internal pull up resistor to prevent unknow state */ + GPIO_PullResistorConfig(HTCFG_UART0_RX_GPIO_PORT, HTCFG_UART0_RX_GPIO_PIN, GPIO_PR_UP); + /* Config AFIO mode as UxART function */ + AFIO_GPxConfig(HTCFG_UART0_TX_GPIO_ID, HTCFG_UART0_TX_GPIO_PIN, AFIO_FUN_USART_UART); + AFIO_GPxConfig(HTCFG_UART0_RX_GPIO_ID, HTCFG_UART0_RX_GPIO_PIN, AFIO_FUN_USART_UART); + } +#endif +#ifdef BSP_USING_UART1 + if (HT_UART1 == usart_x) + { + CKCUClock.Bit.HTCFG_UART1_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_UART1_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Turn on UxART Rx internal pull up resistor to prevent unknow state */ + GPIO_PullResistorConfig(HTCFG_UART1_RX_GPIO_PORT, HTCFG_UART1_RX_GPIO_PIN, GPIO_PR_UP); + /* Config AFIO mode as UxART function */ + AFIO_GPxConfig(HTCFG_UART1_TX_GPIO_ID, HTCFG_UART1_TX_GPIO_PIN, AFIO_FUN_USART_UART); + AFIO_GPxConfig(HTCFG_UART1_RX_GPIO_ID, HTCFG_UART1_RX_GPIO_PIN, AFIO_FUN_USART_UART); + } +#endif +} +#endif + +/* GPIO configuration for SPI */ +#ifdef BSP_USING_SPI +void ht32_spi_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; + HT_SPI_TypeDef *spi_x = (HT_SPI_TypeDef *)instance; +#ifdef BSP_USING_SPI0 + if (HT_SPI0 == spi_x) + { + CKCUClock.Bit.HTCFG_SPI0_SCK_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SPI0_MISO_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SPI0_MOSI_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + AFIO_GPxConfig(HTCFG_SPI0_SCK_GPIO_ID, HTCFG_SPI0_SCK_GPIO_PIN, AFIO_FUN_SPI); + AFIO_GPxConfig(HTCFG_SPI0_MISO_GPIO_ID, HTCFG_SPI0_MISO_GPIO_PIN, AFIO_FUN_SPI); + AFIO_GPxConfig(HTCFG_SPI0_MOSI_GPIO_ID, HTCFG_SPI0_MOSI_GPIO_PIN, AFIO_FUN_SPI); + } +#endif +#ifdef BSP_USING_SPI1 + if (HT_SPI1 == spi_x) + { + CKCUClock.Bit.HTCFG_SPI1_SCK_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SPI1_MISO_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SPI1_MOSI_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + AFIO_GPxConfig(HTCFG_SPI1_SCK_GPIO_ID, HTCFG_SPI1_SCK_GPIO_PIN, AFIO_FUN_SPI); + AFIO_GPxConfig(HTCFG_SPI1_MISO_GPIO_ID, HTCFG_SPI1_MISO_GPIO_PIN, AFIO_FUN_SPI); + AFIO_GPxConfig(HTCFG_SPI1_MOSI_GPIO_ID, HTCFG_SPI1_MOSI_GPIO_PIN, AFIO_FUN_SPI); + } +#endif +} +#endif + +/* GPIO configuration for I2C */ +#ifdef BSP_USING_I2C_HW +void ht32_hardware_i2c_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; + HT_I2C_TypeDef *i2c_x = (HT_I2C_TypeDef *)instance; +#ifdef BSP_USING_I2C0_HW + if (HT_I2C0 == i2c_x) + { + CKCUClock.Bit.HTCFG_I2C0_SCL_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_I2C0_SDA_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Configure GPIO to I2C mode */ + AFIO_GPxConfig(HTCFG_I2C0_SCL_GPIO_ID, HTCFG_I2C0_SCL_GPIO_PIN, AFIO_FUN_I2C); + AFIO_GPxConfig(HTCFG_I2C0_SDA_GPIO_ID, HTCFG_I2C0_SDA_GPIO_PIN, AFIO_FUN_I2C); + } +#endif +#ifdef BSP_USING_I2C1_HW + if (HT_I2C1 == i2c_x) + { + CKCUClock.Bit.HTCFG_I2C1_SCL_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_I2C1_SDA_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Configure GPIO to I2C mode */ + AFIO_GPxConfig(HTCFG_I2C1_SCL_GPIO_ID, HTCFG_I2C1_SCL_GPIO_PIN, AFIO_FUN_I2C); + AFIO_GPxConfig(HTCFG_I2C1_SDA_GPIO_ID, HTCFG_I2C1_SDA_GPIO_PIN, AFIO_FUN_I2C); + } +#endif +} +#endif + +/* GPIO configuration for ADC */ +#ifdef BSP_USING_ADC +void ht32_adc_gpio_init(void *instance,int8_t channel) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + HT_ADC_TypeDef *adc_x = (HT_ADC_TypeDef *)instance; +#ifdef BSP_USING_ADC0 + if (HT_ADC0 == adc_x) + { + /* Enable peripheral clock */ + CKCUClock.Bit.AFIO = 1; + CKCUClock.Bit.ADC0 = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + /* Configure AFIO mode as ADC function */ + switch(channel) + { + case 0: + AFIO_GPxConfig(HTCFG_ADC0CH0_GPIO_ID, HTCFG_ADC0CH0_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 1: + AFIO_GPxConfig(HTCFG_ADC0CH1_GPIO_ID, HTCFG_ADC0CH1_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 2: + AFIO_GPxConfig(HTCFG_ADC0CH2_GPIO_ID, HTCFG_ADC0CH2_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 3: + AFIO_GPxConfig(HTCFG_ADC0CH3_GPIO_ID, HTCFG_ADC0CH3_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 4: + AFIO_GPxConfig(HTCFG_ADC0CH4_GPIO_ID, HTCFG_ADC0CH4_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 5: + AFIO_GPxConfig(HTCFG_ADC0CH5_GPIO_ID, HTCFG_ADC0CH5_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 6: + AFIO_GPxConfig(HTCFG_ADC0CH6_GPIO_ID, HTCFG_ADC0CH6_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 7: + AFIO_GPxConfig(HTCFG_ADC0CH7_GPIO_ID, HTCFG_ADC0CH7_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 8: + AFIO_GPxConfig(HTCFG_ADC0CH8_GPIO_ID, HTCFG_ADC0CH8_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 9: + AFIO_GPxConfig(HTCFG_ADC0CH9_GPIO_ID, HTCFG_ADC0CH9_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 10: + AFIO_GPxConfig(HTCFG_ADC0CH10_GPIO_ID, HTCFG_ADC0CH10_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 11: + AFIO_GPxConfig(HTCFG_ADC0CH11_GPIO_ID, HTCFG_ADC0CH11_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 12: + AFIO_GPxConfig(HTCFG_ADC0CH12_GPIO_ID, HTCFG_ADC0CH12_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 13: + AFIO_GPxConfig(HTCFG_ADC0CH13_GPIO_ID, HTCFG_ADC0CH13_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 14: + AFIO_GPxConfig(HTCFG_ADC0CH14_GPIO_ID, HTCFG_ADC0CH14_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 15: + AFIO_GPxConfig(HTCFG_ADC0CH15_GPIO_ID, HTCFG_ADC0CH15_AFIO_PIN, AFIO_FUN_ADC0); + break; + default: + break; + } + } +#endif +#ifdef BSP_USING_ADC1 + if (HT_ADC1 == adc_x) + { + /* Enable peripheral clock */ + CKCUClock.Bit.AFIO = 1; + CKCUClock.Bit.ADC1 = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + /* Configure AFIO mode as ADC function */ + switch(channel) + { + case 0: + AFIO_GPxConfig(HTCFG_ADC1CH0_GPIO_ID, HTCFG_ADC1CH0_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 1: + AFIO_GPxConfig(HTCFG_ADC1CH1_GPIO_ID, HTCFG_ADC1CH1_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 2: + AFIO_GPxConfig(HTCFG_ADC1CH2_GPIO_ID, HTCFG_ADC1CH2_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 3: + AFIO_GPxConfig(HTCFG_ADC1CH3_GPIO_ID, HTCFG_ADC1CH3_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 4: + AFIO_GPxConfig(HTCFG_ADC1CH4_GPIO_ID, HTCFG_ADC1CH4_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 5: + AFIO_GPxConfig(HTCFG_ADC1CH5_GPIO_ID, HTCFG_ADC1CH5_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 6: + AFIO_GPxConfig(HTCFG_ADC1CH6_GPIO_ID, HTCFG_ADC1CH6_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 7: + AFIO_GPxConfig(HTCFG_ADC1CH7_GPIO_ID, HTCFG_ADC1CH7_AFIO_PIN, AFIO_FUN_ADC0); + break; + default: + break; + } + } +#endif +} +#endif +/* GPIO configuration for ADC */ +#ifdef BSP_USING_CAN +void ht32_can_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + HT_CAN_TypeDef *can_x = (HT_CAN_TypeDef *)instance; + + if (HT_CAN0 == can_x) + { + CKCUClock.Bit.HTCFG_CAN_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_CAN_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Configure GPIO to CAN mode */ + AFIO_GPxConfig(HTCFG_CAN_TX_GPIO_ID, HTCFG_CAN_TX_GPIO_PIN, AFIO_FUN_CAN); + AFIO_GPxConfig(HTCFG_CAN_RX_GPIO_ID, HTCFG_CAN_RX_GPIO_PIN, AFIO_FUN_CAN); + } + +} +#endif + + diff --git a/bsp/ht32/ht32f53252/figures/board.jpg b/bsp/ht32/ht32f53252/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8905a38e996a27915bcd2d39c449dbf590d1bf45 GIT binary patch literal 477663 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%0DMF~2KP6oUNNey4RqgvhpL#}NacQ=Kv5PQP3 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

M((Bd+W-yW%93@Gva1&)?Yy3CgLJ#lW$`5D`r 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%0Dps)}2JpPjNbZnm2T-l|U<`DfgcCQMK% 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�KwG&fT!G$%~>8i;N++oh)xR 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 R0hOA8$Zja1ZTCOl{V&2DH)a3; literal 0 HcmV?d00001 diff --git a/bsp/ht32/ht32f53252/project.uvoptx b/bsp/ht32/ht32f53252/project.uvoptx new file mode 100644 index 0000000000..454293cb52 --- /dev/null +++ b/bsp/ht32/ht32f53252/project.uvoptx @@ -0,0 +1,1203 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 2 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN2 -FF0HT32F -FS00 -FL0100000 -FF1HT32F_OPT -FS11FF00000 -FL11000 -FP0($$Device:HT32F53252$ARM\Flash\HT32F.FLM) -FP1($$Device:HT32F53252$ARM\Flash\HT32F_OPT.FLM)) + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S8 -C0 -P00 -TO18 -TC10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN2 -FF0HT32F -FS00 -FL01FC00 -FF1HT32F_OPT -FS11FF00000 -FL1400 + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + Applications + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 22 + 1 + 0 + 0 + 0 + board\src\board.c + board.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + board\src\ht32_msp.c + ht32_msp.c + 0 + 0 + + + 4 + 24 + 2 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\ARM\startup_ht32f5xxxx_15.s + startup_ht32f5xxxx_15.s + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\libraries\ht32_drivers\drv_common.c + drv_common.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\libraries\ht32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\libraries\ht32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + klibc + 0 + 0 + 0 + 0 + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 53 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 8 + 55 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + context_rvds.S + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + cpuport.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 9 + 57 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_gpio.c + ht32f5xxxx_gpio.c + 0 + 0 + + + 9 + 58 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + ht32_cm0plus_misc.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ledc.c + ht32f5xxxx_ledc.c + 0 + 0 + + + 9 + 60 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c + ht32f5xxxx_tm.c + 0 + 0 + + + 9 + 61 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c + ht32f5xxxx_wdt.c + 0 + 0 + + + 9 + 62 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_bftm.c + ht32f5xxxx_bftm.c + 0 + 0 + + + 9 + 63 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + ht32f5xxxx_usart.c + 0 + 0 + + + 9 + 64 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + ht32f5xxxx_flash.c + 0 + 0 + + + 9 + 65 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + ht32f5xxxx_ebi.c + 0 + 0 + + + 9 + 66 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c + ht32f5xxxx_ckcu.c + 0 + 0 + + + 9 + 67 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_div.c + ht32f5xxxx_div.c + 0 + 0 + + + 9 + 68 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c + ht32f5xxxx_pwrcu.c + 0 + 0 + + + 9 + 69 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c + ht32f5xxxx_i2c.c + 0 + 0 + + + 9 + 70 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + ht32f5xxxx_cmp.c + 0 + 0 + + + 9 + 71 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c + ht32f5xxxx_pdma.c + 0 + 0 + + + 9 + 72 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_can.c + ht32f5xxxx_can.c + 0 + 0 + + + 9 + 73 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_crc.c + ht32f5xxxx_crc.c + 0 + 0 + + + 9 + 74 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c + ht32f5xxxx_rtc.c + 0 + 0 + + + 9 + 75 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c + ht32f5xxxx_mctm.c + 0 + 0 + + + 9 + 76 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + ht32f5xxxx_adc.c + 0 + 0 + + + 9 + 77 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_15.c + system_ht32f5xxxx_15.c + 0 + 0 + + + 9 + 78 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c + ht32f5xxxx_exti.c + 0 + 0 + + + 9 + 79 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + ht32f5xxxx_rstcu.c + 0 + 0 + + + 9 + 80 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c + ht32f5xxxx_spi.c + 0 + 0 + + + + diff --git a/bsp/ht32/ht32f53252/project.uvprojx b/bsp/ht32/ht32f53252/project.uvprojx new file mode 100644 index 0000000000..4f6e9268d3 --- /dev/null +++ b/bsp/ht32/ht32f53252/project.uvprojx @@ -0,0 +1,2234 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060422::V5.06 update 4 (build 422)::ARMCC + + + HT32F53252 + Holtek + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack + IRAM(0x20000000-0x20003FFF) IROM(0x00000000-0x0001FBFF) CLOCK(8000000) CPUTYPE("Cortex-M0+") + + "STARTUP\Holtek\HT32F5xxxx\startup_ht32f53242_52.s" ("Holtek HT32F5xxxx Startup Code") + UL2CM3(-O142 -S0 -C0 -FO7 -FD20000000 -FC800 -FN2 -FF0HT32F -FS00 -FL01FC00 -FF1HT32F_OPT -FS11FF00000 -FL1400) + 0 + HT32F5xxxx_01.h + + + + + + + + + + SFD\Holtek\HT32F5xxxx\HT32F53242_52.SFR + 0 + 0 + + + + Holtek\HT32F5xxxx\ + Holtek\HT32F5xxxx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + + TARMCM1.DLL + -pCM0+ + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 1 + 0x0 + 0x1fc00 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x1fc00 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --gnu + __CLK_TCK=RT_TICK_PER_SECOND, USE_HT32_DRIVER, RT_USING_ARMLIBC, __STDC_LIMIT_MACROS, USE_HT32F53252_SK, USE_HT32F53242_52, USE_MEM_HT32F53252, __RTTHREAD__, RT_USING_LIBC + + ..\..\..\components\libc\posix\io\epoll;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\HT32_STD_5xxxx_FWLib\library\CMSIS\Include;..\..\..\components\drivers\phy;..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Include;..\..\..\components\drivers\include;.;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\libc\compilers\common\include;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\finsh;board\inc;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\libcpu\arm\common;..\libraries\ht32_drivers;applications;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\smp_call;..\..\..\components\drivers\include;..\libraries\usbd_library\inc;..\..\..\components\libc\compilers\common\extension;..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\inc;..\..\..\include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + USE_HT32_CHIP=28 + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\..\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\..\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\..\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_pin.c + 1 + ..\..\..\components\drivers\pin\dev_pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_serial.c + 1 + ..\..\..\components\drivers\serial\dev_serial.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board\src\board.c + + + ht32_msp.c + 1 + board\src\ht32_msp.c + + + startup_ht32f5xxxx_15.s + 2 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\ARM\startup_ht32f5xxxx_15.s + + + drv_common.c + 1 + ..\libraries\ht32_drivers\drv_common.c + + + drv_gpio.c + 1 + ..\libraries\ht32_drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\ht32_drivers\drv_usart.c + + + + + Finsh + + + msh_parse.c + 1 + ..\..\..\components\finsh\msh_parse.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\..\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\..\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\..\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\..\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + memheap.c + 1 + ..\..\..\src\memheap.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\..\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\..\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\..\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\..\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + kstring.c + 1 + ..\..\..\src\klibc\kstring.c + + + kstdio.c + 1 + ..\..\..\src\klibc\kstdio.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + + + libcpu + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + + + Libraries + + + ht32f5xxxx_gpio.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_gpio.c + + + ht32_cm0plus_misc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + + + ht32f5xxxx_ledc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ledc.c + + + ht32f5xxxx_tm.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c + + + ht32f5xxxx_wdt.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c + + + ht32f5xxxx_bftm.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_bftm.c + + + ht32f5xxxx_usart.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + + + ht32f5xxxx_flash.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + + + ht32f5xxxx_ebi.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + + + ht32f5xxxx_ckcu.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c + + + ht32f5xxxx_div.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_div.c + + + ht32f5xxxx_pwrcu.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c + + + ht32f5xxxx_i2c.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c + + + ht32f5xxxx_cmp.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + + + ht32f5xxxx_pdma.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c + + + ht32f5xxxx_can.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_can.c + + + ht32f5xxxx_crc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_crc.c + + + ht32f5xxxx_rtc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c + + + ht32f5xxxx_mctm.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c + + + ht32f5xxxx_adc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + + + system_ht32f5xxxx_15.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_15.c + + + ht32f5xxxx_exti.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c + + + ht32f5xxxx_rstcu.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + + + ht32f5xxxx_spi.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c + + + + + + + + + + + + + +
diff --git a/bsp/ht32/ht32f53252/rtconfig.h b/bsp/ht32/ht32f53252/rtconfig.h new file mode 100644 index 0000000000..54fac2e6db --- /dev/null +++ b/bsp/ht32/ht32f53252/rtconfig.h @@ -0,0 +1,394 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 8 +#define RT_CPUS_NR 1 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 512 + +/* kservice options */ + +/* end of kservice options */ + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_MEMHEAP +#define RT_MEMHEAP_FAST_MODE +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "usart1" +#define RT_VER_NUM 0x50200 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M0 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 1024 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 1024 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 32 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ +#define SOC_FAMILY_HT32 +#define SOC_SERIES_HT32F5 + +/* Hardware Drivers Config */ + +/* Chip Configuration */ + +#define SOC_KERNEL +#define CORTEX_M0 +#define SOC_HT32F53252 +/* end of Chip Configuration */ + +/* Onboard Peripheral Drivers */ + +/* end of Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_USART1 +#define BSP_USING_USART1_NAME "usart1" +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/bsp/ht32/ht32f53252/rtconfig.py b/bsp/ht32/ht32f53252/rtconfig.py new file mode 100644 index 0000000000..6f853dccc2 --- /dev/null +++ b/bsp/ht32/ht32f53252/rtconfig.py @@ -0,0 +1,152 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m0' +CROSS_TOOL='keil' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' +# EXEC_PATH = r'D:\keil5\keil_v532\UV4' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m0 -mthumb -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + CFLAGS += ' -D USE_HT32F53242_52' + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M0 ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M0' + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M0' + AFLAGS += ' --fpu None' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +def dist_handle(BSP_ROOT, dist_dir): + import sys + cwd_path = os.getcwd() + sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools')) + from sdk_dist import dist_do_building + dist_do_building(BSP_ROOT, dist_dir) + diff --git a/bsp/ht32/ht32f53252/template.uvoptx b/bsp/ht32/ht32f53252/template.uvoptx new file mode 100644 index 0000000000..dd685d044b --- /dev/null +++ b/bsp/ht32/ht32f53252/template.uvoptx @@ -0,0 +1,179 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 2 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN2 -FF0HT32F -FS00 -FL0100000 -FF1HT32F_OPT -FS11FF00000 -FL11000 -FP0($$Device:HT32F53252$ARM\Flash\HT32F.FLM) -FP1($$Device:HT32F53252$ARM\Flash\HT32F_OPT.FLM)) + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S8 -C0 -P00 -TO18 -TC10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN2 -FF0HT32F -FS00 -FL01FC00 -FF1HT32F_OPT -FS11FF00000 -FL1400 + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/ht32/ht32f53252/template.uvprojx b/bsp/ht32/ht32f53252/template.uvprojx new file mode 100644 index 0000000000..f799045dfb --- /dev/null +++ b/bsp/ht32/ht32f53252/template.uvprojx @@ -0,0 +1,391 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + + + HT32F53252 + Holtek + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack + IRAM(0x20000000-0x20003FFF) IROM(0x00000000-0x0001FBFF) CLOCK(8000000) CPUTYPE("Cortex-M0+") + + "STARTUP\Holtek\HT32F5xxxx\startup_ht32f53242_52.s" ("Holtek HT32F5xxxx Startup Code") + UL2CM3(-O142 -S0 -C0 -FO7 -FD20000000 -FC800 -FN2 -FF0HT32F -FS00 -FL01FC00 -FF1HT32F_OPT -FS11FF00000 -FL1400) + 0 + HT32F5xxxx_01.h + + + + + + + + + + SFD\Holtek\HT32F5xxxx\HT32F53242_52.SFR + 0 + 0 + + + + Holtek\HT32F5xxxx\ + Holtek\HT32F5xxxx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + + TARMCM1.DLL + -pCM0+ + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 1 + 0x0 + 0x1fc00 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x1fc00 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --gnu + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + USE_HT32_CHIP=28 + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
diff --git a/bsp/ht32/libraries/.ignore_format.yml b/bsp/ht32/libraries/.ignore_format.yml index 65b2f1a156..265fe03243 100644 --- a/bsp/ht32/libraries/.ignore_format.yml +++ b/bsp/ht32/libraries/.ignore_format.yml @@ -5,3 +5,4 @@ dir_path: - HT32_STD_1xxxx_FWLib - HT32_STD_5xxxx_FWLib +- usbd_library \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/Release_Notes.txt b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/Release_Notes.txt index 20ad57f3fc..322af83bff 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/Release_Notes.txt +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/Release_Notes.txt @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file Release_Notes.txt - * @version V1.4.1 - * @date 2023-10-31 + * @version V1.5.1 + * @date 2023-11-08 * @brief The Release notes of HT32 Firmware Library. ************************************************************************************************************* * @attention @@ -34,6 +34,83 @@ // HT32F12365, HT32F12366 // HT32F22366 +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_1xxxx_FWLib_V1.5.1_3190 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-11-08 + + Main Changes + + Add new examples: + - "Tips/Checksum_CRC16" + - "Tips/StackOnTop" + + Add HT32 Stack Usage Analysis feature. + - Modify "ht32f1xxxx_conf.h", add "HTCFG_STACK_USAGE_ANALYSIS" setting for enabling HT32 Stack Usage + Analysis. + - Update project templates and "ht32_cm3_misc.c/.h", add "StackUsageAnalysisInit()" function to + initialize stack. + - Update project files, add HT32 Stack Usage Analysis component viewer. + - Update and sync "startup_ht32f1xxxx_nn.s" for the "Stack On Top" and "Stack Usage Analysis" feature." + - Add "USE_LIBCFG_RAM_SIZE" define in Keil project files for the "Stack On Top" feature. + + Rename WDT parameters. + - Old Name | New Name + - --------------------------------- | ---------------------------- + - "MODE0_WDTSHLT_BOTH" | "WDT_SLEEP_HALT_NONE" + - "MODE0_WDTSHLT_SLEEP" | "WDT_SLEEP_HALT_DEEPSLEEP" + - "MODE0_WDTSHLT_SLEEP" | "WDT_SLEEP_HALT_ALL" + + Fix "AES_SetKeyTable()" and "AES_SetVectorTable()" Key and Vector index errors, which cause incorrect AES + encryption and decryption. + + Update example, add "__ALIGN4" to variables and enforced type conversion for 4 bytes read/write API calls. + - "AES/CBC" + - "AES/CTR" + - "AES/ECB" + + Modify "ht32f5xxxx_01.h", fix the MCTM alias mismatch. + - "MCTMn_IRQHandler" alias from "MCTM0_G_IRQHandler" to "MCTM0_UP_IRQHandler" + + Update USB example, add the process of detecting USB bus status before USBDCore_LowPower(). + - "CKCU/HSI_AutoTrim_By_USB" + - "USBD/*" + + Improve the thread-safe capability of "utilities/common/ring_buffer.c". + + Modify "ht32f1xxxx_01.h" to add alignment and packing attributes for ARM compiler versions, with GCC fallback. + + Update "ht32f1xxxx_rtc.c", modify the RTC_LSECmd() related flow. + + Modify "WDT/Auto_Enable" example to change the mechanism of the example. + + Update "ht32f12366_sk.h" to share EBI_BL pin with LED3. + + Others + + Update comment, format, typing error, and coding style. + + Update project related file and setting. + + Update CKCU API. Enhanced program stability with robustness settings for parameter "PCLKPrescaler" + in "CKCU_SetPeripPrescaler(..., CKCU_APBCLKPRE_TypeDef PCLKPrescaler)". + + Modify "void FLASH_SetRemappingMode(FLASH_Vector FLASH_BOOT_x);". Changed parameter name from + "RemapMode" to "FLASH_BOOT_x". + + Update "SPI_DUALCmd()" and "SPI_SoftwareSELCmd()" make sure the SPI Bus is not busy + before changing the settings. + + Modify "ht32_dependency.h",to change the preprocessors for dependency check. + + Update the following middleware. + "utilities/middleware/eeprom_emulation.c" + "utilities/middleware/i2c_master.c" + "utilities/middleware/i2c_master.h" + "utilities/middleware/spi_module.c" + "utilities/middleware/spi_module.h" + "utilities/middleware/spi_module_config_templet.h" + "utilities/middleware/uart_module.c" + "utilities/middleware/uart_module.h" + + Update AES examples. + - Change the key, IV, and plain text from hex array to string, making the result easier to compare with + online tools. + - Add expected cipher text and compare it with the MCU's H/W AES result as an error-proofing mechanism." + + Update the following readme file. + - "CKCU/CKCU_HSI_AutoTrim_By_USB" + - "CKCU/CKCU_HSI_AutoTrim_By_LSE" + - "USBD/*" + + Modify "afterbuild.bat" to add logic to use ARMCC or ARMCLANG fromelf tool based on available toolchain. + + Add "_ProjectConfig.ini" in the "CKCU/HSI_AutoTrim_By_LSE" example. + + Update "project_template/Script" for improving script mechanism. + - "Script/_CreateProjectConfScript.bat" + - "Script/_CreateProjectScript.bat" + - "Script/_ht32_ic_name.ini" + + Update e-Link32 Pro/Lite Command line tool as "V1.20" ("utilities/elink32pro/eLink32pro.exe"). + + Change path of the "Holtek.HT32_DFP.latest.pack". + + /*----------------------------------------------------------------------------------------------------------*/ /* HT32_STD_1xxxx_FWLib_V1.4.1_2982 */ /*----------------------------------------------------------------------------------------------------------*/ @@ -45,9 +122,9 @@ + Modify examples below, add volatile qualifiers on some variables (in the for loop usage) to fix the Arm Compiler Version 6 optimization issue. ("u32" to "vu32", unsigned int to volatile unsigned int). - - “PWRCU/PowerDown_WAKEUPPin” - - “PWRCU/PowerDown_RTC” - - “TM/PWM” + - "PWRCU/PowerDown_WAKEUPPin" + - "PWRCU/PowerDown_RTC" + - "TM/PWM" + Modify examples below, use separate "if" statements instead of "if-else" to avoid double-entry ISR. - "PWRCU/DeepSleepMode1" - "PWRCU/DeepSleepMode2" diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/SConscript b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/SConscript index ef04fa4fa9..7e3699bd21 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/SConscript +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/SConscript @@ -2,37 +2,11 @@ import os import sys import rtconfig from building import * - -def get_source(ic_model, file_path, system_path, base_path): - source_path = [] - files_list = [] - readafter = 0 - if not os.path.isfile(file_path): - return - - with open(file_path, 'r') as file: - # content = file.read() - for line in file: - if readafter == 2 and line.find('>') != -1: - break - if readafter == 2: - files_list.append(line.strip()) - if line.find(ic_model) != -1: - readafter = 1 - if readafter == 1 and line.find('<') != -1: - readafter = 2 - for line in files_list: - if line.find('system') != -1: - source_path.append(os.path.join(system_path, line.strip())) - else: - source_path.append(os.path.join(base_path, line.strip())) - return source_path - Import('rtconfig') tools_path = os.path.normpath(os.getcwd() + '../../..' + '/tools') sys.path.append(tools_path) - +from sdk_dist import get_source source_file_path = os.path.join(os.getcwd(), 'Source_file') base_path = 'library/HT32F1xxxx_Driver/src/' diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h index f2bcf5de2a..d8500195d4 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h @@ -1,8 +1,8 @@ /***************************************************************************//** * @file ht32f1xxxx_01.h * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File - * @version $Rev:: 2914 $ - * @date $Date:: 2023-05-18 #$ + * @version $Rev:: 3097 $ + * @date $Date:: 2024-06-20 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -156,14 +156,14 @@ typedef enum IRQn #endif ADC0_IRQn = 25, /*!< ADC Interrupt */ #if !defined(USE_HT32F12364) - MCTM0BRK_IRQn = 27, /*!< MCTM0 BRK interrupt */ - MCTM0UP_IRQn = 28, /*!< MCTM0 UP interrupt */ - MCTM0TR_IRQn = 29, /*!< MCTM0 TR interrupt */ - MCTM0CC_IRQn = 30, /*!< MCTM0 CC interrupt */ - MCTM1BRK_IRQn = 31, /*!< MCTM1 BRK interrupt */ - MCTM1UP_IRQn = 32, /*!< MCTM1 UP interrupt */ - MCTM1TR_IRQn = 33, /*!< MCTM1 TR interrupt */ - MCTM1CC_IRQn = 34, /*!< MCTM1 CC interrupt */ + MCTM0_BRK_IRQn = 27, /*!< MCTM0 BRK interrupt */ + MCTM0_UP_IRQn = 28, /*!< MCTM0 UP interrupt */ + MCTM0_TR_IRQn = 29, /*!< MCTM0 TR interrupt */ + MCTM0_CC_IRQn = 30, /*!< MCTM0 CC interrupt */ + MCTM1_BRK_IRQn = 31, /*!< MCTM1 BRK interrupt */ + MCTM1_UP_IRQn = 32, /*!< MCTM1 UP interrupt */ + MCTM1_TR_IRQn = 33, /*!< MCTM1 TR interrupt */ + MCTM1_CC_IRQn = 34, /*!< MCTM1 CC interrupt */ #endif GPTM0_IRQn = 35, /*!< General-Purpose Timer0 Interrupt */ #if !defined(USE_HT32F12364) @@ -223,10 +223,10 @@ typedef enum IRQn #endif } IRQn_Type; -#define MCTM0_IRQn MCTM0UP_IRQn -#define MCTM0_IRQHandler MCTM0UP_IRQHandler -#define MCTM1_IRQn MCTM1UP_IRQn -#define MCTM1_IRQHandler MCTM1UP_IRQHandler +#define MCTM0_IRQn MCTM0_UP_IRQn +#define MCTM0_IRQHandler MCTM0_UP_IRQHandler +#define MCTM1_IRQn MCTM1_UP_IRQn +#define MCTM1_IRQHandler MCTM1_UP_IRQHandler /** @@ -303,13 +303,18 @@ typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; #if defined (__CC_ARM) #define __ALIGN4 __align(4) +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #define __ALIGN4 __attribute__((aligned(4))) #elif defined (__ICCARM__) #define __ALIGN4 _Pragma("data_alignment = 4") #elif defined (__GNUC__) #define __ALIGN4 __attribute__((aligned(4))) #endif -#if defined (__GNUC__) +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #define __PACKED_H + #define __PACKED_F __attribute__ ((packed)) +#elif defined (__GNUC__) #define __PACKED_H #define __PACKED_F __attribute__ ((packed)) #elif defined (__ICCARM__) || (__CC_ARM) diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12345.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12345.s index f3f24a1faf..aaea73066f 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12345.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12345.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_01.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -49,13 +49,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -125,14 +136,14 @@ __Vectors DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -330,14 +341,14 @@ Default_Handler PROC EXPORT EXTI15_IRQHandler [WEAK] EXPORT COMP_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] - EXPORT MCTM0BRK_IRQHandler [WEAK] - EXPORT MCTM0UP_IRQHandler [WEAK] - EXPORT MCTM0TR_IRQHandler [WEAK] - EXPORT MCTM0CC_IRQHandler [WEAK] - EXPORT MCTM1BRK_IRQHandler [WEAK] - EXPORT MCTM1UP_IRQHandler [WEAK] - EXPORT MCTM1TR_IRQHandler [WEAK] - EXPORT MCTM1CC_IRQHandler [WEAK] + EXPORT MCTM0_BRK_IRQHandler [WEAK] + EXPORT MCTM0_UP_IRQHandler [WEAK] + EXPORT MCTM0_TR_IRQHandler [WEAK] + EXPORT MCTM0_CC_IRQHandler [WEAK] + EXPORT MCTM1_BRK_IRQHandler [WEAK] + EXPORT MCTM1_UP_IRQHandler [WEAK] + EXPORT MCTM1_TR_IRQHandler [WEAK] + EXPORT MCTM1_CC_IRQHandler [WEAK] EXPORT GPTM0_IRQHandler [WEAK] EXPORT GPTM1_IRQHandler [WEAK] EXPORT BFTM0_IRQHandler [WEAK] @@ -395,14 +406,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler @@ -442,10 +453,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -456,14 +468,22 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN ENDIF - END + END \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12364.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12364.s index a1a24ab522..dd77afac01 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12364.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12364.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_03.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -366,10 +377,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -380,11 +392,19 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12365_66.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12365_66.s index 3381f58240..0ee3a5b64d 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12365_66.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12365_66.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_01.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -49,13 +49,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -125,14 +136,14 @@ __Vectors DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -330,14 +341,14 @@ Default_Handler PROC EXPORT EXTI15_IRQHandler [WEAK] EXPORT COMP_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] - EXPORT MCTM0BRK_IRQHandler [WEAK] - EXPORT MCTM0UP_IRQHandler [WEAK] - EXPORT MCTM0TR_IRQHandler [WEAK] - EXPORT MCTM0CC_IRQHandler [WEAK] - EXPORT MCTM1BRK_IRQHandler [WEAK] - EXPORT MCTM1UP_IRQHandler [WEAK] - EXPORT MCTM1TR_IRQHandler [WEAK] - EXPORT MCTM1CC_IRQHandler [WEAK] + EXPORT MCTM0_BRK_IRQHandler [WEAK] + EXPORT MCTM0_UP_IRQHandler [WEAK] + EXPORT MCTM0_TR_IRQHandler [WEAK] + EXPORT MCTM0_CC_IRQHandler [WEAK] + EXPORT MCTM1_BRK_IRQHandler [WEAK] + EXPORT MCTM1_UP_IRQHandler [WEAK] + EXPORT MCTM1_TR_IRQHandler [WEAK] + EXPORT MCTM1_CC_IRQHandler [WEAK] EXPORT GPTM0_IRQHandler [WEAK] EXPORT GPTM1_IRQHandler [WEAK] EXPORT BFTM0_IRQHandler [WEAK] @@ -395,14 +406,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler @@ -442,10 +453,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -456,14 +468,22 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN ENDIF - END + END \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f165x.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f165x.s index 9a0fd83e61..f4c626c658 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f165x.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f165x.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_01.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -49,13 +49,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -125,14 +136,14 @@ __Vectors DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -330,14 +341,14 @@ Default_Handler PROC EXPORT EXTI15_IRQHandler [WEAK] EXPORT COMP_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] - EXPORT MCTM0BRK_IRQHandler [WEAK] - EXPORT MCTM0UP_IRQHandler [WEAK] - EXPORT MCTM0TR_IRQHandler [WEAK] - EXPORT MCTM0CC_IRQHandler [WEAK] - EXPORT MCTM1BRK_IRQHandler [WEAK] - EXPORT MCTM1UP_IRQHandler [WEAK] - EXPORT MCTM1TR_IRQHandler [WEAK] - EXPORT MCTM1CC_IRQHandler [WEAK] + EXPORT MCTM0_BRK_IRQHandler [WEAK] + EXPORT MCTM0_UP_IRQHandler [WEAK] + EXPORT MCTM0_TR_IRQHandler [WEAK] + EXPORT MCTM0_CC_IRQHandler [WEAK] + EXPORT MCTM1_BRK_IRQHandler [WEAK] + EXPORT MCTM1_UP_IRQHandler [WEAK] + EXPORT MCTM1_TR_IRQHandler [WEAK] + EXPORT MCTM1_CC_IRQHandler [WEAK] EXPORT GPTM0_IRQHandler [WEAK] EXPORT GPTM1_IRQHandler [WEAK] EXPORT BFTM0_IRQHandler [WEAK] @@ -395,14 +406,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler @@ -442,10 +453,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -456,14 +468,22 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN ENDIF - END + END \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_01.s index 481edd75d0..aa08b6c860 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_01.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_01.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -49,13 +49,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -125,14 +136,14 @@ __Vectors DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -330,14 +341,14 @@ Default_Handler PROC EXPORT EXTI15_IRQHandler [WEAK] EXPORT COMP_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] - EXPORT MCTM0BRK_IRQHandler [WEAK] - EXPORT MCTM0UP_IRQHandler [WEAK] - EXPORT MCTM0TR_IRQHandler [WEAK] - EXPORT MCTM0CC_IRQHandler [WEAK] - EXPORT MCTM1BRK_IRQHandler [WEAK] - EXPORT MCTM1UP_IRQHandler [WEAK] - EXPORT MCTM1TR_IRQHandler [WEAK] - EXPORT MCTM1CC_IRQHandler [WEAK] + EXPORT MCTM0_BRK_IRQHandler [WEAK] + EXPORT MCTM0_UP_IRQHandler [WEAK] + EXPORT MCTM0_TR_IRQHandler [WEAK] + EXPORT MCTM0_CC_IRQHandler [WEAK] + EXPORT MCTM1_BRK_IRQHandler [WEAK] + EXPORT MCTM1_UP_IRQHandler [WEAK] + EXPORT MCTM1_TR_IRQHandler [WEAK] + EXPORT MCTM1_CC_IRQHandler [WEAK] EXPORT GPTM0_IRQHandler [WEAK] EXPORT GPTM1_IRQHandler [WEAK] EXPORT BFTM0_IRQHandler [WEAK] @@ -395,14 +406,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler @@ -442,10 +453,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -456,14 +468,22 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN ENDIF - END + END \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_03.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_03.s index 323e76c6b6..41df8c40c1 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_03.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_03.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_03.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -366,10 +377,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -380,11 +392,19 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/CodeSourcery/startup_ht32f1xxxx_cs3_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/CodeSourcery/startup_ht32f1xxxx_cs3_01.s index 0e11813688..2e47e3309e 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/CodeSourcery/startup_ht32f1xxxx_cs3_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/CodeSourcery/startup_ht32f1xxxx_cs3_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_cs3_01.s -; Version : $Rev:: 1578 $ -; Date : $Date:: 2019-03-29 #$ +; Version : $Rev:: 3030 $ +; Date : $Date:: 2024-01-31 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -139,14 +139,14 @@ __cs3_interrupt_vector_cortex_m: .long COMP_IRQHandler /* 24, 40, 0x0A0, */ .long ADC_IRQHandler /* 25, 41, 0x0A4, */ .long _RESERVED /* 26, 42, 0x0A8, */ - .long MCTM0BRK_IRQHandler /* 27, 43, 0x0AC, */ - .long MCTM0UP_IRQHandler /* 28, 44, 0x0B0, */ - .long MCTM0TR_IRQHandler /* 29, 45, 0x0B4, */ - .long MCTM0CC_IRQHandler /* 30, 46, 0x0B8, */ - .long MCTM1BRK_IRQHandler /* 31, 47, 0x0BC, */ - .long MCTM1UP_IRQHandler /* 32, 48, 0x0C0, */ - .long MCTM1TR_IRQHandler /* 33, 49, 0x0C4, */ - .long MCTM1CC_IRQHandler /* 34, 50, 0x0C8, */ + .long MCTM0_BRK_IRQHandler /* 27, 43, 0x0AC, */ + .long MCTM0_UP_IRQHandler /* 28, 44, 0x0B0, */ + .long MCTM0_TR_IRQHandler /* 29, 45, 0x0B4, */ + .long MCTM0_CC_IRQHandler /* 30, 46, 0x0B8, */ + .long MCTM1_BRK_IRQHandler /* 31, 47, 0x0BC, */ + .long MCTM1_UP_IRQHandler /* 32, 48, 0x0C0, */ + .long MCTM1_TR_IRQHandler /* 33, 49, 0x0C4, */ + .long MCTM1_CC_IRQHandler /* 34, 50, 0x0C8, */ .long GPTM0_IRQHandler /* 35, 51, 0x0CC, */ .long GPTM1_IRQHandler /* 36, 52, 0x0D0, */ .long _RESERVED /* 37, 53, 0x0D4, */ @@ -384,14 +384,14 @@ Default_Handler: IRQ EXTI15_IRQHandler IRQ COMP_IRQHandler IRQ ADC_IRQHandler - IRQ MCTM0BRK_IRQHandler - IRQ MCTM0UP_IRQHandler - IRQ MCTM0TR_IRQHandler - IRQ MCTM0CC_IRQHandler - IRQ MCTM1BRK_IRQHandler - IRQ MCTM1UP_IRQHandler - IRQ MCTM1TR_IRQHandler - IRQ MCTM1CC_IRQHandler + IRQ MCTM0_BRK_IRQHandler + IRQ MCTM0_UP_IRQHandler + IRQ MCTM0_TR_IRQHandler + IRQ MCTM0_CC_IRQHandler + IRQ MCTM1_BRK_IRQHandler + IRQ MCTM1_UP_IRQHandler + IRQ MCTM1_TR_IRQHandler + IRQ MCTM1_CC_IRQHandler IRQ GPTM0_IRQHandler IRQ GPTM1_IRQHandler IRQ BFTM0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/GCC/startup_ht32f1xxxx_gcc_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/GCC/startup_ht32f1xxxx_gcc_01.s index 623ce3b725..aede8caf55 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/GCC/startup_ht32f1xxxx_gcc_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/GCC/startup_ht32f1xxxx_gcc_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_gcc_01.s -; Version : $Rev:: 1578 $ -; Date : $Date:: 2019-03-29 #$ +; Version : $Rev:: 3030 $ +; Date : $Date:: 2024-01-31 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -163,14 +163,14 @@ __interrupt_vector_cortex_m: .long COMP_IRQHandler /* 24, 40, 0x0A0, */ .long ADC_IRQHandler /* 25, 41, 0x0A4, */ .long _RESERVED /* 26, 42, 0x0A8, */ - .long MCTM0BRK_IRQHandler /* 27, 43, 0x0AC, */ - .long MCTM0UP_IRQHandler /* 28, 44, 0x0B0, */ - .long MCTM0TR_IRQHandler /* 29, 45, 0x0B4, */ - .long MCTM0CC_IRQHandler /* 30, 46, 0x0B8, */ - .long MCTM1BRK_IRQHandler /* 31, 47, 0x0BC, */ - .long MCTM1UP_IRQHandler /* 32, 48, 0x0C0, */ - .long MCTM1TR_IRQHandler /* 33, 49, 0x0C4, */ - .long MCTM1CC_IRQHandler /* 34, 50, 0x0C8, */ + .long MCTM0_BRK_IRQHandler /* 27, 43, 0x0AC, */ + .long MCTM0_UP_IRQHandler /* 28, 44, 0x0B0, */ + .long MCTM0_TR_IRQHandler /* 29, 45, 0x0B4, */ + .long MCTM0_CC_IRQHandler /* 30, 46, 0x0B8, */ + .long MCTM1_BRK_IRQHandler /* 31, 47, 0x0BC, */ + .long MCTM1_UP_IRQHandler /* 32, 48, 0x0C0, */ + .long MCTM1_TR_IRQHandler /* 33, 49, 0x0C4, */ + .long MCTM1_CC_IRQHandler /* 34, 50, 0x0C8, */ .long GPTM0_IRQHandler /* 35, 51, 0x0CC, */ .long GPTM1_IRQHandler /* 36, 52, 0x0D0, */ .long _RESERVED /* 37, 53, 0x0D4, */ @@ -442,14 +442,14 @@ Default_Handler: IRQ EXTI15_IRQHandler IRQ COMP_IRQHandler IRQ ADC_IRQHandler - IRQ MCTM0BRK_IRQHandler - IRQ MCTM0UP_IRQHandler - IRQ MCTM0TR_IRQHandler - IRQ MCTM0CC_IRQHandler - IRQ MCTM1BRK_IRQHandler - IRQ MCTM1UP_IRQHandler - IRQ MCTM1TR_IRQHandler - IRQ MCTM1CC_IRQHandler + IRQ MCTM0_BRK_IRQHandler + IRQ MCTM0_UP_IRQHandler + IRQ MCTM0_TR_IRQHandler + IRQ MCTM0_CC_IRQHandler + IRQ MCTM1_BRK_IRQHandler + IRQ MCTM1_UP_IRQHandler + IRQ MCTM1_TR_IRQHandler + IRQ MCTM1_CC_IRQHandler IRQ GPTM0_IRQHandler IRQ GPTM1_IRQHandler IRQ BFTM0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/IAR/startup_ht32f1xxxx_iar_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/IAR/startup_ht32f1xxxx_iar_01.s index 331f561dc0..1c37c2d79f 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/IAR/startup_ht32f1xxxx_iar_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/IAR/startup_ht32f1xxxx_iar_01.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_iar_01.s -; Version : $Rev:: 1774 $ -; Date : $Date:: 2019-07-25 #$ +; Version : $Rev:: 3030 $ +; Date : $Date:: 2024-01-31 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -104,14 +104,14 @@ __vector_table DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -306,14 +306,14 @@ SysTick_Handler PUBWEAK EXTI15_IRQHandler PUBWEAK COMP_IRQHandler PUBWEAK ADC_IRQHandler - PUBWEAK MCTM0BRK_IRQHandler - PUBWEAK MCTM0UP_IRQHandler - PUBWEAK MCTM0TR_IRQHandler - PUBWEAK MCTM0CC_IRQHandler - PUBWEAK MCTM1BRK_IRQHandler - PUBWEAK MCTM1UP_IRQHandler - PUBWEAK MCTM1TR_IRQHandler - PUBWEAK MCTM1CC_IRQHandler + PUBWEAK MCTM0_BRK_IRQHandler + PUBWEAK MCTM0_UP_IRQHandler + PUBWEAK MCTM0_TR_IRQHandler + PUBWEAK MCTM0_CC_IRQHandler + PUBWEAK MCTM1_BRK_IRQHandler + PUBWEAK MCTM1_UP_IRQHandler + PUBWEAK MCTM1_TR_IRQHandler + PUBWEAK MCTM1_CC_IRQHandler PUBWEAK GPTM0_IRQHandler PUBWEAK GPTM1_IRQHandler PUBWEAK BFTM0_IRQHandler @@ -372,14 +372,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/emStudio/startup_ht32f1xxxx_es_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/emStudio/startup_ht32f1xxxx_es_01.s index 5f60bca990..ed4a812438 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/emStudio/startup_ht32f1xxxx_es_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/emStudio/startup_ht32f1xxxx_es_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_es_01.s -; Version : $Rev:: 1578 $ -; Date : $Date:: 2019-03-29 #$ +; Version : $Rev:: 3030 $ +; Date : $Date:: 2024-01-31 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -109,14 +109,14 @@ _vectors: .long COMP_IRQHandler /* 24, 40, 0x0A0, */ .long ADC_IRQHandler /* 25, 41, 0x0A4, */ .long _RESERVED /* 26, 42, 0x0A8, */ - .long MCTM0BRK_IRQHandler /* 27, 43, 0x0AC, */ - .long MCTM0UP_IRQHandler /* 28, 44, 0x0B0, */ - .long MCTM0TR_IRQHandler /* 29, 45, 0x0B4, */ - .long MCTM0CC_IRQHandler /* 30, 46, 0x0B8, */ - .long MCTM1BRK_IRQHandler /* 31, 47, 0x0BC, */ - .long MCTM1UP_IRQHandler /* 32, 48, 0x0C0, */ - .long MCTM1TR_IRQHandler /* 33, 49, 0x0C4, */ - .long MCTM1CC_IRQHandler /* 34, 50, 0x0C8, */ + .long MCTM0_BRK_IRQHandler /* 27, 43, 0x0AC, */ + .long MCTM0_UP_IRQHandler /* 28, 44, 0x0B0, */ + .long MCTM0_TR_IRQHandler /* 29, 45, 0x0B4, */ + .long MCTM0_CC_IRQHandler /* 30, 46, 0x0B8, */ + .long MCTM1_BRK_IRQHandler /* 31, 47, 0x0BC, */ + .long MCTM1_UP_IRQHandler /* 32, 48, 0x0C0, */ + .long MCTM1_TR_IRQHandler /* 33, 49, 0x0C4, */ + .long MCTM1_CC_IRQHandler /* 34, 50, 0x0C8, */ .long GPTM0_IRQHandler /* 35, 51, 0x0CC, */ .long GPTM1_IRQHandler /* 36, 52, 0x0D0, */ .long _RESERVED /* 37, 53, 0x0D4, */ @@ -348,14 +348,14 @@ Default_Handler: IRQ EXTI15_IRQHandler IRQ COMP_IRQHandler IRQ ADC_IRQHandler - IRQ MCTM0BRK_IRQHandler - IRQ MCTM0UP_IRQHandler - IRQ MCTM0TR_IRQHandler - IRQ MCTM0CC_IRQHandler - IRQ MCTM1BRK_IRQHandler - IRQ MCTM1UP_IRQHandler - IRQ MCTM1TR_IRQHandler - IRQ MCTM1CC_IRQHandler + IRQ MCTM0_BRK_IRQHandler + IRQ MCTM0_UP_IRQHandler + IRQ MCTM0_TR_IRQHandler + IRQ MCTM0_CC_IRQHandler + IRQ MCTM1_BRK_IRQHandler + IRQ MCTM1_UP_IRQHandler + IRQ MCTM1_TR_IRQHandler + IRQ MCTM1_CC_IRQHandler IRQ GPTM0_IRQHandler IRQ GPTM1_IRQHandler IRQ BFTM0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_cm3_misc.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_cm3_misc.h index 2acc00f77a..66345b6f9b 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_cm3_misc.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_cm3_misc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_cm3_misc.h - * @version $Rev:: 5 $ - * @date $Date:: 2017-05-11 #$ + * @version $Rev:: 3143 $ + * @date $Date:: 2024-07-04 #$ * @brief All the function prototypes for the miscellaneous firmware library. ************************************************************************************************************* * @attention @@ -112,6 +112,11 @@ void SYSTICK_ClockSourceConfig(u32 SysTick_ClockSource); void SYSTICK_CounterCmd(u32 SysTick_Counter); void SYSTICK_IntConfig(ControlStatus NewState); void SYSTICK_SetReloadValue(u32 SysTick_Reload); +#if (HTCFG_STACK_USAGE_ANALYSIS == 1) +void StackUsageAnalysisInit(u32 addr); +#else +#define StackUsageAnalysisInit(...) +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_dependency.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_dependency.h index 46eef808e9..e33f4cbf19 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_dependency.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_dependency.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_dependency.h - * @version $Rev:: 2971 $ - * @date $Date:: 2023-10-25 #$ + * @version $Rev:: 3048 $ + * @date $Date:: 2024-02-22 #$ * @brief The header file of dependency check. ************************************************************************************************************* * @attention @@ -41,14 +41,22 @@ #if 0 // Version setting example for module /* Dependency check ----------------------------------------------------------------------------------------*/ -#if (__CORTEX_M == 0) +#if defined(__HT32L5XXXX_LIB_H) +#define MIN_HT32_FWLIB_VER (0x01000000) //0xmmnnnrrr -> Vm.n.r +#define MIN_HT32_FWLIB_SVN (0x209) +#endif +#if defined(__HT32F5XXXX_LIB_H) #define MIN_HT32_FWLIB_VER (0x01000024) //0xmmnnnrrr -> Vm.n.r #define MIN_HT32_FWLIB_SVN (0x5762) #endif -#if (__CORTEX_M == 3) +#if defined(__HT32F1XXXX_LIB_H) #define MIN_HT32_FWLIB_VER (0x01000009) //0xmmnnnrrr -> Vm.n.r #define MIN_HT32_FWLIB_SVN (0x2556) #endif +#if defined(__HT32F4XXXX_LIB_H) +#define MIN_HT32_FWLIB_VER (0x01000000) //0xmmnnnrrr -> Vm.n.r +#define MIN_HT32_FWLIB_SVN (0x336) +#endif #include "ht32_dependency.h" // Not exist means the version of HT32 Firmware Library is older than the module required. #endif @@ -62,7 +70,7 @@ #endif -// Check "ht32fxxxxx_lib.h" for the version of HT32 Firmwar Library +// Check "ht32f1xxxx_lib.h" for the version of HT32 Firmwar Library #if (HT32_FWLIB_VER != 999999) #if HT32_FWLIB_VER < MIN_HT32_FWLIB_VER #error !!! The version of HT32 Firmware Library is older than the module required. Please update HT32 Firmware Library. diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_time.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_time.h index 1fc44cdc7c..47178c1e79 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_time.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_time.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_time.h - * @version $Rev:: 2896 $ - * @date $Date:: 2023-03-04 #$ + * @version $Rev:: 3089 $ + * @date $Date:: 2024-04-02 #$ * @brief The header file of time function. ************************************************************************************************************* * @attention @@ -132,23 +132,23 @@ #define TIME_TICKDIFF(start, current) ((current >= start) ? (u32)(current - start) : (u32)(0xFFFFFFFF - start + 1 + current)) #if (HTCFG_TIME_TICKHZ < 1000000) -#define TIME_US2TICK(us) (us / (1000000UL / HTCFG_TIME_TICKHZ)) -#define TIME_TICK2US(t) (t * (1000000UL / HTCFG_TIME_TICKHZ)) +#define TIME_US2TICK(us) ((us) / (1000000UL / HTCFG_TIME_TICKHZ)) +#define TIME_TICK2US(t) ((t) * (1000000UL / HTCFG_TIME_TICKHZ)) #else -#define TIME_US2TICK(us) (us * (HTCFG_TIME_TICKHZ / 1000000UL)) -#define TIME_TICK2US(t) (t / (HTCFG_TIME_TICKHZ / 1000000UL)) +#define TIME_US2TICK(us) ((us) * (HTCFG_TIME_TICKHZ / 1000000UL)) +#define TIME_TICK2US(t) ((t) / (HTCFG_TIME_TICKHZ / 1000000UL)) #endif #if (HTCFG_TIME_TICKHZ < 1000) -#define TIME_MS2TICK(ms) (ms / (1000UL / HTCFG_TIME_TICKHZ)) -#define TIME_TICK2MS(t) (t * (1000UL / HTCFG_TIME_TICKHZ)) +#define TIME_MS2TICK(ms) ((ms) / (1000UL / HTCFG_TIME_TICKHZ)) +#define TIME_TICK2MS(t) ((t) * (1000UL / HTCFG_TIME_TICKHZ)) #else -#define TIME_MS2TICK(ms) (ms * (HTCFG_TIME_TICKHZ / 1000UL)) -#define TIME_TICK2MS(t) (t / (HTCFG_TIME_TICKHZ / 1000UL)) +#define TIME_MS2TICK(ms) ((ms) * (HTCFG_TIME_TICKHZ / 1000UL)) +#define TIME_TICK2MS(t) ((t) / (HTCFG_TIME_TICKHZ / 1000UL)) #endif -#define TIME_S2TICK(s) (s * (u32)(HTCFG_TIME_TICKHZ)) -#define TIME_TICK2S(t) (t / (HTCFG_TIME_TICKHZ)) +#define TIME_S2TICK(s) ((s) * (u32)(HTCFG_TIME_TICKHZ)) +#define TIME_TICK2S(t) ((t) / (HTCFG_TIME_TICKHZ)) #define GET_CNT() (_HTCFG_TIME_PORT->CNTR) diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h index 176bf19e72..901edaacfb 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_aes.h - * @version $Rev:: 2022 $ - * @date $Date:: 2020-02-03 #$ + * @version $Rev:: 2985 $ + * @date $Date:: 2023-12-14 #$ * @brief The header file of the ADC library. ************************************************************************************************************* * @attention @@ -159,15 +159,15 @@ typedef enum void AES_ECB_Init(HT_AES_TypeDef* HT_AESn, AES_InitTypeDef* AES_InitStruct); void AES_CBC_Init(HT_AES_TypeDef* HT_AESn, AES_InitTypeDef* AES_InitStruct); void AES_CTR_Init(HT_AES_TypeDef* HT_AESn, AES_InitTypeDef* AES_InitStruct); -void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, uc8* Key, u32 keySize); -ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, uc8 *iv, u32 length, uc8 *inputData, u8 *outputData); +void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, u32 *Key, u32 keySize); +ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, u32 *iv, u32 length, u32 *inputData, u32 *outputData); #define AES_ECB_CryptData(a, b, c, d, e) _AES_CryptData(a, b, NULL, c, d, e) #define AES_CBC_CryptData _AES_CryptData #define AES_CTR_CryptData(a, b, c, d, e) _AES_CryptData(a, AES_DIR_ENCRYPT, b, c, d, e) #if 0 -ErrStatus AES_ECB_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum mode, u32 length, uc8 *inputData, u8 *outputData); -ErrStatus AES_CBC_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum mode, uc8 *iv, u32 length, uc8 *inputData, u8 *outputData); -ErrStatus AES_CTR_CryptData(HT_AES_TypeDef* HT_AESn, uc8 *iv, u32 length, uc8 *inputData, u8 *outputData); +ErrStatus AES_ECB_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum mode, u32 length, u32 *inputData, u32 *outputData); +ErrStatus AES_CBC_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum mode, u32 *iv, u32 length, u32 *inputData, u32 *outputData); +ErrStatus AES_CTR_CryptData(HT_AES_TypeDef* HT_AESn, u32 *iv, u32 length, u32 *inputData, u32 *outputData); #endif void AES_StartKey(HT_AES_TypeDef* HT_AESn); @@ -180,7 +180,7 @@ FlagStatus AES_GetIntStatus(HT_AES_TypeDef* HT_AESn, u32 AES_INTSR_x); void AES_IntConfig(HT_AES_TypeDef* HT_AESn, u32 AES_IER_x, ControlStatus NewState); void AES_SetInputData(HT_AES_TypeDef* HT_AESn, uc32 AES_Data); u32 AES_GetOutputData(HT_AES_TypeDef* HT_AESn); -void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, uc8* Vector); +void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, u32 *Vector); void AESCore_IRQHandler(HT_AES_TypeDef* HT_AESn); /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h index cb194268c0..0371043f4b 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_flash.h - * @version $Rev:: 2971 $ - * @date $Date:: 2023-10-25 #$ + * @version $Rev:: 3145 $ + * @date $Date:: 2024-07-05 #$ * @brief The header file of the FLASH library. ************************************************************************************************************* * @attention @@ -160,7 +160,7 @@ ErrStatus FLASH_FlashHalfCycleCmd(ControlStatus NewState); #if (LIBCFG_FLASH_ZWPWESAVING) ErrStatus FLASH_FlashZwPwrSavingCmd(ControlStatus NewState); #endif -void FLASH_SetRemappingMode(FLASH_Vector RemapMode); +void FLASH_SetRemappingMode(FLASH_Vector FLASH_BOOT_x); FLASH_State FLASH_ErasePage(u32 PageAddress); FLASH_State FLASH_EraseOptionByte(void); FLASH_State FLASH_MassErase(void); diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h index f3c09ec6c0..558ac3ed74 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h @@ -34,8 +34,8 @@ #endif /* Settings ------------------------------------------------------------------------------------------------*/ -#define HT32_FWLIB_VER (0x01004001) -#define HT32_FWLIB_SVN (0x2982) +#define HT32_FWLIB_VER (0x01005001) +#define HT32_FWLIB_SVN (0x3190) #if defined(USE_HT32F1653_54) #include "ht32f1653_54_libcfg.h" diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h index f2e50b49f9..0ee2de96d5 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_rtc.h - * @version $Rev:: 2971 $ - * @date $Date:: 2023-10-25 #$ + * @version $Rev:: 3094 $ + * @date $Date:: 2024-06-19 #$ * @brief The header file of the RTC library. ************************************************************************************************************* * @attention @@ -105,7 +105,7 @@ typedef enum RTC_ROWM_LEVEL /*!< Level mode. */ } RTC_ROWM_Enum; /** - * @brief Waveform mode of RTC output + * @brief Event selection of RTC output */ typedef enum { diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h index d69c32afbf..015344e199 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_spi.h - * @version $Rev:: 2797 $ - * @date $Date:: 2022-11-28 #$ + * @version $Rev:: 3180 $ + * @date $Date:: 2024-10-15 #$ * @brief The header file of the SPI library. ************************************************************************************************************* * @attention @@ -159,14 +159,14 @@ typedef struct #define SPI_FLAG_TOUT ((u32)0x00000080) #define SPI_FLAG_BUSY ((u32)0x00000100) -#define IS_SPI_FLAG(FLAG) ((FLAG == SPI_FLAG_TXBE) || \ - (FLAG == SPI_FLAG_TXE) || \ +#define IS_SPI_FLAG(FLAG) ((FLAG == SPI_FLAG_TXBE) || \ + (FLAG == SPI_FLAG_TXE) || \ (FLAG == SPI_FLAG_RXBNE) || \ - (FLAG == SPI_FLAG_WC) || \ - (FLAG == SPI_FLAG_RO) || \ - (FLAG == SPI_FLAG_MF) || \ - (FLAG == SPI_FLAG_SA) || \ - (FLAG == SPI_FLAG_TOUT) || \ + (FLAG == SPI_FLAG_WC) || \ + (FLAG == SPI_FLAG_RO) || \ + (FLAG == SPI_FLAG_MF) || \ + (FLAG == SPI_FLAG_SA) || \ + (FLAG == SPI_FLAG_TOUT) || \ (FLAG == SPI_FLAG_BUSY)) #define IS_SPI_FLAG_CLEAR(CLEAR) ((CLEAR == SPI_FLAG_WC) || \ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h index b15bbbdbd0..d1663c7f56 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_tm.h - * @version $Rev:: 2971 $ - * @date $Date:: 2023-10-25 #$ + * @version $Rev:: 3180 $ + * @date $Date:: 2024-10-15 #$ * @brief The header file of the TM library. ************************************************************************************************************* * @attention @@ -341,11 +341,11 @@ typedef struct * @brief Used to check parameter of the output compare mode. */ #define IS_TM_OM_CMP(x) (((x) == TM_OM_MATCH_NOCHANGE) || \ - ((x) == TM_OM_MATCH_INACTIVE) || \ - ((x) == TM_OM_MATCH_ACTIVE) || \ - ((x) == TM_OM_MATCH_TOGGLE) || \ - ((x) == TM_OM_PWM1) || \ - ((x) == TM_OM_PWM2)) + ((x) == TM_OM_MATCH_INACTIVE) || \ + ((x) == TM_OM_MATCH_ACTIVE) || \ + ((x) == TM_OM_MATCH_TOGGLE) || \ + ((x) == TM_OM_PWM1) || \ + ((x) == TM_OM_PWM2)) /** * @brief Used to check parameter of the output mode. */ @@ -377,7 +377,7 @@ typedef struct /** * @brief Used to check parameter of the counter mode. */ -#define IS_TM_CNT_MODE(x) ((x == TM_CNT_MODE_UP) || \ +#define IS_TM_CNT_MODE(x) ((x == TM_CNT_MODE_UP) || \ (x == TM_CNT_MODE_CA1) || \ (x == TM_CNT_MODE_CA2) || \ (x == TM_CNT_MODE_CA3) || \ @@ -397,23 +397,23 @@ typedef struct /** * @brief Used to check parameter of the channel input selection. */ -#define IS_TM_CHCCS(x) ((x == TM_CHCCS_DIRECT) || \ - (x == TM_CHCCS_INDIRECT) || \ - (x == TM_CHCCS_TRCED)) +#define IS_TM_CHCCS(x) ((x == TM_CHCCS_DIRECT) || \ + (x == TM_CHCCS_INDIRECT) || \ + (x == TM_CHCCS_TRCED)) /** * @brief Used to check parameter of the channel capture prescaler. */ #define IS_TM_CHPSC(x) ((x == TM_CHPSC_OFF) || \ - (x == TM_CHPSC_2) || \ - (x == TM_CHPSC_4) || \ - (x == TM_CHPSC_8)) + (x == TM_CHPSC_2) || \ + (x == TM_CHPSC_4) || \ + (x == TM_CHPSC_8)) /** * @brief Used to check parameter of the ETI prescaler. */ #define IS_TM_ETIPSC(x) ((x == TM_ETIPSC_OFF) || \ - (x == TM_ETIPSC_2) || \ - (x == TM_ETIPSC_4) || \ - (x == TM_ETIPSC_8)) + (x == TM_ETIPSC_2) || \ + (x == TM_ETIPSC_4) || \ + (x == TM_ETIPSC_8)) /** * @brief Used to check parameter of the TM interrupt. */ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h index 6e0c5332b2..bc74274296 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_usart.h - * @version $Rev:: 2797 $ - * @date $Date:: 2022-11-28 #$ + * @version $Rev:: 3180 $ + * @date $Date:: 2024-10-15 #$ * @brief The header file of the USART library. ************************************************************************************************************* * @attention @@ -459,7 +459,7 @@ typedef struct #define IS_USART_PDMA_REQ(REQ) ((REQ == USART_PDMAREQ_TX) || (REQ == USART_PDMAREQ_RX)) #define IS_USART(USART) ((USART == HT_USART0) || \ - (IS_USART1(USART)) || \ + (IS_USART1(USART)) || \ (USART == HT_UART0) || \ (USART == HT_UART1)) diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h index c0a9c03951..9919223253 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_wdt.h - * @version $Rev:: 122 $ - * @date $Date:: 2017-06-13 #$ + * @version $Rev:: 3103 $ + * @date $Date:: 2024-06-24 #$ * @brief The header file of the WDT library. ************************************************************************************************************* * @attention @@ -72,14 +72,17 @@ /* WDT runs or halts in sleep and deep sleep1 mode */ /* WDT WDTSHLT mask */ -#define MODE0_WDTSHLT_BOTH ((u32)0x00000000) -#define MODE0_WDTSHLT_SLEEP ((u32)0x00004000) -#define MODE0_WDTSHLT_HALT ((u32)0x00008000) +#define WDT_SLEEP_HALT_NONE ((u32)0x00000000) +#define WDT_SLEEP_HALT_DEEPSLEEP ((u32)0x00004000) +#define WDT_SLEEP_HALT_ALL ((u32)0x00008000) -#define IS_WDT_WDTSHLT_MODE(WDT_Mode) ((WDT_Mode == MODE0_WDTSHLT_BOTH) || \ - (WDT_Mode == MODE0_WDTSHLT_SLEEP) || \ - (WDT_Mode == MODE0_WDTSHLT_HALT)) +#define MODE0_WDTSHLT_BOTH WDT_SLEEP_HALT_NONE +#define MODE0_WDTSHLT_SLEEP WDT_SLEEP_HALT_DEEPSLEEP +#define MODE0_WDTSHLT_HALT WDT_SLEEP_HALT_ALL +#define IS_WDT_WDTSHLT_MODE(WDT_Mode) ((WDT_Mode == WDT_SLEEP_HALT_NONE) || \ + (WDT_Mode == WDT_SLEEP_HALT_DEEPSLEEP) || \ + (WDT_Mode == WDT_SLEEP_HALT_ALL)) /* WDT Flag */ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32_cm3_misc.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32_cm3_misc.c index c9632a267d..401dd331ac 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32_cm3_misc.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32_cm3_misc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_cm3_misc.c - * @version $Rev:: 2437 $ - * @date $Date:: 2021-06-01 #$ + * @version $Rev:: 3162 $ + * @date $Date:: 2024-07-23 #$ * @brief This file provides all the miscellaneous firmware functions. ************************************************************************************************************* * @attention @@ -218,6 +218,99 @@ void SYSTICK_SetReloadValue(u32 SysTick_Reload) SysTick->LOAD = SysTick_Reload; } + +#if 0 +// Copy the code below to the begin of the main(). +// START + + #if (HTCFG_STACK_USAGE_ANALYSIS == 1) + /* !!! NOTICE !!! + Please update the Keil HT32 PACK and HT32 Firmware Library to the latest version to make sure the + Stack Usage Analysis function works properly. + */ + /* + Set HTCFG_STACK_USAGE_ANALYSIS as 1 in the "ht32xxxxxx_conf.h" to enable Stack Usage Analysis feature. + This feature is only applicable to the Keil MDK-ARM. Please call the "StackUsageAnalysisInit()" function + in the begin of the "main()". + The "StackUsageAnalysisInit()" parameter shall be the start address of the vector table. + Under Keil Debug mode, tick "View > Watch Window > HT32 Stack Usage Analysis" to show the stack usage + information. Those information is only valid after calling "StackUsageAnalysisInit()" function. + */ + StackUsageAnalysisInit(0x00000000); + #endif + +// END +#endif + +#if (HTCFG_STACK_USAGE_ANALYSIS == 1) +#if defined (__CC_ARM) +#define STACKLIMITADDR 0x20000010 +#define STACKSTART 0x20000014 +u32 _StackLimit __attribute__((at(STACKLIMITADDR)))= HT_SRAM_BASE + LIBCFG_RAM_SIZE; +u32 _StackStart __attribute__((at(STACKSTART)))= HT_SRAM_BASE; +/*********************************************************************************************************//** + * @brief Stack Usage Analysis Init + * @retval None + ***********************************************************************************************************/ +__ASM void StackUsageAnalysisInit(u32 addr) +{ + extern _StackLimit; + extern __HT_check_sp; + extern _StackStart; + LDR R0, [r0] + LDR R1, =_StackLimit + STR R0, [r1] + + LDR R0, =__HT_check_sp + LDR R1, =_StackStart + STR R0, [r1] + MOV R1, SP + LDR R2, =0xCDCDCDCD + LDR R3, =0xABABABAB + STR R3, [ R0 ] + B Loop_Check +Loop + STR R2, [ R0 ] +Loop_Check + ADDS R0, R0, #0x04 + CMP R0, R1 + BLT Loop + BX LR + ALIGN +} +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define STACKLIMITADDR "0x20000010" +#define STACKSTART "0x20000014" +u32 _StackLimit __attribute__((section(".ARM.__at_"STACKLIMITADDR))) = HT_SRAM_BASE + LIBCFG_RAM_SIZE; +u32 _StackStart __attribute__((section(".ARM.__at_"STACKSTART))) = HT_SRAM_BASE; +/*********************************************************************************************************//** + * @brief Stack Usage Analysis Init + * @retval None + ***********************************************************************************************************/ +__attribute__((noinline)) void StackUsageAnalysisInit(u32 addr) +{ + __ASM volatile (" LDR R0, [r0]"); + __ASM volatile (" LDR R1, =_StackLimit"); + __ASM volatile (" STR R0, [r1]"); + + __ASM volatile (" LDR R0, =__HT_check_sp"); + __ASM volatile (" LDR R1, =_StackStart"); + __ASM volatile (" STR R0, [r1]"); + __ASM volatile (" MOV R1, SP"); + __ASM volatile (" LDR R2, =0xCDCDCDCD"); + __ASM volatile (" LDR R3, =0xABABABAB"); + __ASM volatile (" STR R3, [ R0 ]"); + __ASM volatile (" B Loop_Check"); + __ASM volatile ("Loop:"); + __ASM volatile (" STR R2, [ R0 ]"); + __ASM volatile ("Loop_Check:"); + __ASM volatile (" ADDS R0, R0, #0x04"); + __ASM volatile (" CMP R0, R1"); + __ASM volatile (" BLT Loop"); + __ASM volatile (" BX LR"); +} +#endif +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c index c6e8ea2a5b..cb66365032 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_aes.c - * @version $Rev:: 2788 $ - * @date $Date:: 2022-11-24 #$ + * @version $Rev:: 3174 $ + * @date $Date:: 2024-08-27 #$ * @brief This file provides all the AES firmware functions. ************************************************************************************************************* * @attention @@ -331,7 +331,7 @@ u32 AES_GetOutputData(HT_AES_TypeDef* HT_AESn) * @param keySize: Key table's size * @retval None ************************************************************************************************************/ -void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, uc8* Key, u32 keySize) +void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, u32 *Key, u32 keySize) { u32 i; u32 uCRTemp = HT_AESn->CR & (~(0x00000060UL)); @@ -353,12 +353,12 @@ void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, uc8* Key, u32 keySize) } HT_AESn->CR = uCRTemp; - for (i = 0; i < keySize; i += 4) + for (i = 0; i < (keySize / 4); i++) { #if (LIBCFG_AES_SWAP) - HT_AESn->KEYR[i >> 2] = __REV(*(u32*)&Key[i]); + HT_AESn->KEYR[i] = __REV(*&Key[i]); #else - HT_AESn->KEYR[i >> 2] = *(u32*)&Key[i]; + HT_AESn->KEYR[i] = *&Key[i]; #endif } @@ -371,17 +371,17 @@ void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, uc8* Key, u32 keySize) * @param Vector: * @retval None ************************************************************************************************************/ -void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, uc8* Vector) +void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, u32 *Vector) { int i; Assert_Param(IS_AES(HT_AESn)); - for (i = 0; i < 16; i += 4) + for (i = 0; i < 4; i++) { #if (LIBCFG_AES_SWAP) - HT_AESn->IVR[i >> 2] = __REV(*(u32*)&Vector[i]); + HT_AESn->IVR[i] = __REV(*&Vector[i]); #else - HT_AESn->IVR[i >> 2] = *(u32*)&Vector[i]; + HT_AESn->IVR[i] = *&Vector[i]; #endif } } @@ -398,10 +398,10 @@ void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, uc8* Vector) ************************************************************************************************************/ ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, - uc8 *iv, + u32 *iv, u32 length, - uc8 *inputData, - u8 *outputData) + u32 *inputData, + u32 *outputData) { /*AES Data blocks 16 byte */ if ((length % 16) != 0) @@ -423,8 +423,8 @@ ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, HT_AESn->CR = (HT_AESn->CR & 0xFFFFFFFD) | dir; /*Create input/output data */ - gpu32InputBuff = (u32*)inputData; - gpu32OutputBuff = (u32*)outputData; + gpu32InputBuff = inputData; + gpu32OutputBuff = outputData; /*Init Index */ gu32OutputIndex = 0; @@ -451,8 +451,8 @@ ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, ErrStatus AES_ECB_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, u32 length, - uc8 *inputData, - u8 *outputData) + u32 *inputData, + u32 *outputData) { return _AES_CryptData(HT_AESn, dir, @@ -474,10 +474,10 @@ ErrStatus AES_ECB_CryptData(HT_AES_TypeDef* HT_AESn, ************************************************************************************************************/ ErrStatus AES_CBC_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, - uc8 *iv, + u32 *iv, u32 length, - uc8 *inputData, - u8 *outputData) + u32 *inputData, + u32 *outputData) { return _AES_CryptData(HT_AESn, dir, @@ -497,10 +497,10 @@ ErrStatus AES_CBC_CryptData(HT_AES_TypeDef* HT_AESn, * @retval SUCCESS or ERROR ************************************************************************************************************/ ErrStatus AES_CTR_CryptData(HT_AES_TypeDef* HT_AESn, - uc8 *iv, + u32 *iv, u32 length, - uc8 *inputData, - u8 *outputData) + u32 *inputData, + u32 *outputData) { return _AES_CryptData(HT_AESn, AES_DIR_ENCRYPT, diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c index 81e7f8f143..b29f74848e 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_ckcu.c - * @version $Rev:: 2972 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 3181 $ + * @date $Date:: 2024-10-15 #$ * @brief This file provides all the Clock Control Unit firmware functions. ************************************************************************************************************* * @attention @@ -432,9 +432,9 @@ void CKCU_SetCKREFPrescaler(CKCU_CKREFPRE_TypeDef CKREFPRE) /********************************************************************************************************//** * @brief Configure the CK_USART prescaler. * @param URPRE: specify the prescaler value. - * This parameter can be: - * @arg CKCU_URPRE_DIV1: USART clock divided by 1 - * @arg CKCU_URPRE_DIV2: USART clock divided by 2 + * This parameter can be: + * @arg CKCU_URPRE_DIV1: USART clock divided by 1 + * @arg CKCU_URPRE_DIV2: USART clock divided by 2 * @retval None ************************************************************************************************************/ void CKCU_SetUSARTPrescaler(CKCU_URPRE_TypeDef URPRE) @@ -574,28 +574,28 @@ u32 CKCU_GetPLLFrequency(void) /*********************************************************************************************************//** * @brief Configure the APB peripheral prescaler. * @param Perip: specify the APB peripheral. - * This parameter can be: - * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, - * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, - * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, - * CKCU_PCLK_MCTM0, CKCU_PCLK_MCTM1, - * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, - * CKCU_PCLK_USART0, CKCU_PCLK_USART1, - * CKCU_PCLK_UART0, CKCU_PCLK_UART1, - * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, - * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, - * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, - * CKCU_PCLK_I2S, - * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, - * CKCU_PCLK_PWM0 + * This parameter can be: + * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, + * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, + * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, + * CKCU_PCLK_MCTM0, CKCU_PCLK_MCTM1, + * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, + * CKCU_PCLK_USART0, CKCU_PCLK_USART1, + * CKCU_PCLK_UART0, CKCU_PCLK_UART1, + * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, + * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, + * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, + * CKCU_PCLK_I2S, + * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, + * CKCU_PCLK_PWM0 * @param PCLKPrescaler: specify the value of prescaler. - * This parameter can be: - * @arg CKCU_APBCLKPRE_DIV1: specific peripheral clock = PCLK / 1 (inapplicable to BKPRCLK) - * @arg CKCU_APBCLKPRE_DIV2: specific peripheral clock = PCLK / 2 (inapplicable to BKPRCLK) - * @arg CKCU_APBCLKPRE_DIV4: specific peripheral clock = PCLK / 4 - * @arg CKCU_APBCLKPRE_DIV8: specific peripheral clock = PCLK / 8 - * @arg CKCU_APBCLKPRE_DIV16: specific peripheral clock = PCLK / 16 (BKPRCLK only) - * @arg CKCU_APBCLKPRE_DIV32: specific peripheral clock = PCLK / 32 (BKPRCLK only) + * This parameter can be: + * @arg CKCU_APBCLKPRE_DIV1: specific peripheral clock = PCLK / 1 (inapplicable to BKPRCLK) + * @arg CKCU_APBCLKPRE_DIV2: specific peripheral clock = PCLK / 2 (inapplicable to BKPRCLK) + * @arg CKCU_APBCLKPRE_DIV4: specific peripheral clock = PCLK / 4 + * @arg CKCU_APBCLKPRE_DIV8: specific peripheral clock = PCLK / 8 + * @arg CKCU_APBCLKPRE_DIV16: specific peripheral clock = PCLK / 16 (BKPRCLK only) + * @arg CKCU_APBCLKPRE_DIV32: specific peripheral clock = PCLK / 32 (BKPRCLK only) * @retval None ************************************************************************************************************/ void CKCU_SetPeripPrescaler(CKCU_PeripPrescaler_TypeDef Perip, CKCU_APBCLKPRE_TypeDef PCLKPrescaler) @@ -607,28 +607,28 @@ void CKCU_SetPeripPrescaler(CKCU_PeripPrescaler_TypeDef Perip, CKCU_APBCLKPRE_Ty Prescaler -= 2; } Perip &= 0x0000001F; - CKCU_BF_WRITE(*PCSR, (3UL << Perip), Perip, Prescaler); + CKCU_BF_WRITE(*PCSR, (3UL << Perip), Perip, (Prescaler & 0x3)); } #endif /*********************************************************************************************************//** * @brief Return the operating frequency of the specific APB peripheral. * @param Perip: specify the APB peripheral. - * This parameter can be: - * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, - * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, - * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, - * CKCU_PCLK_MCTM0, CKCU_PCLK_MCTM1, - * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, - * CKCU_PCLK_USART0, CKCU_PCLK_USART1, - * CKCU_PCLK_UART0, CKCU_PCLK_UART1, - * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, - * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, - * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, - * CKCU_PCLK_I2S, - * CKCU_PCLK_I2S, - * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, - * CKCU_PCLK_PWM0 + * This parameter can be: + * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, + * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, + * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, + * CKCU_PCLK_MCTM0, CKCU_PCLK_MCTM1, + * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, + * CKCU_PCLK_USART0, CKCU_PCLK_USART1, + * CKCU_PCLK_UART0, CKCU_PCLK_UART1, + * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, + * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, + * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, + * CKCU_PCLK_I2S, + * CKCU_PCLK_I2S, + * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, + * CKCU_PCLK_PWM0 * @retval Frequency in Hz ************************************************************************************************************/ u32 CKCU_GetPeripFrequency(CKCU_PeripPrescaler_TypeDef Perip) @@ -953,10 +953,10 @@ void CKCU_PeripClockConfig(CKCU_PeripClockConfig_TypeDef Clock, ControlStatus Cm /*********************************************************************************************************//** * @brief Configure the reference clock of HSI auto-trim function. * @param CLKSRC: specify the clock source. - * This parameter can be: - * @arg CKCU_ATC_LSE: LSE is selected as reference clock - * @arg CKCU_ATC_USB: USB is selected as reference clock - * @arg CKCU_ATC_CKIN: External pin (CKIN) is selected as reference clock + * This parameter can be: + * @arg CKCU_ATC_LSE: LSE is selected as reference clock + * @arg CKCU_ATC_USB: USB is selected as reference clock + * @arg CKCU_ATC_CKIN: External pin (CKIN) is selected as reference clock * @retval None ************************************************************************************************************/ void CKCU_HSIAutoTrimClkConfig(CKCU_ATC_TypeDef CLKSRC) @@ -983,9 +983,9 @@ void CKCU_ATCInit(CKCU_ATCInitTypeDef* ATC_InitStruct) /*********************************************************************************************************//** * @brief Automatic Trimming Algorithm Mode Selection. * @param Algo: Search Algorithm. - * This parameter can be: - * @arg CKCU_ATC_BINARY_SEARCH: Auto Trimming Controller is used binary search to approach the target range - * @arg CKCU_ATC_LINEAR_SEARCH: Auto Trimming Controller is used linear search to approach the target range + * This parameter can be: + * @arg CKCU_ATC_BINARY_SEARCH: Auto Trimming Controller is used binary search to approach the target range + * @arg CKCU_ATC_LINEAR_SEARCH: Auto Trimming Controller is used linear search to approach the target range * @retval None ***********************************************************************************************************/ void CKCU_HSIAutoTrimAlgorithm(u32 Algo) @@ -996,9 +996,9 @@ void CKCU_HSIAutoTrimAlgorithm(u32 Algo) /*********************************************************************************************************//** * @brief Lock Target Range Selection. * @param Tolerance: Variation Tolerance. - * This parameter can be: - * @arg CKCU_ATC_DOUBLE_PRECISION: 0.2 % variation - * @arg CKCU_ATC_SINGLE_PRECISION: 0.1 % variation + * This parameter can be: + * @arg CKCU_ATC_DOUBLE_PRECISION: 0.2 % variation + * @arg CKCU_ATC_SINGLE_PRECISION: 0.1 % variation * @retval None ***********************************************************************************************************/ void CKCU_HSIAutoTrimFreqTolerance(u32 Tolerance) diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c index 6c8a2638a7..3c01d6a6dc 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_rtc.c - * @version $Rev:: 2233 $ - * @date $Date:: 2020-10-13 #$ + * @version $Rev:: 2984 $ + * @date $Date:: 2023-11-23 #$ * @brief This file provides all the RTC firmware functions. ************************************************************************************************************* * @attention @@ -138,12 +138,10 @@ void RTC_LSECmd(ControlStatus NewState) if (NewState == DISABLE) { BB_LSE_EN = 0; - while (HT_CKCU->GCSR & 0x10); } else { BB_LSE_EN = 1; - while ((HT_CKCU->GCSR & 0x10) == 0); } } diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c index c0e8face8c..3c3c22aa82 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_spi.c - * @version $Rev:: 2797 $ - * @date $Date:: 2022-11-28 #$ + * @version $Rev:: 3086 $ + * @date $Date:: 2024-03-28 #$ * @brief This file provides all the SPI firmware functions. ************************************************************************************************************* * @attention @@ -325,6 +325,11 @@ void SPI_SoftwareSELCmd(HT_SPI_TypeDef* SPIx, u32 SPI_SoftwareSEL) } else { + /* Inactive SEL pin needs to ensure the transmission has ended. If the program flow cannot guarantee */ + /* SPI transmission completion, you can enable the procedure below. */ + #if 0 + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + #endif SPIx->CR0 &= SPI_SEL_INACTIVE; } } @@ -560,6 +565,8 @@ void SPI_DUALCmd(HT_SPI_TypeDef* SPIx, ControlStatus NewState) Assert_Param(IS_SPI(SPIx)); Assert_Param(IS_CONTROL_STATUS(NewState)); + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + (NewState == ENABLE)?(SPIx->CR0 |= CR0_DUALEN_SET):(SPIx->CR0 &= CR0_DUALEN_RESET); } diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c index 5bd9a98e77..9e7adf1bf6 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_wdt.c - * @version $Rev:: 2797 $ - * @date $Date:: 2022-11-28 #$ + * @version $Rev:: 3103 $ + * @date $Date:: 2024-06-24 #$ * @brief This file provides all the WDT firmware functions. ************************************************************************************************************* * @attention @@ -109,9 +109,9 @@ void WDT_Cmd(ControlStatus NewState) * @brief Configure the WDT to run or halt in sleep and deep sleep1 mode. * @param WDT_Mode: * This parameter can be one of the following values: - * @arg MODE0_WDTSHLT_BOTH : WDT runs in sleep and deep sleep1 mode - * @arg MODE0_WDTSHLT_SLEEP : WDT runs in sleep mode - * @arg MODE0_WDTSHLT_HALT : WDT halts in sleep and deep sleep1 mode + * @arg WDT_SLEEP_HALT_NONE : WDT no halt + * @arg WDT_SLEEP_HALT_DEEPSLEEP : WDT halts in deep sleep1 mode + * @arg WDT_SLEEP_HALT_ALL : WDT halts in sleep and deep sleep1 mode * @retval None ************************************************************************************************************/ void WDT_HaltConfig(u32 WDT_Mode) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/Release_Notes.txt b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/Release_Notes.txt index 948233eafc..1a18dbff8d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/Release_Notes.txt +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/Release_Notes.txt @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file Release_Notes.txt - * @version V1.9.1 - * @date 2023-12-22 + * @version V1.14.3 + * @date 2024-11-29 * @brief The Release notes of HT32 Firmware Library. ************************************************************************************************************* * @attention @@ -48,20 +48,24 @@ // HT32F57331, HT32F57341 // HT32F57342, HT32F57352 // HT32F59041, HT32F59741 -// HT32F59046, HT32F59746 +// HT32F59045 +// HT32F59746 // HT32F5826, HT32F5828 // HT32F0006 // HT32F0008 // HT32F52142 // HT32F61030, HT32F61041 +// HT32F61052 // HT32F61141 // HT32F61244, HT32F61245 // HT32F61352 // HT32F61355, HT32F61356, HT32F61357 // HT32F61630, HT32F61641 +// HT32F61730, HT32F61741 // HT32F62030, HT32F62040, HT32F62050 // HT32F65230, HT32F65240 // HT32F65232 +// HT32F66242, HT32F66246 // HT32F67041, HT32F67051 // HT32F67232 // HT32F67233 @@ -71,6 +75,267 @@ // HT50F3200S, HT50F3200T // HF5032 // MXTX6306 +// MXTX52231, MXTX52352 +// NW32F61242 + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.14.3_8294 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-11-29 + Main Changes + + Add new device support. + - HT32F61052 + + Others + + Update comment, format, typing error, and coding style. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.14.2_8286 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-11-26 + Main Changes + + Add example support of HT32F65232. + + Fix "ADC/OneShot_SWTrigger/ht32f5xxxx_01_it.h" parameter error. + - Rename "ADC_IRQHandler" to "HTCFG_ADC_IRQHandler" + + Add the "DISABLE_BOOTPIN_OUTPUT" definition in "CKCU/Clock_Configuration/ht32_board_config.h" to prevent + circuit conflicts on certain development boards. + - HT32F65232_DVB + - HT32F66242_DVB + - HT32F66246_DVB + + Modify the "OPA/OPA_Enable" example to use a single OPA and add "ht32_board_config.h". + + Add the "LED_HIGH_ACTIVE" definition to the following files and Fix "ht32f5xxxx_board_01.c" to align with + the LED circuit on the development board: + - bm18b367a_dvb.h + - bm53b367a_dvb.h + - ht32f65232_dvb.h + - ht32f65240_dvb.h + - ht32f66242_dvb.h + - ht32f66246_dvb.h + + Others + + Update comment, format, typing error, and coding style. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.14.1_8273 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-11-08 + Main Changes + + Add new device support. + - HT32F66242, HT32F66246 + + Add new IP drivers. + - Programmable Gain Amplifier, "ht32f65xxx_66xxx_pga.c/h" + - Coordinate Rotation Digital Computer, "ht32f66xxx_cordic.c/h" + - Proportion Integration Differentiation driver, "ht32f66xxx_pid.c/h" + + Add new examples: + - "CORDIC/CosSin_Interrupt" + - "CORDIC/CosSin_Polling" + - "PGA/Comparator" + - "PGA/Inverting" + - "PGA/InvertingAdder" + - "PGA/NonInverting" + - "PGA/NonInvertingAdder" + - "PGA/VoltageFollower" + - "PID/ChangePara_inSameMode" + - "PID/Interrupt" + - "PID/MultiMode" + - "PID/Polling" + + Add the "LIBCFG_CKCU_NO_LPCR" definition in "ht32f65230_40_libcfg.h" and "ht32f65232_libcfg.h" to + fix the "CKCU_BKISOCmd" the redundant flow of the HT32F65230/65240 and HT32F65232 (related to the Low Power Control). + + Add the "LIBCFG_PWRCU_NO_DS2_MODE" definition in "ht32f65230_40_libcfg.h" and "ht32f65232_libcfg.h" to + fix the "PWRCU_DeepSleep2()" and "PWRCU_GetDMOSStatus()" the redundant flow + of the HT32F65230/65240 and HT32F65232 (related to the Deep-Sleep2 Mode). + + Remove the "LIBCFG_PWRCU_NO_PORF" definition in "ht32f65232_libcfg.h" to fix the "PWRCU_DeInit()" + missing flow of the HT32F65232 (related to the Power-On Reset Flag). + + Change the HTCFG_TIMER_PRESCALER value according to HTCFG_PULSE_SYS_CLK is less + than or greater than 60 MHz to ensure that the Counter-Reload value is less than 0xFFFF. + - "TM/UpdateEvent" + - "TM/SinglePulseMode" + - "TM/TriggerCounter" + + Others + + Update comment, format, typing error, and coding style. + + Change define "LIBCFG_CMP_65x_VER" to "LIBCFG_CMP_65x_66x_VER" for the HT32F65xxx and HT32F66xxx series ICs. + + Add "IS_ADC_TRIG_CMP2()" macro, for use to confirm the adc trigger is CMP2 in ht32f65xxx_66xxx_adc.h + + Fix the bit position error in the "IS_ADC_INT" macro. + + Change define "LIBCFG_TM_652XX_V1" to "LIBCFG_TM_65X_66X_V1" + + Change define "LIBCFG_TM_65232" to "LIBCFG_TM_65X_66X_BK_FROM_CMP" and "LIBCFG_TM_65X_66X_RECCDI" + + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.13.2_8218 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-10-23 + Main Changes + + Fix "CAN_Legacy/TxRxLoopback" example compiling error. + + Others + + Update comment, format, typing error, and coding style. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.13.1_8190 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-09-24 + Main Changes + + Add new device support. + - NW32F61242 + + Change the CAN IP Driver, switch to the latest designed API. + + Add new examples. + "CAN/Recv_DATA" + "CAN/Recv_Interrupt" + "CAN/Recv_Mask_Filter" + "CAN/Recv_REMOTE" + "CAN/Send_DATA" + "CAN/Send_Recv_DATA" + "CAN/Send_REMOTE" + + Fix "AES_SetKeyTable()" and "AES_SetVectorTable()" Key and Vector index errors, which cause incorrect AES + encryption and decryption. + + Modify "I2C/7_bit_mode" example, fix pin assignment error of HT32F50343. + + Others + + Update comment, format, typing error, and coding style. + + Update AES examples. + - Change the key, IV, and plain text from hex array to string, making the result easier to compare with + online tools. + - Add expected cipher text and compare it with the MCU's H/W AES result as an error-proofing mechanism. + + Remove device support. + - HT32F57541, HT32F57552 + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.12.1_7949 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-08-08 + Main Changes + + Add new device support. + - HT32F57541 + - HT32F57552 + + Update "uart_module.c" to fix the UART0 ~ UART3 not work issue of BM53A367A. + + Others + + Update comment, format, typing error, and coding style. + + Change path of the "Holtek.HT32_DFP.latest.pack". + + Minor changes were made to the USBD "HID_Keyboard_Virtual_COM" and "Virtual_COM" examples. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.11.1_7908 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-07-26 + Main Changes + + Add new device support. + - HT32F59045 + - MXTX52231, MXTX52352 + + Remove device support. + - HT32F59046 + + Rename WDT parameters. + - Old Name | New Name + - --------------------------------- | ---------------------------- + - "MODE0_WDTSHLT_BOTH" | "WDT_SLEEP_HALT_NONE" + - "MODE0_WDTSHLT_SLEEP" | "WDT_SLEEP_HALT_DEEPSLEEP" + - "MODE0_WDTSHLT_SLEEP" | "WDT_SLEEP_HALT_ALL" + + Update below files to support the BMduino shield/module Keil Driver. + - Modify :"utilities/bmduino_board.h". + - Add :"utilities/bmduino_check.h". + + Modify "void StackUsageAnalysisInit(void)". Added parameter "u32 addr" and reimplemented as + "void StackUsageAnalysisInit(u32 addr);" + + Fix the below examples ADC_IRQHandler define error of HT32F65232 and HT32F65240. + - "ADC/AnalogWatchdog" + - "ADC/Continuous_Potentiometer" + - "ADC/Discontinuous_EXTITrigger" + - "ADC/OneShot_PWMTrigger" + - "ADC/OneShot_PWMTrigger_with_Delay" + - "ADC/OneShot_SWTrigger" + + Modify example IO define of HT32F65232. + - "ADC/AnalogWatchdog" + - "ADC/Continuous_Potentiometer" + - "ADC/Discontinuous_EXTITrigger" + - "ADC/OneShot_PWMTrigger" + - "ADC/OneShot_PWMTrigger_with_Delay" + - "ADC/OneShot_SWTrigger" + - "ADC/OneShot_TMTrigger_PDMA" + + Others + + Update comment, format, typing error, and coding style. + + Update ht32f5xxxx_01.h. + - Modify the preprocessor define of "__ALIGN4", "__PACKED_H", "__PACKED_F" for old Arm Compiler V6. + + Modify "void FLASH_SetRemappingMode(FLASH_Vector FLASH_BOOT_x);". Changed parameter name from + "RemapMode" to "FLASH_BOOT_x". + + Modify comments to remind users about "Stack Usage Analysis" notification. + + Remove redefined "PWRRST_SET" setting in "ht32f5xxxx_pwrcu.c". + + Update CKCU API. Enhanced program stability with robustness settings for parameter "PCLKPrescaler" + in "CKCU_SetPeripPrescaler(..., CKCU_APBCLKPRE_TypeDef PCLKPrescaler)". + + Update I2C Master middleware, improve setting way and fix minor errors. + + Update the following middleware to support the BMduino Keil Driver. + "utilities/middleware/i2c_master.c" + "utilities/middleware/i2c_master.h" + "utilities/middleware/spi_module.c" + "utilities/middleware/spi_module.h" + "utilities/middleware/uart_module.c" + "utilities/middleware/uart_module.h" + + Update xxTM IP Driver + - Remove redundant "TM_ClearOREFConfig()" function. + + Update "DAC_Cmd()" of "ht32f5xxxx_dac.c", remove compiler warning of the GNU compiler. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.10.1_7761 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-06-11 + Main Changes + + Add new device support. + - HT32F61730, HT32F61741 + + Add new examples. + "ADC/BandgapVoltage" + "GPIO/SinkCurrentEnhanced" + + Update related files of HT32F59046. + + Fix the "USE_HT32_CHIP" ID error of HT32F52244 (change from 33 to 35). + + Remove "LIBCFG_GPIO_SINK_CURRENT_ENHANCED" setting error for the following part number. + HT32F50431/50441 + HT32F50442/50452 + HT32F53231/53241 + HT32F53242/53252 + HT32F54231/54241 + HT32F54243/54253 + + Change the ADC API, "ADC_VREFOutputCmd()" as "ADC_VREFOutputADVREFPCmd()". + + Change the CKCU API, "CKCU_Set_HSIReadyCounter" as "CKCU_SetHSIReadyCounter()". + + Add "LIBCFG_GPIO_SINK_CURRENT_ENHANCED" setting of HT32F50020/50030. + + Improve the thread-safe capability of "utilities/common/ring_buffer.c". + + Others + + Update comment, format, typing error, and coding style. + + Update the project file of HT32F61141, change the "ht32f5xxxx_01_usbdconf.h" as ht32f5xxxx_02_usbdconf.h". + + Update "SPI_DUALCmd()", "QSPI_QuadCmd()", and "QSPI_DirectionConfig()", make sure the SPI Bus is not busy + before changing the settings. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.9.2_7624 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-02-29 + Main Changes + + Add new examples. + "Tips/Checksum_CRC16" + "Tips/StackOnTop" + "USART/LIN_Master" + "USART/LIN_Slave" + "CAN/TxRxLoopback" + + Add "LIBCFG_CMP_IVREF_CN_IN" define of the following parts, to fix the comparator function/feature + missing (select VREF as inverted input). + - HT32F50442/50452/53242/53252. + + Add HT32 Stack Usage Analysis feature. + - Modify "ht32f5xxxx_conf.h", add "HTCFG_STACK_USAGE_ANALYSIS" setting for enabling HT32 Stack Usage + Analysis. + - Update project templates and "ht32_cm0plus_misc.c/.h", add "StackUsageAnalysisInit()" function to + initialize stack. + - Update project files, add HT32 Stack Usage Analysis component viewer. + + Update and sync "startup_ht32f5xxxx_nn.s" for the "Stack On Top" and "Stack Usage Analysis" feature. + + Add "USE_LIBCFG_RAM_SIZE" define in Keil project files for the "Stack On Top" feature. + + Modify "ht32f5xxxx_01.h", fix the MCTM alias mismatch. + - "MCTMn_IRQHandler" alias from "MCTM0_G_IRQHandler" to "MCTM0_UP_IRQHandler" + + Update related middleware (eeprom_emulation and spi_module). + + Others + + Update comment, format, typing error, and coding style. + + Update e-Link32 Pro/Lite Command line tool as "V1.20" ("utilities/elink32pro/eLink32pro.exe"). + + Update "TM/PWM_Buzzer/buzzer_pwm.c" to remove redefine alias (they are also defined in "ht32f5xxxx_01.h.). + + Update Keil after build setting, add double quotes (") in the command to prevent space in the path issues. + + Remove "ht32_board_config.h" from the "PDMA/SoftwareTrigger" example. /*----------------------------------------------------------------------------------------------------------*/ /* HT32_STD_5xxxx_FWLib_V1.9.1_7446 */ @@ -386,8 +651,8 @@ - Add "gEXTIn_IRQn[]" and "EXTI_GetIRQn()"" macro to map GPIO pin number (0 ~ 15) to "EXTIn_IRQn". - Add "GPIO2EXTI()"" macro to map GPIO pin to EXTI Channel. - Change "AFIO_EXTISourceConfig()"" API, remove "AFIO_EXTI_CH_Enum" and "AFIO_ESS_Enum". - Old: "void AFIO_EXTISourceConfig(AFIO_EXTI_CH_Enum AFIO_EXTI_CH_n, AFIO_ESS_Enum AFIO_ESS_Px);" - New: "void AFIO_EXTISourceConfig(u32 GPIO_PIN_NUM_n, u32 GPIO_Px);" + Old: void AFIO_EXTISourceConfig(AFIO_EXTI_CH_Enum AFIO_EXTI_CH_n, AFIO_ESS_Enum AFIO_ESS_Px) + New: void AFIO_EXTISourceConfig(u32 GPIO_PIN_NUM_n, u32 GPIO_Px) + LEDC - Fix typing error of the following define. Old New @@ -772,7 +1037,7 @@ + Update GNU project (*.uvprojx), fix the compile error when use new GNU Arm version ("gcc-arm-none-eabi-10-2020-q2-preview-win32" or above). + Fix Keil compiling error when disable both retarget and MicroLib. - + Update "ht32f1xxxx_01.h", fix the compatibility issue when user include "stdbool.h". + + Update "ht32f5xxxx_01.h", fix the compatibility issue when user include "stdbool.h". + Modify GNU compiler settings, output text file (disassembly) after building the code. + Change the startup/system supporting files of specify MCU device. Old New @@ -782,12 +1047,12 @@ startup_ht32f5xxxx_xxx_01.s to startup_ht32f5xxxx_xxx_07.s - HT32F52344/HT32F52354 startup_ht32f5xxxx_01.s to startup_ht32f5xxxx_03.s - + Add "HT32_FWLIB_VER" and "HT32_FWLIB_SVN" in "ht32f1xxxx_lib.h" for the version information of + + Add "HT32_FWLIB_VER" and "HT32_FWLIB_SVN" in "ht32f5xxxx_lib.h" for the version information of HT32 Firmware Library. Example: "#define HT32_FWLIB_VER (018)" "#define HT32_FWLIB_VER (5303)" - + Add new AFIO define in "ht32f1xxxx_gpio.h". + + Add new AFIO define in "ht32f5xxxx_gpio.h". - "AFIO_FUN_MCTM0", "AFIO_FUN_MCTM1" - "AFIO_FUN_GPTM0", "AFIO_FUN_GPTM1", "AFIO_FUN_GPTM2", "AFIO_FUN_GPTM3" - "AFIO_FUN_PWM0", "AFIO_FUN_PWM1", "AFIO_FUN_PWM2", "AFIO_FUN_PWM3" diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/SConscript b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/SConscript index 32e59edc7c..2411aa028f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/SConscript +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/SConscript @@ -2,38 +2,11 @@ import os import sys import rtconfig from building import * - -def get_source(ic_model, file_path, system_path, base_path): - source_path = [] - files_list = [] - readafter = 0 - if not os.path.isfile(file_path): - return - - with open(file_path, 'r') as file: - # content = file.read() - for line in file: - if readafter == 2 and line.find('>') != -1: - break - if readafter == 2: - files_list.append(line.strip()) - if line.find(ic_model) != -1: - readafter = 1 - if readafter == 1 and line.find('<') != -1: - readafter = 2 - for line in files_list: - if line.find('system') != -1: - source_path.append(os.path.join(system_path, line.strip())) - else: - source_path.append(os.path.join(base_path, line.strip())) - return source_path - - Import('rtconfig') tools_path = os.path.normpath(os.getcwd() + '../../..' + '/tools') sys.path.append(tools_path) - +from sdk_dist import get_source source_file_path = os.path.join(os.getcwd(), 'Source_file') base_path = 'library/HT32F5xxxx_Driver/src/' diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h index f72fd72a6f..41ea34e832 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h @@ -1,8 +1,8 @@ /***************************************************************************//** * @file ht32f5xxxx_01.h * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Header File - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -255,9 +255,7 @@ typedef enum IRQn ADC0_IRQn = 8, /*!< ADC0 Interrupt */ #if defined(USE_HT32F65230_40) ADC1_IRQn = 9, /*!< ADC1 Interrupt */ - #elif defined(USE_HT32F66242) - CORDIC_IRQn = 9, /*!< CORDIC global Interrupt */ - #elif defined(USE_HT32F66246) + #elif defined(USE_HT32F66242) || defined(USE_HT32F66246) CORDIC_IRQn = 9, /*!< CORDIC global Interrupt */ #endif MCTM0_BRK_IRQn = 10, /*!< MCTM BRK Interrupt */ @@ -272,10 +270,8 @@ typedef enum IRQn CMP1_IRQn = 19, /*!< Comparator1 Interrupt */ #if defined(USE_HT32F65230_40) CMP2_IRQn = 20, /*!< Comparator2 Interrupt */ - #elif defined(USE_HT32F66242) - PID_IRQn = 20, /*!< PID global Interrupt */ - #elif defined(USE_HT32F66246) - PID_IRQn = 20, /*!< PID global Interrupt */ + #elif defined(USE_HT32F66242) || defined(USE_HT32F66246) + PID0_IRQn = 20, /*!< PID global Interrupt */ #endif I2C0_IRQn = 21, /*!< I2C global Interrupt */ SPI0_IRQn = 22, /*!< SPI global Interrupt */ @@ -538,13 +534,18 @@ typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; #if defined (__CC_ARM) #define __ALIGN4 __align(4) +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #define __ALIGN4 __attribute__((aligned(4))) #elif defined (__ICCARM__) #define __ALIGN4 _Pragma("data_alignment = 4") #elif defined (__GNUC__) #define __ALIGN4 __attribute__((aligned(4))) #endif -#if defined (__GNUC__) +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #define __PACKED_H + #define __PACKED_F __attribute__ ((packed)) +#elif defined (__GNUC__) #define __PACKED_H #define __PACKED_F __attribute__ ((packed)) #elif defined (__ICCARM__) || (__CC_ARM) @@ -675,14 +676,21 @@ typedef struct { /* ADC0: 0x40010000 */ /* ADC1: 0x40050000 */ - __IO uint32_t CFGR; /*!< 0x000 ADC Configuration Register (ADC1 only) */ + __IO uint32_t CFGR; /*!< 0x000 ADC Configuration Register (ADC1 only for specific */ + /*! model) */ __IO uint32_t RST; /*!< 0x004 ADC Reset Register */ __IO uint32_t CONV; /*!< 0x008 ADC Regular Conversion Mode Register */ __IO uint32_t HCONV; /*!< 0x00C ADC High-priority Conversion Mode Register */ __IO uint32_t LST[2]; /*!< 0x010 - 0x014 ADC Conversion List Register */ uint32_t RESERVE0[2]; /*!< 0x018 - 0x01C Reserved */ + #if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) __IO uint32_t HLST; /*!< 0x020 ADC High-priority Conversion List Register */ uint32_t RESERVE1[3]; /*!< 0x024 - 0x02C Reserved */ + #endif + #if defined(USE_HT32F66242) || defined(USE_HT32F66246) + __IO uint32_t HLST[3]; /*!< 0x020 - 0x028 ADC High-priority Conversion List Register 0-2 */ + uint32_t RESERVE1[1]; /*!< 0x02C Reserved */ + #endif #if defined(USE_HT32F65230_40) __IO uint32_t OFR[12]; /*!< 0x030 - 0x05C ADC Input Offset Register 0-11 */ uint32_t RESERVE2[4]; /*!< 0x060 - 0x06C Reserved */ @@ -695,12 +703,9 @@ typedef struct __IO uint32_t STR[15]; /*!< 0x070 - 0x0A8 ADC Input Sampling Time Register 0-14 */ uint32_t RESERVE3[1]; /*!< 0x0AC Reserved */ #endif - #if defined(USE_HT32F66242) - uint32_t RESERVE2[16]; /*!< 0x030 - 0x06C Reserved */ - __IO uint32_t STR[16]; /*!< 0x070 - 0x0AC ADC Input Sampling Time Register 0-15 */ - #endif - #if defined(USE_HT32F66246) - uint32_t RESERVE2[16]; /*!< 0x030 - 0x06C Reserved */ + #if defined(USE_HT32F66242) || defined(USE_HT32F66246) + uint32_t RESERVE2[15]; /*!< 0x030 - 0x068 Reserved */ + uint32_t RESERVE3[1]; /*!< 0x06C Reserved */ __IO uint32_t STR[16]; /*!< 0x070 - 0x0AC ADC Input Sampling Time Register 0-15 */ #endif __IO uint32_t DR[8]; /*!< 0x0B0 - 0x0CC ADC Regular Conversion Data Register 0-7 */ @@ -726,15 +731,7 @@ typedef struct __IO uint32_t DIESR; /*!< 0x150 Dual ADC Interrupt Enable/Status Register (ADC1 only) */ __IO uint32_t DPDMAR; /*!< 0x154 Dual ADC PDMA Request Register (ADC1 only) */ #endif - #if defined(USE_HT32F66242) - uint32_t RESERVE8[3]; /*!< 0x144 - 0x14C Reserved */ - __IO uint32_t VREFCR; /*!< 0x150 ADC Reference Voltage Control Register */ - uint32_t RESERVE9[3]; /*!< 0x154 - 0x15C Reserved */ - __IO uint32_t HDR4[8]; /*!< 0x160 - 0x17C ADC High-priority Conversion Data Register 4-11 */ - uint32_t RESERVE10[4]; /*!< 0x180 - 0x18C Reserved */ - __IO uint32_t STR16[2]; /*!< 0x190 - 0x194 ADC Input Sampling Time Register 16-17 */ - #endif - #if defined(USE_HT32F66246) + #if defined(USE_HT32F66242) || defined(USE_HT32F66246) uint32_t RESERVE8[3]; /*!< 0x144 - 0x14C Reserved */ __IO uint32_t VREFCR; /*!< 0x150 ADC Reference Voltage Control Register */ uint32_t RESERVE9[3]; /*!< 0x154 - 0x15C Reserved */ @@ -909,7 +906,7 @@ typedef struct __IO uint32_t DOUTR; /*!< 0x020 Data Output Register */ __IO uint32_t SRR; /*!< 0x024 Output Set and Reset Control Register */ __IO uint32_t RR; /*!< 0x028 Output Reset Control Register */ - #if defined(USE_HT32F50220_30) || defined(USE_HT32F50231_41) || defined(USE_HT32F54231_41) || defined(USE_HT32F54243_53) || defined(USE_HT32F53231_41) || defined(USE_HT32F53242_52) || defined(USE_HT32F50431_41) || defined(USE_HT32F50442_52) + #if defined(USE_HT32F50020_30) || defined(USE_HT32F50220_30) || defined(USE_HT32F50231_41) __IO uint32_t SCER; /*!< 0x02C Sink Current Enhanced Selection Register */ #endif } HT_GPIO_TypeDef; @@ -1055,7 +1052,7 @@ typedef struct __IO uint32_t LVDCSR; /*!< 0x010 Low Voltage/Brown Out Detect Control and Status Register*/ #if defined(USE_HT32F57342_52) uint32_t RESERVE2[2]; /*!< 0x014 ~ 0x18 Reserved */ - __IO uint32_t LDOSR ; /*!< 0x01C Power Control LDO Status Register */ + __IO uint32_t LDOSR; /*!< 0x01C Power Control LDO Status Register */ #endif #if defined(USE_HT32F52342_52) || defined(USE_HT32F5826) || defined(USE_HT32F52357_67) uint32_t RESERVE3[59]; /*!< 0x014 ~ 0x0FC Reserved */ @@ -1180,7 +1177,7 @@ typedef struct #else uint32_t RESERVED3[2]; /*!< 0x040 ~ 0x44 Reserved */ #endif - #if defined(USE_HT32F0008) || defined(USE_HT32F50220_30) || defined(USE_HT32F50231_41) || defined(USE_HT32F0006) || defined(USE_HT32F52357_67) || defined(USE_HT32F57342_52) || defined(USE_HT32F57331_41) || defined(USE_HT32F50343) || defined(USE_HT32F54231_41) || defined(USE_HT32F54243_53) || defined(USE_HT32F61244_45) || defined(USE_HT32F53231_41) || defined(USE_HT32F53242_52) || defined(USE_HT32F50431_41) || defined(USE_HT32F50442_52) + #if defined(USE_HT32F0008) || defined(USE_HT32F50220_30) || defined(USE_HT32F50231_41) || defined(USE_HT32F0006) || defined(USE_HT32F52357_67) || defined(USE_HT32F57342_52) || defined(USE_HT32F57331_41) || defined(USE_HT32F50343) || defined(USE_HT32F54231_41) || defined(USE_HT32F54243_53) || defined(USE_HT32F61244_45) || defined(USE_HT32F53231_41) || defined(USE_HT32F53242_52) || defined(USE_HT32F50431_41) || defined(USE_HT32F50442_52) || defined(USE_HT32F66242) || defined(USE_HT32F66246) __IO uint32_t APBPCSR2; /*!< 0x048 APB Peripheral Clock Selection Register 2 */ uint32_t RESERVED4[173]; /*!< 0x04C ~ 0x2FC Reserved */ #elif defined(USE_HT32F52234_44) @@ -1190,7 +1187,7 @@ typedef struct #else uint32_t RESERVED4[174]; /*!< 0x048 ~ 0x2FC Reserved */ #endif - #if !defined(USE_HT32F50020_30) + #if !defined(USE_HT32F50020_30) && !defined(USE_HT32F65230_40) && !defined(USE_HT32F65232) && !defined(USE_HT32F66242) && !defined(USE_HT32F66246) __IO uint32_t LPCR; /*!< 0x300 Low Power Control Register */ #else uint32_t RESERVED5; /*!< 0x300 Reserved */ @@ -1799,6 +1796,7 @@ typedef struct __IO uint32_t DB1R; /*!< 0x028 CAN Interface Data B 1 Register */ } HT_CANIF_TypeDef; + /** * @brief Controller Area Network Global */ @@ -1830,6 +1828,7 @@ typedef struct __IO uint32_t MVR1; /*!< 0x164 Message Valid Register 1 */ } HT_CAN_TypeDef; + /** * @brief Coordinate Rotation Digital Computer */ @@ -1841,69 +1840,47 @@ typedef struct __IO uint32_t RDATA; /*!< 0x008 Result Register */ } HT_CORDIC_TypeDef; +/** + * @brief Proportional Mode parameters + */ +typedef struct +{ + + __IO uint32_t LEIR; /*!< 0x000 Last Error Input Register */ + __IO uint32_t KPIR; /*!< 0x004 KP Input Register */ + __IO uint32_t KIIR; /*!< 0x008 KI Input Register */ + __IO uint32_t KDIR; /*!< 0x00C KD Input Register */ + __IO uint32_t LIFVR; /*!< 0x010 Last Integral Function Value Register */ + __IO uint32_t IFVMAXLR; /*!< 0x014 Integral Function Value Maximum Limitation Register */ + __IO uint32_t IFVMINLR; /*!< 0x018 Integral Function Value Minimum Limitation Register */ + __IO uint32_t PIDORLR; /*!< 0x01C PID Output Result Limitation Register */ +} HT_PIDPARA_TypeDef; +/** + * @} + */ + /** * @brief Proportional Integral Derivative controller */ typedef struct { /* PID: 0x400EC000 */ - __IO uint32_t CR0; /*!< 0x000 Control Register 0 */ - __IO uint32_t UI_INPUT; /*!< 0x004 */ - __IO uint32_t ERR_n; /*!< 0x008 */ - __IO uint32_t PID_OUT; /*!< 0x00C */ - __IO uint32_t SPD1ERR1; /*!< 0x010 */ - __IO uint32_t SPD1KP; /*!< 0x014 */ - __IO uint32_t SPD1KI; /*!< 0x018 */ - __IO uint32_t SPD1KD; /*!< 0x01C */ - __IO uint32_t SPD1UI1; /*!< 0x020 */ - __IO uint32_t SPD1UI_MAX; /*!< 0x024 */ - __IO uint32_t SPD1UI_MIN; /*!< 0x028 */ - __IO uint32_t SPD1_PIDOUT_LIM; /*!< 0x02C */ - __IO uint32_t IQ1ERR1; /*!< 0x030 */ - __IO uint32_t IQ1KP; /*!< 0x034 */ - __IO uint32_t IQ1KI; /*!< 0x038 */ - __IO uint32_t IQ1KD; /*!< 0x03C */ - __IO uint32_t IQ1UI1; /*!< 0x040 */ - __IO uint32_t IQ1UI_MAX; /*!< 0x044 */ - __IO uint32_t IQ1UI_MIN; /*!< 0x048 */ - __IO uint32_t IQ1_PIDOUT_LIM; /*!< 0x04C */ - __IO uint32_t ID1ERR1; /*!< 0x050 */ - __IO uint32_t ID1KP; /*!< 0x054 */ - __IO uint32_t ID1KI; /*!< 0x058 */ - __IO uint32_t ID1KD; /*!< 0x05C */ - __IO uint32_t ID1UI1; /*!< 0x060 */ - __IO uint32_t ID1UI_MAX; /*!< 0x064 */ - __IO uint32_t ID1UI_MIN; /*!< 0x068 */ - __IO uint32_t ID1_PIDOUT_LIM; /*!< 0x06C */ - __IO uint32_t FWNK1ERR1; /*!< 0x070 */ - __IO uint32_t FWNK1KP; /*!< 0x074 */ - __IO uint32_t FWNK1KI; /*!< 0x078 */ - __IO uint32_t FWNK1KD; /*!< 0x07C */ - __IO uint32_t FWNK1UI1; /*!< 0x080 */ - __IO uint32_t FWNK1UI_MAX; /*!< 0x084 */ - __IO uint32_t FWNK1UI_MIN; /*!< 0x088 */ - __IO uint32_t FWNK1_PIDOUT_LIM;/*!< 0x08C */ - __IO uint32_t PLL1ERR1; /*!< 0x090 */ - __IO uint32_t PLL1KP; /*!< 0x094 */ - __IO uint32_t PLL1KI; /*!< 0x098 */ - __IO uint32_t PLL1KD; /*!< 0x09C */ - __IO uint32_t PLL1UI1; /*!< 0x0A0 */ - __IO uint32_t PLL1UI_MAX; /*!< 0x0A4 */ - __IO uint32_t PLL1UI_MIN; /*!< 0x0A8 */ - __IO uint32_t PLL1_PIDOUT_LIM; /*!< 0x0AC */ - __IO uint32_t USR1ERR1; /*!< 0x0B0 */ - __IO uint32_t USR1KP; /*!< 0x0B4 */ - __IO uint32_t USR1KI; /*!< 0x0B8 */ - __IO uint32_t USR1KD; /*!< 0x0BC */ - __IO uint32_t USR1UI1; /*!< 0x0C0 */ - __IO uint32_t USR1UI_MAX; /*!< 0x0C4 */ - __IO uint32_t USR1UI_MIN; /*!< 0x0C8 */ - __IO uint32_t USR1_PIDOUT_LIM; /*!< 0x0CC */ + __IO uint32_t CR; /*!< 0x000 Control Register */ + __IO uint32_t IFIVR; /*!< 0x004 Integral Function Input Value Register */ + __IO uint32_t EIVR; /*!< 0x008 Error Input Value Register */ + __IO uint32_t ORR; /*!< 0x00C Output Result Register */ + HT_PIDPARA_TypeDef SPD; /*!< 0x010 - 0x02C SPD Mode */ + HT_PIDPARA_TypeDef IQ; /*!< 0x030 - 0x04C IQ Mode */ + HT_PIDPARA_TypeDef ID; /*!< 0x050 - 0x06C ID Mode */ + HT_PIDPARA_TypeDef FWNK; /*!< 0x070 - 0x08C FWNK Mode */ + HT_PIDPARA_TypeDef PLL; /*!< 0x090 - 0x0AC PLL Mode */ + HT_PIDPARA_TypeDef USR; /*!< 0x0B0 - 0x0CC USR Mode */ } HT_PID_TypeDef; /** * @} */ + /** * @brief RF */ @@ -2132,7 +2109,7 @@ typedef struct #define HT_DIV_BASE (HT_AHBPERIPH_BASE + 0x4A000) /* 0x400CA000 */ #define HT_RF_BASE (HT_AHBPERIPH_BASE + 0x50000) /* 0x400D0000 */ #define HT_CORDIC_BASE (HT_AHBPERIPH_BASE + 0x5C000) /* 0x400DC000 */ -#define HT_PID_BASE (HT_AHBPERIPH_BASE + 0x5E000) /* 0x400DE000 */ +#define HT_PID0_BASE (HT_AHBPERIPH_BASE + 0x5E000) /* 0x400DE000 */ #define HT_QSPI_BASE (HT_AHBPERIPH_BASE + 0x60000) /* 0x400E0000 */ /** @@ -2596,7 +2573,7 @@ typedef struct #define HT_PGA2 ((HT_PGA0_X_TypeDef *) HT_PGA2_BASE) #define HT_PGA3 ((HT_PGA0_X_TypeDef *) HT_PGA3_BASE) #define HT_PGA ((HT_PGA_TypeDef *) HT_PGA_BASE) -#define HT_PID ((HT_LCD_TypeDef *) HT_LCD_BASE) +#define HT_PID0 ((HT_PID_TypeDef *) HT_PID0_BASE) #define HT_CORDIC ((HT_CORDIC_TypeDef *) HT_CORDIC_BASE) #define HT_LSTM0 ((HT_RTC_TypeDef *) HT_RTC_BASE) @@ -2618,7 +2595,7 @@ typedef struct #define HT_PGA2 ((HT_PGA0_X_TypeDef *) HT_PGA2_BASE) #define HT_PGA3 ((HT_PGA0_X_TypeDef *) HT_PGA3_BASE) #define HT_PGA ((HT_PGA_TypeDef *) HT_PGA_BASE) -#define HT_PID ((HT_LCD_TypeDef *) HT_LCD_BASE) +#define HT_PID0 ((HT_PID_TypeDef *) HT_PID0_BASE) #define HT_CORDIC ((HT_CORDIC_TypeDef *) HT_CORDIC_BASE) #define HT_LSTM0 ((HT_RTC_TypeDef *) HT_RTC_BASE) @@ -2689,14 +2666,14 @@ typedef struct #define UART3_IRQn UART1_UART3_IRQn #endif -#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) +#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F66242) || defined(USE_HT32F66246) // Alias #define GPTM0_IRQn GPTM0_G_IRQn #define GPTM0_IRQHandler GPTM0_G_IRQHandler #define MCTM0_IRQn MCTM0_UP_IRQn - #define MCTM0_IRQHandler MCTM0_G_IRQHandler + #define MCTM0_IRQHandler MCTM0_UP_IRQHandler #define MCTM1_IRQn MCTM1_UP_IRQn - #define MCTM1_IRQHandler MCTM1_G_IRQHandler + #define MCTM1_IRQHandler MCTM1_UP_IRQHandler #endif #define AFIO_ESS_Enum u32 diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_hf5032.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_hf5032.s index a86606d966..23655e6b12 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_hf5032.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_hf5032.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7648 $ +; Date : $Date:: 2024-03-20 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,7 +19,6 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,7 +33,6 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 USE_HT32_CHIP_SET EQU 7 ; Notice that the project's Asm Define has the higher priority. @@ -47,7 +45,6 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 HT32F50220_30 EQU 7 @@ -56,7 +53,6 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 IF USE_HT32_CHIP_SET=0 @@ -72,13 +68,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +307,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +322,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0006.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0006.s index e0b5ba76e2..1c93c451be 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0006.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0006.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_07.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -52,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -277,10 +288,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -291,11 +303,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0008.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0008.s index db72cb363f..239d45c26f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0008.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0008.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50020_30.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50020_30.s index 45853e20f1..f5c17e8bae 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50020_30.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50020_30.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -26,6 +26,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 25 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -33,10 +34,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -51,13 +54,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-2048:8> Heap_Size EQU 0 @@ -208,10 +222,11 @@ LEDC_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +237,19 @@ LEDC_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50220_30.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50220_30.s index a86606d966..40fff3b7bd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50220_30.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50220_30.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 7 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50231_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50231_41.s index 8e68952909..3c1522bed8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50231_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50231_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50343.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50343.s index 1a58d66e73..eb2c66aeba 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50343.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50343.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_06.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-12288:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-12288:8> Heap_Size EQU 0 @@ -271,10 +282,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -285,11 +297,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50431_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50431_41.s index be3f3ca0f7..c1ecefc896 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50431_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50431_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 USE_HT32_CHIP_SET EQU 30 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -31,9 +33,11 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050452 ;_HT32FWID EQU 0x00050431 ;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 HT32F50442_52 EQU 26 HT32F50431_41 EQU 30 +HT32F61052 EQU 26 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -48,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -237,10 +252,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -251,11 +267,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50442_52.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50442_52.s index 214cdf9e32..152ae6ca6f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50442_52.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50442_52.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 USE_HT32_CHIP_SET EQU 26 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -31,9 +33,11 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050452 ;_HT32FWID EQU 0x00050431 ;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 HT32F50442_52 EQU 26 HT32F50431_41 EQU 30 +HT32F61052 EQU 26 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -48,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -237,10 +252,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -251,11 +267,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52142.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52142.s index db72cb363f..239d45c26f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52142.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52142.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52220_30.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52220_30.s index ae562b2a89..1b71dcbac4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52220_30.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52220_30.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 1 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52231_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52231_41.s index c653285b1f..ff7688a37f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52231_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52231_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52234_44.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52234_44.s index 9f80e3bd0e..e1a1b740e3 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52234_44.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52234_44.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_17.s -; Version : $Rev:: 7027 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,14 +21,14 @@ ;// Select HT32 Device for the assembly setting. ;// Notice that the project's Asm Define has the higher priority. ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 -USE_HT32_CHIP_SET EQU 33 ; Notice that the project's Asm Define has the higher priority. +;// <35=> HT32F52234/44 +USE_HT32_CHIP_SET EQU 35 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00052234 ;_HT32FWID EQU 0x00052244 -HT32F52234_44 EQU 33 +HT32F52234_44 EQU 35 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -43,13 +43,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -212,10 +223,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -226,11 +238,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52243_53.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52243_53.s index e9b3a2c194..7ece1c101a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52243_53.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52243_53.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 5 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52331_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52331_41.s index 8cd61fd13a..39d0d94d15 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52331_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52331_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 3 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52342_52.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52342_52.s index 2285fed9c8..536d5252d5 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52342_52.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52342_52.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 4 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52344_54.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52344_54.s index e745eaa803..a7fa970bc7 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52344_54.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52344_54.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52357_67.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52357_67.s index 4533138d12..ea3bd5c1dd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52357_67.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52357_67.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53231_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53231_41.s index e1bc80febe..46d1ded0b4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53231_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53231_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_15.s -; Version : $Rev:: 6874 $ -; Date : $Date:: 2023-05-03 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -239,10 +250,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -253,11 +265,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53242_52.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53242_52.s index f4dbd9cf62..3afd815b48 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53242_52.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53242_52.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_15.s -; Version : $Rev:: 6874 $ -; Date : $Date:: 2023-05-03 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -239,10 +250,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -253,11 +265,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54231_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54231_41.s index 5db17956e7..2d239879ac 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54231_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54231_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_09.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -316,10 +327,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -330,11 +342,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54243_53.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54243_53.s index 657d0d6523..44e996c83b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54243_53.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54243_53.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_09.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -316,10 +327,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -330,11 +342,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57331_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57331_41.s index cbaf7f3ee1..b545bc467b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57331_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57331_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57342_52.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57342_52.s index b1d916864c..82c72c182b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57342_52.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57342_52.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 14 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57541.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57541.s new file mode 100644 index 0000000000..b545bc467b --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57541.s @@ -0,0 +1,378 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_05.s +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F57331, HT32F57341 +; HT32F57342, HT32F57352 +; HT32F59741 +; HT32F5828 +; HT32F67742 +; HT32F59746 +; HT32F57541 +; HT32F57552 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <13=> HT32F57331/41 +;// <14=> HT32F57342/52 +;// <13=> HT32F59741 +;// <14=> HT32F5828 +;// <13=> HT32F67742 +;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 +USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00057331 +;_HT32FWID EQU 0x00057341 +;_HT32FWID EQU 0x00057342 +;_HT32FWID EQU 0x00057352 +;_HT32FWID EQU 0x00059741 +;_HT32FWID EQU 0x00005828 +;_HT32FWID EQU 0x00067742 +;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 + +HT32F57331_41 EQU 13 +HT32F57342_52 EQU 14 +HT32F59741 EQU 13 +HT32F5828 EQU 14 +HT32F67742 EQU 13 +HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD COMP_DAC_IRQHandler ; 07, 23, 0x05C, + ENDIF + DCD ADC_IRQHandler ; 08, 24, 0x060, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD AES_IRQHandler ; 09, 25, 0x064, + ENDIF + DCD _RESERVED ; 10, 26, 0x068, + DCD LCD_IRQHandler ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD I2C1_IRQHandler ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD SPI1_IRQHandler ; 22, 38, 0x098, + DCD USART0_IRQHandler ; 23, 39, 0x09C, + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + DCD USB_IRQHandler ; 29, 45, 0x0B4, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 30, 46, 0x0B8, + DCD _RESERVED ; 31, 47, 0x0BC, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_DAC_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT LCD_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_DAC_IRQHandler +ADC_IRQHandler +AES_IRQHandler +LCD_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +SCI_IRQHandler +I2S_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57552.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57552.s new file mode 100644 index 0000000000..82c72c182b --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57552.s @@ -0,0 +1,378 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_05.s +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F57331, HT32F57341 +; HT32F57342, HT32F57352 +; HT32F59741 +; HT32F5828 +; HT32F67742 +; HT32F59746 +; HT32F57541 +; HT32F57552 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <13=> HT32F57331/41 +;// <14=> HT32F57342/52 +;// <13=> HT32F59741 +;// <14=> HT32F5828 +;// <13=> HT32F67742 +;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 +USE_HT32_CHIP_SET EQU 14 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00057331 +;_HT32FWID EQU 0x00057341 +;_HT32FWID EQU 0x00057342 +;_HT32FWID EQU 0x00057352 +;_HT32FWID EQU 0x00059741 +;_HT32FWID EQU 0x00005828 +;_HT32FWID EQU 0x00067742 +;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 + +HT32F57331_41 EQU 13 +HT32F57342_52 EQU 14 +HT32F59741 EQU 13 +HT32F5828 EQU 14 +HT32F67742 EQU 13 +HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD COMP_DAC_IRQHandler ; 07, 23, 0x05C, + ENDIF + DCD ADC_IRQHandler ; 08, 24, 0x060, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD AES_IRQHandler ; 09, 25, 0x064, + ENDIF + DCD _RESERVED ; 10, 26, 0x068, + DCD LCD_IRQHandler ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD I2C1_IRQHandler ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD SPI1_IRQHandler ; 22, 38, 0x098, + DCD USART0_IRQHandler ; 23, 39, 0x09C, + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + DCD USB_IRQHandler ; 29, 45, 0x0B4, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 30, 46, 0x0B8, + DCD _RESERVED ; 31, 47, 0x0BC, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_DAC_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT LCD_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_DAC_IRQHandler +ADC_IRQHandler +AES_IRQHandler +LCD_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +SCI_IRQHandler +I2S_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5826.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5826.s index eba919c13e..f4501184d1 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5826.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5826.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5826.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7596 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,25 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp - -;// Heap Size (in Bytes) <0-16384:8> -Heap_Size EQU 0 - - AREA HEAP, NOINIT, READWRITE, ALIGN = 3 -__HT_check_heap -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB + ENDIF ;******************************************************************************* ; Fill-up the Vector Table entries with the exceptions ISR address @@ -284,10 +283,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -298,11 +298,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5828.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5828.s index b1d916864c..82c72c182b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5828.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5828.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 14 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59041.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59041.s index 8e68952909..3c1522bed8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59041.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59041.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59045.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59045.s new file mode 100644 index 0000000000..ff7688a37f --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59045.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59741.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59741.s index cbaf7f3ee1..b545bc467b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59741.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59741.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59746.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59746.s index cbaf7f3ee1..b545bc467b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59746.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59746.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_01.s index b11048b5e0..05c1c11636 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_01.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_02.s index de2009c868..0dd429e152 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_02.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_03.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_03.s index 1ff2f77f4b..015d5a46df 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_03.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_03.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_05.s index 842644ceee..6e05ca4bfd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_05.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_06.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_06.s index bf17a58ce7..780374807b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_06.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_06.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_06.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-12288:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-12288:8> Heap_Size EQU 0 @@ -271,10 +282,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -285,11 +297,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_07.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_07.s index 10f210c5a2..b23401ff33 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_07.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_07.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_07.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -52,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -277,10 +288,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -291,11 +303,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_08.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_08.s index 24cf68758d..6ffff354d8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_08.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_08.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_09.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_09.s index 089c851eb1..1d2eedce91 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_09.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_09.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_09.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -316,10 +327,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -330,11 +342,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_10.s index 57fb44e314..d28f4c4e8c 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_10.s @@ -6,14 +6,15 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_10.s -; Version : $Rev:: 5783 $ -; Date : $Date:: 2022-03-30 #$ +; Version : $Rev:: 8105 $ +; Date : $Date:: 2024-09-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,13 +23,16 @@ ;// Notice that the project's Asm Define has the higher priority. ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00061244 ;_HT32FWID EQU 0x00061245 +;_HT32FWID EQU 0x00061242 HT32F61244_45 EQU 24 +NW32F61242 EQU 24 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -43,13 +47,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_11.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_11.s index 784096cf66..5c6c48a1c4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_11.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_11.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_11.s -; Version : $Rev:: 5991 $ -; Date : $Date:: 2022-06-23 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -43,13 +43,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -218,10 +229,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -232,11 +244,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_12.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_12.s index 45e5c70109..6a24f616fb 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_12.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_12.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_12.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ USB_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ USB_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_13.s index f03c345a43..feec236f33 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_13.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -33,10 +35,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -51,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-2048:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ LEDC_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ LEDC_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_14.s index a76b5da417..224232f9c7 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_14.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -31,9 +33,11 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050452 ;_HT32FWID EQU 0x00050431 ;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 HT32F50442_52 EQU 26 HT32F50431_41 EQU 30 +HT32F61052 EQU 26 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -48,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -237,10 +252,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -251,11 +267,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s index e261fa6021..0d440d350a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_15.s -; Version : $Rev:: 6874 $ -; Date : $Date:: 2023-05-03 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -239,10 +250,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -253,11 +265,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_16.s index 23328ec7c4..b3aa7a1215 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_16.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_16.s -; Version : $Rev:: 7092 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ _HT32FWID EQU 0x00066242 ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -124,7 +135,7 @@ __Vectors DCD BFTM1_IRQHandler ; 17, 33, 0x084, DCD CMP0_IRQHandler ; 18, 34, 0x088, DCD CMP1_IRQHandler ; 19, 35, 0x08C, - DCD PID_IRQHandler ; 20, 36, 0x090, + DCD PID0_IRQHandler ; 20, 36, 0x090, DCD I2C0_IRQHandler ; 21, 37, 0x094, DCD SPI0_IRQHandler ; 22, 38, 0x098, DCD USART0_IRQHandler ; 23, 39, 0x09C, @@ -195,7 +206,7 @@ Default_Handler PROC EXPORT BFTM1_IRQHandler [WEAK] EXPORT CMP0_IRQHandler [WEAK] EXPORT CMP1_IRQHandler [WEAK] - EXPORT PID_IRQHandler [WEAK] + EXPORT PID0_IRQHandler [WEAK] EXPORT I2C0_IRQHandler [WEAK] EXPORT SPI0_IRQHandler [WEAK] EXPORT USART0_IRQHandler [WEAK] @@ -228,7 +239,7 @@ BFTM0_IRQHandler BFTM1_IRQHandler CMP0_IRQHandler CMP1_IRQHandler -PID_IRQHandler +PID0_IRQHandler I2C0_IRQHandler SPI0_IRQHandler USART0_IRQHandler @@ -248,10 +259,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -262,11 +274,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_17.s index 0829021a82..6187c06586 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_17.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_17.s -; Version : $Rev:: 7027 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,14 +21,14 @@ ;// Select HT32 Device for the assembly setting. ;// Notice that the project's Asm Define has the higher priority. ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00052234 ;_HT32FWID EQU 0x00052244 -HT32F52234_44 EQU 33 +HT32F52234_44 EQU 35 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -43,13 +43,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -212,10 +223,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -226,11 +238,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61030.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61030.s index 45853e20f1..e6e528a050 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61030.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61030.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 25 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -33,10 +35,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -51,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-2048:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ LEDC_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ LEDC_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61041.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61041.s index 8e68952909..3c1522bed8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61041.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61041.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61052.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61052.s new file mode 100644 index 0000000000..152ae6ca6f --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61052.s @@ -0,0 +1,288 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_14.s +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F50442, HT32F50452 +; HT32F50431, HT32F50441 +; HT32F61052 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <26=> HT32F50442/52 +;// <30=> HT32F50431/41 +;// <26=> HT32F61052 +USE_HT32_CHIP_SET EQU 26 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00050442 +;_HT32FWID EQU 0x00050452 +;_HT32FWID EQU 0x00050431 +;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 + +HT32F50442_52 EQU 26 +HT32F50431_41 EQU 30 +HT32F61052 EQU 26 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F50442_52) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + DCD ADC_IRQHandler ; 08, 24, 0x060, + DCD _RESERVED ; 09, 25, 0x064, + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + DCD _RESERVED ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + IF (USE_HT32_CHIP=HT32F50442_52) + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ELSE + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD I2C1_IRQHandler ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD SPI1_IRQHandler ; 22, 38, 0x098, + DCD USART0_IRQHandler ; 23, 39, 0x09C, + IF (USE_HT32_CHIP=HT32F50442_52) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + DCD _RESERVED ; 27, 43, 0x0AC, + DCD _RESERVED ; 28, 44, 0x0B0, + DCD LEDC_IRQHandler ; 29, 45, 0x0B4, + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT LEDC_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM0_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +LEDC_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61141.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61141.s index e01651cc14..90ccad9f98 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61141.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61141.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_12.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ USB_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ USB_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61244_45.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61244_45.s index 5477d2e255..8150b2440a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61244_45.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61244_45.s @@ -6,14 +6,15 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_10.s -; Version : $Rev:: 5783 $ -; Date : $Date:: 2022-03-30 #$ +; Version : $Rev:: 8105 $ +; Date : $Date:: 2024-09-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,13 +23,16 @@ ;// Notice that the project's Asm Define has the higher priority. ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 USE_HT32_CHIP_SET EQU 24 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00061244 ;_HT32FWID EQU 0x00061245 +;_HT32FWID EQU 0x00061242 HT32F61244_45 EQU 24 +NW32F61242 EQU 24 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -43,13 +47,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61352.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61352.s index e0b5ba76e2..1c93c451be 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61352.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61352.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_07.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -52,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -277,10 +288,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -291,11 +303,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61355_56_57.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61355_56_57.s index 418bcfd86f..bb34fecd2a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61355_56_57.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61355_56_57.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_07.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -52,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -277,10 +288,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -291,11 +303,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61630.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61630.s index 45853e20f1..e6e528a050 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61630.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61630.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 25 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -33,10 +35,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -51,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-2048:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ LEDC_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ LEDC_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61641.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61641.s index 8e68952909..3c1522bed8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61641.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61641.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61730.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61730.s new file mode 100644 index 0000000000..e6e528a050 --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61730.s @@ -0,0 +1,259 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_13.s +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F50020, HT32F50030 +; HT32F61630 +; HT32F61030 +; HT32F61730 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <25=> HT32F50020/30 +;// <25=> HT32F61630 +;// <25=> HT32F61030 +;// <25=> HT32F61730 +USE_HT32_CHIP_SET EQU 25 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00050020 +;_HT32FWID EQU 0x00050030 +;_HT32FWID EQU 0x00061630 +;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 + +HT32F50020_30 EQU 25 +HT32F61630 EQU 25 +HT32F61030 EQU 25 +HT32F61730 EQU 25 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-2048:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_7_IRQHandler ; 06, 22, 0x058, + DCD _RESERVED ; 07, 23, 0x05C, + DCD ADC_IRQHandler ; 08, 24, 0x060, + DCD _RESERVED ; 09, 25, 0x064, + DCD _RESERVED ; 10, 26, 0x068, + DCD _RESERVED ; 11, 27, 0x06C, + DCD _RESERVED ; 12, 28, 0x070, + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD _RESERVED ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD _RESERVED ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD _RESERVED ; 22, 38, 0x098, + DCD _RESERVED ; 23, 39, 0x09C, + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + DCD _RESERVED ; 27, 43, 0x0AC, + DCD _RESERVED ; 28, 44, 0x0B0, + DCD LEDC_IRQHandler ; 29, 45, 0x0B4, + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_7_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT LEDC_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_7_IRQHandler +ADC_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +BFTM0_IRQHandler +I2C0_IRQHandler +SPI0_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +LEDC_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61741.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61741.s new file mode 100644 index 0000000000..3c1522bed8 --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61741.s @@ -0,0 +1,347 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_02.s +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F50220, HT32F50230 +; HT32F50231, HT32F50241 +; HT50F32002 +; HT32F59041 +; HF5032 +; HT32F61641 +; HT32F61041 +; HT32F61741 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <7=> HT32F50220/30 +;// <8=> HT32F50231/41 +;// <7=> HT50F32002 +;// <8=> HT32F59041 +;// <7=> HF5032 +;// <8=> HT32F61641 +;// <8=> HT32F61041 +;// <8=> HT32F61741 +USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00050220 +;_HT32FWID EQU 0x00050230 +;_HT32FWID EQU 0x00050231 +;_HT32FWID EQU 0x00050241 +;_HT32FWID EQU 0x00032002 +;_HT32FWID EQU 0x00059041 +;_HT32FWID EQU 0x000F5032 +;_HT32FWID EQU 0x00061641 +;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 + +HT32F50220_30 EQU 7 +HT32F50231_41 EQU 8 +HT50F32002 EQU 7 +HT32F59041 EQU 8 +HF5032 EQU 7 +HT32F61641 EQU 8 +HT32F61041 EQU 8 +HT32F61741 EQU 8 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-4096:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + DCD _RESERVED ; 07, 23, 0x05C, + DCD ADC_IRQHandler ; 08, 24, 0x060, + DCD _RESERVED ; 09, 25, 0x064, + IF (USE_HT32_CHIP=HT32F50220_30) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + DCD _RESERVED ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F50220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F50220_30) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD SPI1_IRQHandler ; 22, 38, 0x098, + IF (USE_HT32_CHIP=HT32F50220_30) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM0_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +UART0_IRQHandler +UART1_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62030.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62030.s index ae562b2a89..1b71dcbac4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62030.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62030.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 1 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62040.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62040.s index c653285b1f..ff7688a37f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62040.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62040.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62050.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62050.s index e9b3a2c194..7ece1c101a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62050.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62050.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 5 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62140.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62140.s new file mode 100644 index 0000000000..ff7688a37f --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62140.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65230_40.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65230_40.s index b986536809..204d6a2150 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65230_40.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65230_40.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65232.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65232.s index 0ec4ece850..5b0c20ca24 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65232.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65232.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66242.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66242.s index d2f753c115..77dafb95e9 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66242.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66242.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_16.s -; Version : $Rev:: 7092 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 7599 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ _HT32FWID EQU 0x00066242 ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -124,7 +135,7 @@ __Vectors DCD BFTM1_IRQHandler ; 17, 33, 0x084, DCD CMP0_IRQHandler ; 18, 34, 0x088, DCD CMP1_IRQHandler ; 19, 35, 0x08C, - DCD PID_IRQHandler ; 20, 36, 0x090, + DCD PID0_IRQHandler ; 20, 36, 0x090, DCD I2C0_IRQHandler ; 21, 37, 0x094, DCD SPI0_IRQHandler ; 22, 38, 0x098, DCD USART0_IRQHandler ; 23, 39, 0x09C, @@ -195,7 +206,7 @@ Default_Handler PROC EXPORT BFTM1_IRQHandler [WEAK] EXPORT CMP0_IRQHandler [WEAK] EXPORT CMP1_IRQHandler [WEAK] - EXPORT PID_IRQHandler [WEAK] + EXPORT PID0_IRQHandler [WEAK] EXPORT I2C0_IRQHandler [WEAK] EXPORT SPI0_IRQHandler [WEAK] EXPORT USART0_IRQHandler [WEAK] @@ -228,7 +239,7 @@ BFTM0_IRQHandler BFTM1_IRQHandler CMP0_IRQHandler CMP1_IRQHandler -PID_IRQHandler +PID0_IRQHandler I2C0_IRQHandler SPI0_IRQHandler USART0_IRQHandler @@ -248,10 +259,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -262,11 +274,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66246.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66246.s index 9a02335cc6..fd226bf9c2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66246.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66246.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_16.s -; Version : $Rev:: 7092 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 7599 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ _HT32FWID EQU 0x00066242 ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -124,7 +135,7 @@ __Vectors DCD BFTM1_IRQHandler ; 17, 33, 0x084, DCD CMP0_IRQHandler ; 18, 34, 0x088, DCD CMP1_IRQHandler ; 19, 35, 0x08C, - DCD PID_IRQHandler ; 20, 36, 0x090, + DCD PID0_IRQHandler ; 20, 36, 0x090, DCD I2C0_IRQHandler ; 21, 37, 0x094, DCD SPI0_IRQHandler ; 22, 38, 0x098, DCD USART0_IRQHandler ; 23, 39, 0x09C, @@ -195,7 +206,7 @@ Default_Handler PROC EXPORT BFTM1_IRQHandler [WEAK] EXPORT CMP0_IRQHandler [WEAK] EXPORT CMP1_IRQHandler [WEAK] - EXPORT PID_IRQHandler [WEAK] + EXPORT PID0_IRQHandler [WEAK] EXPORT I2C0_IRQHandler [WEAK] EXPORT SPI0_IRQHandler [WEAK] EXPORT USART0_IRQHandler [WEAK] @@ -228,7 +239,7 @@ BFTM0_IRQHandler BFTM1_IRQHandler CMP0_IRQHandler CMP1_IRQHandler -PID_IRQHandler +PID0_IRQHandler I2C0_IRQHandler SPI0_IRQHandler USART0_IRQHandler @@ -248,10 +259,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -262,11 +274,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67041_51.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67041_51.s index 13c68a18ec..8035d2c44a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67041_51.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67041_51.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_11.s -; Version : $Rev:: 5991 $ -; Date : $Date:: 2022-06-23 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -43,13 +43,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -218,10 +229,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -232,11 +244,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67232.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67232.s index ae562b2a89..1b71dcbac4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67232.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67232.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 1 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67233.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67233.s index ae562b2a89..1b71dcbac4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67233.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67233.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 1 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67741.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67741.s index c653285b1f..ff7688a37f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67741.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67741.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67742.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67742.s index cbaf7f3ee1..b545bc467b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67742.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67742.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32002.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32002.s index a86606d966..40fff3b7bd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32002.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32002.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 7 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32003.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32003.s index 2285fed9c8..536d5252d5 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32003.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32003.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 4 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200s.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200s.s index b986536809..204d6a2150 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200s.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200s.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200t.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200t.s index 4533138d12..ea3bd5c1dd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200t.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200t.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200u.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200u.s new file mode 100644 index 0000000000..ff7688a37f --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200u.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52231.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52231.s new file mode 100644 index 0000000000..ff7688a37f --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52231.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52352.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52352.s new file mode 100644 index 0000000000..536d5252d5 --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52352.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 4 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx6306.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx6306.s index b986536809..204d6a2150 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx6306.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx6306.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_nw32f61242.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_nw32f61242.s new file mode 100644 index 0000000000..8150b2440a --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_nw32f61242.s @@ -0,0 +1,259 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_10.s +; Version : $Rev:: 8105 $ +; Date : $Date:: 2024-09-05 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F61244, HT32F61245 +; NW32F61242 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <24=> HT32F61244/45 +;// <24=> NW32F61242 +USE_HT32_CHIP_SET EQU 24 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00061244 +;_HT32FWID EQU 0x00061245 +;_HT32FWID EQU 0x00061242 + +HT32F61244_45 EQU 24 +NW32F61242 EQU 24 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-8192:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + DCD _RESERVED ; 07, 23, 0x05C, + DCD ADC_IRQHandler ; 08, 24, 0x060, + DCD _RESERVED ; 09, 25, 0x064, + DCD _RESERVED ; 10, 26, 0x068, + DCD _RESERVED ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD _RESERVED ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD QSPI_IRQHandler ; 22, 38, 0x098, + DCD _RESERVED ; 23, 39, 0x09C, + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD _RESERVED ; 26, 42, 0x0A8, + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + DCD _RESERVED ; 28, 44, 0x0B0, + DCD _RESERVED ; 29, 45, 0x0B4, + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP + +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP + +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT LVD_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +ADC_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +SPI0_IRQHandler +QSPI_IRQHandler +UART0_IRQHandler +MIDI_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_01.s index 13adc8cdcc..f3f551a4c2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -24,10 +24,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 */ .equ USE_HT32_CHIP_SET, 0 @@ -71,12 +81,15 @@ .equ _HT32FWID, 0x00000006 .equ _HT32FWID, 0x00061352 .equ _HT32FWID, 0x00032003 + .equ _HT32FWID, 0x0003200F .equ _HT32FWID, 0x00062030 .equ _HT32FWID, 0x00062040 .equ _HT32FWID, 0x00062050 + .equ _HT32FWID, 0x00062140 .equ _HT32FWID, 0x00067741 .equ _HT32FWID, 0x00067232 - .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00059045 */ .equ HT32F52220_30, 1 @@ -89,12 +102,17 @@ .equ HT32F0006, 10 .equ HT32F61352, 10 .equ HT50F32003, 4 + .equ HT50F3200U, 2 .equ HT32F62030, 1 .equ HT32F62040, 2 .equ HT32F62050, 5 + .equ HT32F62140, 2 .equ HT32F67741, 2 .equ HT32F67232, 1 .equ HT32F67233, 1 + .equ HT32F59045, 2 + .equ MXTX52231, 2 + .equ MXTX52352, 4 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_02.s index 1521f84226..f35f677f24 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_02.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,8 +20,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 */ .equ USE_HT32_CHIP_SET, 0 @@ -49,8 +49,8 @@ .equ _HT32FWID, 0x00059041 .equ _HT32FWID, 0x000F5032 .equ _HT32FWID, 0x00061641 - .equ _HT32FWID, 0x00059046 .equ _HT32FWID, 0x00061041 + .equ _HT32FWID, 0x00061741 */ .equ HT32F50220_30, 7 @@ -59,8 +59,8 @@ .equ HT32F59041, 8 .equ HF5032, 7 .equ HT32F61641, 8 - .equ HT32F59046, 8 .equ HT32F61041, 8 + .equ HT32F61741, 8 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_05.s index 1618d4b1c0..4bf6a4bba2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_05.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,6 +20,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 */ .equ USE_HT32_CHIP_SET, 0 @@ -45,6 +49,8 @@ .equ _HT32FWID, 0x00005828 .equ _HT32FWID, 0x00067742 .equ _HT32FWID, 0x00059746 + .equ _HT32FWID, 0x00057541 + .equ _HT32FWID, 0x00057552 */ .equ HT32F57331_41, 13 @@ -53,6 +59,8 @@ .equ HT32F5828, 14 .equ HT32F67742, 13 .equ HT32F59746, 13 + .equ HT32F57541, 13 + .equ HT32F57552, 14 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_10.s index c2fb7bd028..486ddf7400 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_10.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_10.s -; Version : $Rev:: 6601 $ -; Date : $Date:: 2022-12-27 #$ +; Version : $Rev:: 8101 $ +; Date : $Date:: 2024-09-04 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,6 +23,7 @@ ;// HT32 Device ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 */ .equ USE_HT32_CHIP_SET, 0 @@ -29,9 +31,11 @@ /* .equ _HT32FWID, 0x00061244 .equ _HT32FWID, 0x00061245 + .equ _HT32FWID, 0x00061242 */ .equ HT32F61244_45, 24 + .equ NW32F61242, 24 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_13.s index 649b402684..d8e743f9c3 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_13.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -17,6 +17,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 */ .equ USE_HT32_CHIP_SET, 0 @@ -35,11 +37,13 @@ .equ _HT32FWID, 0x00050030 .equ _HT32FWID, 0x00061630 .equ _HT32FWID, 0x00061030 + .equ _HT32FWID, 0x00061730 */ .equ HT32F50020_30, 25 .equ HT32F61630, 25 .equ HT32F61030, 25 + .equ HT32F61730, 25 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_14.s index 335d485622..a4c44a90e7 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_14.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 */ .equ USE_HT32_CHIP_SET, 0 @@ -33,10 +35,12 @@ .equ _HT32FWID, 0x00050452 .equ _HT32FWID, 0x00050431 .equ _HT32FWID, 0x00050441 + .equ _HT32FWID, 0x00061052 */ .equ HT32F50442_52, 26 .equ HT32F50431_41, 30 + .equ HT32F61052, 26 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_16.s index 01f644a0a3..710e4a36d2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_16.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_16.s -; Version : $Rev:: 7094 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -138,7 +138,7 @@ __cs3_interrupt_vector_cortex_m: .long BFTM1_IRQHandler /* 17, 33, 0x084, */ .long CMP0_IRQHandler /* 18, 34, 0x088, */ .long CMP1_IRQHandler /* 19, 35, 0x08C, */ - .long PID_IRQHandler /* 20, 36, 0x090, */ + .long PID0_IRQHandler /* 20, 36, 0x090, */ .long I2C0_IRQHandler /* 21, 37, 0x094, */ .long SPI0_IRQHandler /* 22, 38, 0x098, */ .long USART0_IRQHandler /* 23, 39, 0x09C, */ @@ -243,7 +243,7 @@ Default_Handler: IRQ BFTM1_IRQHandler IRQ CMP0_IRQHandler IRQ CMP1_IRQHandler - IRQ PID_IRQHandler + IRQ PID0_IRQHandler IRQ I2C0_IRQHandler IRQ SPI0_IRQHandler IRQ USART0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_17.s index 47dac68db7..07095a16a0 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_17.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_17.s -; Version : $Rev:: 7030 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,7 +21,7 @@ /* ;// HT32 Device ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 */ .equ USE_HT32_CHIP_SET, 0 @@ -31,7 +31,7 @@ .equ _HT32FWID, 0x00052244 */ - .equ HT32F52234_44, 33 + .equ HT32F52234_44, 35 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s index 6ef935fb93..7dcf618302 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -24,10 +24,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 */ .equ USE_HT32_CHIP_SET, 0 @@ -71,12 +81,15 @@ .equ _HT32FWID, 0x00000006 .equ _HT32FWID, 0x00061352 .equ _HT32FWID, 0x00032003 + .equ _HT32FWID, 0x0003200F .equ _HT32FWID, 0x00062030 .equ _HT32FWID, 0x00062040 .equ _HT32FWID, 0x00062050 + .equ _HT32FWID, 0x00062140 .equ _HT32FWID, 0x00067741 .equ _HT32FWID, 0x00067232 - .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00059045 */ .equ HT32F52220_30, 1 @@ -89,12 +102,17 @@ .equ HT32F0006, 10 .equ HT32F61352, 10 .equ HT50F32003, 4 + .equ HT50F3200U, 2 .equ HT32F62030, 1 .equ HT32F62040, 2 .equ HT32F62050, 5 + .equ HT32F62140, 2 .equ HT32F67741, 2 .equ HT32F67232, 1 .equ HT32F67233, 1 + .equ HT32F59045, 2 + .equ MXTX52231, 2 + .equ MXTX52352, 4 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_02.s index 784c9cef99..b215d283ac 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_02.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,8 +20,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 */ .equ USE_HT32_CHIP_SET, 0 @@ -49,8 +49,8 @@ .equ _HT32FWID, 0x00059041 .equ _HT32FWID, 0x000F5032 .equ _HT32FWID, 0x00061641 - .equ _HT32FWID, 0x00059046 .equ _HT32FWID, 0x00061041 + .equ _HT32FWID, 0x00061741 */ .equ HT32F50220_30, 7 @@ -59,8 +59,8 @@ .equ HT32F59041, 8 .equ HF5032, 7 .equ HT32F61641, 8 - .equ HT32F59046, 8 .equ HT32F61041, 8 + .equ HT32F61741, 8 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_05.s index 5aba9e9f48..1ae1798863 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_05.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,6 +20,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 */ .equ USE_HT32_CHIP_SET, 0 @@ -45,6 +49,8 @@ .equ _HT32FWID, 0x00005828 .equ _HT32FWID, 0x00067742 .equ _HT32FWID, 0x00059746 + .equ _HT32FWID, 0x00057541 + .equ _HT32FWID, 0x00057552 */ .equ HT32F57331_41, 13 @@ -53,6 +59,8 @@ .equ HT32F5828, 14 .equ HT32F67742, 13 .equ HT32F59746, 13 + .equ HT32F57541, 13 + .equ HT32F57552, 14 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_10.s index d6688b4441..ab52e8f7b0 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_10.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_10.s -; Version : $Rev:: 6601 $ -; Date : $Date:: 2022-12-27 #$ +; Version : $Rev:: 8101 $ +; Date : $Date:: 2024-09-04 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,6 +23,7 @@ ;// HT32 Device ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 */ .equ USE_HT32_CHIP_SET, 0 @@ -29,9 +31,11 @@ /* .equ _HT32FWID, 0x00061244 .equ _HT32FWID, 0x00061245 + .equ _HT32FWID, 0x00061242 */ .equ HT32F61244_45, 24 + .equ NW32F61242, 24 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_13.s index 1d5b8a33b1..869e7f3537 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_13.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -17,6 +17,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 */ .equ USE_HT32_CHIP_SET, 0 @@ -35,11 +37,13 @@ .equ _HT32FWID, 0x00050030 .equ _HT32FWID, 0x00061630 .equ _HT32FWID, 0x00061030 + .equ _HT32FWID, 0x00061730 */ .equ HT32F50020_30, 25 .equ HT32F61630, 25 .equ HT32F61030, 25 + .equ HT32F61730, 25 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_14.s index 9a02b727d9..43ed571266 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_14.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_14.s -; Version : $Rev:: 6838 $ -; Date : $Date:: 2023-04-06 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 */ .equ USE_HT32_CHIP_SET, 0 @@ -33,10 +35,12 @@ .equ _HT32FWID, 0x00050452 .equ _HT32FWID, 0x00050431 .equ _HT32FWID, 0x00050441 + .equ _HT32FWID, 0x00061052 */ .equ HT32F50442_52, 26 .equ HT32F50431_41, 30 + .equ HT32F61052, 26 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_16.s index 8cb1f85b48..12f0e3127f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_16.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_16.s -; Version : $Rev:: 7094 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -162,7 +162,7 @@ __interrupt_vector_cortex_m: .long BFTM1_IRQHandler /* 17, 33, 0x084, */ .long CMP0_IRQHandler /* 18, 34, 0x088, */ .long CMP1_IRQHandler /* 19, 35, 0x08C, */ - .long PID_IRQHandler /* 20, 36, 0x090, */ + .long PID0_IRQHandler /* 20, 36, 0x090, */ .long I2C0_IRQHandler /* 21, 37, 0x094, */ .long SPI0_IRQHandler /* 22, 38, 0x098, */ .long USART0_IRQHandler /* 23, 39, 0x09C, */ @@ -301,7 +301,7 @@ Default_Handler: IRQ BFTM1_IRQHandler IRQ CMP0_IRQHandler IRQ CMP1_IRQHandler - IRQ PID_IRQHandler + IRQ PID0_IRQHandler IRQ I2C0_IRQHandler IRQ SPI0_IRQHandler IRQ USART0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_17.s index f19b45b36f..2f8ef4ead2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_17.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_17.s -; Version : $Rev:: 7030 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,7 +21,7 @@ /* ;// HT32 Device ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 */ .equ USE_HT32_CHIP_SET, 0 @@ -31,7 +31,7 @@ .equ _HT32FWID, 0x00052244 */ - .equ HT32F52234_44, 33 + .equ HT32F52234_44, 35 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s index 1fc4bed7a6..e1179462c6 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -42,12 +47,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -67,12 +77,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -84,12 +97,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_02.s index 90e0090688..daf124989c 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_02.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,8 +32,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -45,8 +45,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -54,8 +54,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_05.s index 2d5a99264b..bba37d7b67 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_05.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -30,6 +32,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -41,6 +45,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -48,6 +54,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_10.s index a8289bc68e..e930ae96a2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_10.s @@ -6,27 +6,31 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_10.s -; Version : $Rev:: 5780 $ -; Date : $Date:: 2022-03-28 #$ +; Version : $Rev:: 8101 $ +; Date : $Date:: 2024-09-04 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 ;/* <<< Use Configuration Wizard in Context Menu >>> */ ;// HT32 Device ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00061244 ;_HT32FWID EQU 0x00061245 +;_HT32FWID EQU 0x00061242 HT32F61244_45 EQU 24 +HT32F61242 EQU 24 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_13.s index b573c7b115..45ca9e15d0 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_13.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -31,10 +33,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_14.s index ffd489d97a..2f7dbec068 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_14.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_14.s -; Version : $Rev:: 6834 $ -; Date : $Date:: 2023-03-31 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,6 +23,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -29,9 +31,11 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050452 ;_HT32FWID EQU 0x00050431 ;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 HT32F50442_52 EQU 26 HT32F50431_41 EQU 30 +HT32F61052 EQU 26 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_16.s index 753e6eb165..6d6fa80b87 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_16.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_16.s -; Version : $Rev:: 7212 $ -; Date : $Date:: 2023-09-11 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -105,7 +105,7 @@ __vector_table DCD BFTM1_IRQHandler ; 17, 33, 0x084, DCD CMP0_IRQHandler ; 18, 34, 0x088, DCD CMP1_IRQHandler ; 19, 35, 0x08C, - DCD PID_IRQHandler ; 20, 36, 0x090, + DCD PID0_IRQHandler ; 20, 36, 0x090, DCD I2C0_IRQHandler ; 21, 37, 0x094, DCD SPI0_IRQHandler ; 22, 38, 0x098, DCD USART0_IRQHandler ; 23, 39, 0x09C, @@ -174,7 +174,7 @@ SysTick_Handler PUBWEAK BFTM1_IRQHandler PUBWEAK CMP0_IRQHandler PUBWEAK CMP1_IRQHandler - PUBWEAK PID_IRQHandler + PUBWEAK PID0_IRQHandler PUBWEAK I2C0_IRQHandler PUBWEAK SPI0_IRQHandler PUBWEAK USART0_IRQHandler @@ -207,7 +207,7 @@ BFTM0_IRQHandler BFTM1_IRQHandler CMP0_IRQHandler CMP1_IRQHandler -PID_IRQHandler +PID0_IRQHandler I2C0_IRQHandler SPI0_IRQHandler USART0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_17.s index bfabd93ba9..9db666fdde 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_17.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_17.s -; Version : $Rev:: 7212 $ -; Date : $Date:: 2023-09-11 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,14 +19,14 @@ ;// HT32 Device ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00052234 ;_HT32FWID EQU 0x00052244 -HT32F52234_44 EQU 33 +HT32F52234_44 EQU 35 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_01.s index a667619b58..a2805097bd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -24,10 +24,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 */ .equ USE_HT32_CHIP_SET, 0 @@ -71,12 +81,15 @@ .equ _HT32FWID, 0x00000006 .equ _HT32FWID, 0x00061352 .equ _HT32FWID, 0x00032003 + .equ _HT32FWID, 0x0003200F .equ _HT32FWID, 0x00062030 .equ _HT32FWID, 0x00062040 .equ _HT32FWID, 0x00062050 + .equ _HT32FWID, 0x00062140 .equ _HT32FWID, 0x00067741 .equ _HT32FWID, 0x00067232 - .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00059045 */ .equ HT32F52220_30, 1 @@ -89,12 +102,17 @@ .equ HT32F0006, 10 .equ HT32F61352, 10 .equ HT50F32003, 4 + .equ HT50F3200U, 2 .equ HT32F62030, 1 .equ HT32F62040, 2 .equ HT32F62050, 5 + .equ HT32F62140, 2 .equ HT32F67741, 2 .equ HT32F67232, 1 .equ HT32F67233, 1 + .equ HT32F59045, 2 + .equ MXTX52231, 2 + .equ MXTX52352, 4 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_02.s index 5b5110f922..5615abd163 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_02.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,8 +20,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 */ .equ USE_HT32_CHIP_SET, 0 @@ -49,8 +49,8 @@ .equ _HT32FWID, 0x00059041 .equ _HT32FWID, 0x000F5032 .equ _HT32FWID, 0x00061641 - .equ _HT32FWID, 0x00059046 .equ _HT32FWID, 0x00061041 + .equ _HT32FWID, 0x00061741 */ .equ HT32F50220_30, 7 @@ -59,8 +59,8 @@ .equ HT32F59041, 8 .equ HF5032, 7 .equ HT32F61641, 8 - .equ HT32F59046, 8 .equ HT32F61041, 8 + .equ HT32F61741, 8 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_05.s index 25447b9b1f..20f3a2be81 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_05.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,6 +20,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 */ .equ USE_HT32_CHIP_SET, 0 @@ -45,6 +49,8 @@ .equ _HT32FWID, 0x00005828 .equ _HT32FWID, 0x00067742 .equ _HT32FWID, 0x00059746 + .equ _HT32FWID, 0x00057541 + .equ _HT32FWID, 0x00057552 */ .equ HT32F57331_41, 13 @@ -53,6 +59,8 @@ .equ HT32F5828, 14 .equ HT32F67742, 13 .equ HT32F59746, 13 + .equ HT32F57541, 13 + .equ HT32F57552, 14 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_10.s index d9253dcbca..7d45a71453 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_10.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_10.s -; Version : $Rev:: 6601 $ -; Date : $Date:: 2022-12-27 #$ +; Version : $Rev:: 8101 $ +; Date : $Date:: 2024-09-04 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,6 +23,7 @@ ;// HT32 Device ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 */ .equ USE_HT32_CHIP_SET, 0 @@ -29,9 +31,11 @@ /* .equ _HT32FWID, 0x00061244 .equ _HT32FWID, 0x00061245 + .equ _HT32FWID, 0x00061242 */ .equ HT32F61244_45, 24 + .equ NW32F61242, 24 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_13.s index 8c3a524ef1..68cc2d3ce4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_13.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -17,6 +17,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 */ .equ USE_HT32_CHIP_SET, 0 @@ -35,11 +37,13 @@ .equ _HT32FWID, 0x00050030 .equ _HT32FWID, 0x00061630 .equ _HT32FWID, 0x00061030 + .equ _HT32FWID, 0x00061730 */ .equ HT32F50020_30, 25 .equ HT32F61630, 25 .equ HT32F61030, 25 + .equ HT32F61730, 25 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_14.s index 530eb0949f..a55ad72c13 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_14.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 */ .equ USE_HT32_CHIP_SET, 0 @@ -33,10 +35,12 @@ .equ _HT32FWID, 0x00050452 .equ _HT32FWID, 0x00050431 .equ _HT32FWID, 0x00050441 + .equ _HT32FWID, 0x00061052 */ .equ HT32F50442_52, 26 .equ HT32F50431_41, 30 + .equ.HT32F61052, 26 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_16.s index 81260f6c78..da44c1d66a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_16.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_16.s -; Version : $Rev:: 7094 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -108,7 +108,7 @@ _vectors: .long BFTM1_IRQHandler /* 17, 33, 0x084, */ .long CMP0_IRQHandler /* 18, 34, 0x088, */ .long CMP1_IRQHandler /* 19, 35, 0x08C, */ - .long PID_IRQHandler /* 20, 36, 0x090, */ + .long PID0_IRQHandler /* 20, 36, 0x090, */ .long I2C0_IRQHandler /* 21, 37, 0x094, */ .long SPI0_IRQHandler /* 22, 38, 0x098, */ .long USART0_IRQHandler /* 23, 39, 0x09C, */ @@ -205,7 +205,7 @@ Default_Handler: IRQ BFTM1_IRQHandler IRQ CMP0_IRQHandler IRQ CMP1_IRQHandler - IRQ PID_IRQHandler + IRQ PID0_IRQHandler IRQ I2C0_IRQHandler IRQ SPI0_IRQHandler IRQ USART0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_17.s index d5be1f4cd5..91206a4f1f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_17.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_17.s -; Version : $Rev:: 7030 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,7 +21,7 @@ /* ;// HT32 Device ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 */ .equ USE_HT32_CHIP_SET, 0 @@ -31,7 +31,7 @@ .equ _HT32FWID, 0x00052244 */ - .equ HT32F52234_44, 33 + .equ HT32F52234_44, 35 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c index e6f4c361e5..fa205a5a62 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6597 $ - * @date $Date:: 2022-12-27 #$ + * @version $Rev:: 7848 $ + * @date $Date:: 2024-07-16 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -30,6 +30,7 @@ // HT32F52342, HT32F52352 // HT32F52243, HT32F52253 // HT50F32003 +// MXTX52352 //#define USE_HT32F52220_30 //#define USE_HT32F52231_41 @@ -37,6 +38,7 @@ //#define USE_HT32F52342_52 //#define USE_HT32F52243_53 //#define USE_HT50F32003 +//#define USE_MXTX52352 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c index f864735544..5c14d07f8e 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6953 $ - * @date $Date:: 2023-05-30 #$ + * @version $Rev:: 7848 $ + * @date $Date:: 2024-07-16 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -30,8 +30,12 @@ // HT32F52342, HT32F52352 // HT32F52243, HT32F52253 // HT32F62030, HT32F62040, HT32F62050 +// HT32F62140, // HT32F67232, HT32F67233 // HT32F67741, +// HT50F3200U +// HT32F59045 +// MXTX52231 //#define USE_HT32F52220_30 //#define USE_HT32F52231_41 @@ -41,9 +45,13 @@ //#define USE_HT32F62030 //#define USE_HT32F62040 //#define USE_HT32F62050 +//#define USE_HT32F62140 //#define USE_HT32F67232 //#define USE_HT32F67233 //#define USE_HT32F67741 +//#define USE_HT50F3200U +//#define USE_HT32F59045 +//#define USE_MXTX52231 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c index b709d27c6f..18d8b71531 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 7119 $ - * @date $Date:: 2023-08-15 #$ + * @version $Rev:: 7704 $ + * @date $Date:: 2024-05-10 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -30,8 +30,8 @@ // HT32F59041 // HF5032 // HT32F61641 -// HT32F59046 // HT32F61041 +// HT32F61741 //#define USE_HT32F50220_30 //#define USE_HT32F50231_41 @@ -39,8 +39,8 @@ //#define USE_HT32F59041 //#define USE_HF5032 //#define USE_HT32F61641 -//#define USE_HT32F59046 //#define USE_HT32F61041 +//#define USE_HT32F61741 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c index e0460f199e..f17e3637b3 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6993 $ - * @date $Date:: 2023-06-26 #$ + * @version $Rev:: 7935 $ + * @date $Date:: 2024-08-08 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -30,6 +30,8 @@ // HT32F5828 // HT32F67742 // HT32F59746 +// HT32F57541 +// HT32F57552 //#define USE_HT32F57331_41 //#define USE_HT32F57342_52 @@ -37,6 +39,8 @@ //#define USE_HT32F5828 //#define USE_HT32F67742 //#define USE_HT32F59746 +//#define USE_HT32F57541 +//#define USE_HT32F57552 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c index 704ebb5730..60bc450dfd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6597 $ - * @date $Date:: 2022-12-27 #$ + * @version $Rev:: 8101 $ + * @date $Date:: 2024-09-04 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -25,8 +25,10 @@ // Supported Device // ======================================== // HT32F61244, HT32F61245 +// NW32F61242 //#define USE_HT32F61244_45 +//#define USE_NW32F61242 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c index c906eb1640..f4a0e62ce5 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 7119 $ - * @date $Date:: 2023-08-15 #$ + * @version $Rev:: 7704 $ + * @date $Date:: 2024-05-10 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -27,10 +27,12 @@ // HT32F50020, HT32F50030 // HT32F61630 // HT32F61030 +// HT32F61730 //#define USE_HT32F50020_30 //#define USE_HT32F61630 //#define USE_HT32F61030 +//#define USE_HT32F61730 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c index 2dc4216f4b..0cba0c6c51 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6790 $ - * @date $Date:: 2023-03-13 #$ + * @version $Rev:: 8287 $ + * @date $Date:: 2024-11-27 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -26,9 +26,11 @@ // ======================================== // HT32F50442, HT32F50452 // HT32F50431, HT32F50441 +// HT32F61052 //#define USE_HT32F50442_52 //#define USE_HT32F50431_41 +//#define USE_HT32F61052 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c index ba5073e76f..ef0dd2ec67 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 7413 $ - * @date $Date:: 2023-12-15 #$ + * @version $Rev:: 7610 $ + * @date $Date:: 2024-02-27 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -24,19 +24,10 @@ // Supported Device // ======================================== -// HT32F0008 -// HT32F52142 -// HT32F52344, HT32F52354 -// HT32F52357, HT32F52367 -// HT32F65230, HT32F65240 -// HT50F3200T +// BM18B367A + -//#define USE_HT32F0008 -//#define USE_HT32F52142 -//#define USE_HT32F52344_54 //#define USE_HT32F52357_67 -//#define USE_HT32F65230_40 -//#define USE_HT50F3200T /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_can_config0_calc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_can_config0_calc.h new file mode 100644 index 0000000000..6ff016f06c --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_can_config0_calc.h @@ -0,0 +1,385 @@ +/*********************************************************************************************************//** + * @file ht32_can_config0_calc.h + * @version $Rev:: 8147 $ + * @date $Date:: 2024-09-16 #$ + * @brief The CAN config calculation features. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32_CAN_CONFIG0_CALC_H +#define __HT32_CAN_CONFIG0_CALC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Settings ------------------------------------------------------------------------------------------------*/ +#define CAN_CF0_CALC_DEBUG (0) + +/*----------------------------------------------------------------------------------------------------------*/ +/* CAN Parameter Calculation */ +/* !!! DO NOT MODIFY !!! */ +/*----------------------------------------------------------------------------------------------------------*/ +#if (HTCFG_CAN_CORECLKSEL == 0) + #define _HTCFG_CAN_CORE_CLK (LIBCFG_MAX_SPEED) +#else + #define _HTCFG_CAN_CORE_CLK (HTCFG_CAN_CORECLK_MANUAL) +#endif + +#define _HTCFG_CF0_CK_CAN (_HTCFG_CAN_CORE_CLK / (1 << HTCFG_CAN_CF0_CLK_DIV)) + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (25UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 25 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (24UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 24 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (23UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 23 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (22UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 22 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (21UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 21 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (20UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 20 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (19UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 19 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (18UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 18 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (17UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 17 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (16UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 16 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (15UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 15 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (14UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 14 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (13UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 13 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (12UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 12 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (11UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 11 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (10UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 10 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (9UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 9 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (8UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 8 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #error Can't find the suitable Nominal Bit Time setting. Try to increase CK_CAN or lower the CAN Baudrate. +#endif + +/* define value for CAN_Init() */ +#define CAN_CONF0_PRESCALER (_HTCFG_CF0_CK_CAN / (HTCFG_CAN_CF0_BAUDRATE * HTCFG_CAN_CF0_NOMINAL_BIT_TIME)) +#define CAN_CONF0_BIT_TIME_TSEG1 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME - (HTCFG_CAN_CF0_NOMINAL_BIT_TIME * HTCFG_CAN_CF0_SAMPLE_POINT) / 100) +#define CAN_CONF0_BIT_TIME_TSEG0 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME - 1 - CAN_CONF0_BIT_TIME_TSEG1) +#define CAN_CONF0_BIT_TIME_SJW (HTCFG_CAN_CF0_BIT_TIME_SJW) + +/*----------------------------------------------------------------------------------------------------------*/ +/* CAN Parameter Checking */ +/* !!! DO NOT MODIFY !!! */ +/*----------------------------------------------------------------------------------------------------------*/ +#if (CAN_CONF0_PRESCALER < 1) + #error CAN Config 0 "Prescaler" value out of spec (must >= 1)! Try to lower the Nominal Bit Time or CAN Baudrate. +#endif + +#if (CAN_CONF0_PRESCALER > 1024) + #error CAN Config 0 "Prescaler" value out of spec (must <= 1024)! +#endif + +#if (CAN_CONF0_BIT_TIME_TSEG0 > 16) + #error CAN Config 0 "TSEG0" value out of spec (must <= 16)! +#endif + +#if (CAN_CONF0_BIT_TIME_TSEG1 > 8) + #if (HTCFG_CAN_CF0_NOMINAL_BIT_TIME < 16) + #error CAN Config 0 "TSEG1" value out of spec (must <= 8)! May try to larger the Sample Point. + #else + + // Reduce HTCFG_CAN_CF0_NOMINAL_BIT_TIME and try again + #undef CAN_CONF0_PRESCALER + #undef CAN_CONF0_BIT_TIME_TSEG1 + #undef CAN_CONF0_BIT_TIME_TSEG0 + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME2 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME/2) + #define CAN_CONF0_PRESCALER (_HTCFG_CF0_CK_CAN / (HTCFG_CAN_CF0_BAUDRATE * HTCFG_CAN_CF0_NOMINAL_BIT_TIME2)) + #define CAN_CONF0_BIT_TIME_TSEG1 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME2 - (HTCFG_CAN_CF0_NOMINAL_BIT_TIME2 * HTCFG_CAN_CF0_SAMPLE_POINT) / 100) + #define CAN_CONF0_BIT_TIME_TSEG0 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME2 - 1 - CAN_CONF0_BIT_TIME_TSEG1) + + #if (CAN_CONF0_BIT_TIME_TSEG1 > 8) + #error CAN Config 0 "TSEG1" value out of spec (must <= 8)! May try to lager the Sample Point. + #endif + + #endif +#endif + +#if (CAN_CONF0_BIT_TIME_TSEG1 > 4) + #define CAN_CONF0_BIT_TIME_SJW_MAX (4) +#else + #define CAN_CONF0_BIT_TIME_SJW_MAX CAN_CONF0_BIT_TIME_TSEG1 +#endif + +#if (HTCFG_CAN_CF0_BIT_TIME_SJW > CAN_CONF0_BIT_TIME_SJW_MAX) + #error CAN Config 0 "SJW" value out of spec (must <= 4 and TSEG1)! +#endif + +/*----------------------------------------------------------------------------------------------------------*/ +/* CAN Config Check function */ +/*----------------------------------------------------------------------------------------------------------*/ +#if (HTCFG_CAN_CONF_CHECK_ENABLE == 1) +__STATIC_INLINE void CAN_Config0_Check(void) +{ + u32 Core_Clock = _HTCFG_CAN_CORE_CLK; + u32 IPPrescaler = (1 << HTCFG_CAN_CF0_CLK_DIV); + u32 CK_CAN = Core_Clock / IPPrescaler; + u32 BRP = CAN_CONF0_PRESCALER; + u32 ftq = CK_CAN / BRP; + u32 TSEG0 = CAN_CONF0_BIT_TIME_TSEG0; + u32 TSEG1 = CAN_CONF0_BIT_TIME_TSEG1; + u32 NBT = (1 + TSEG0 + TSEG1); + u32 SamplePoint = ((NBT - TSEG1) * 100) / NBT; + u32 Baudrate = ftq / (1 + TSEG0 + TSEG1) ; + + RETARGET_Configuration(); + + printf("HT32 CAN Config 0 Check\r\n"); + printf("---------------------------------------------\r\n"); + printf(" Core Clock (CK_AHB, Hz) = %d\r\n", Core_Clock); + printf(" CAN IP Prescaler = %d\r\n", IPPrescaler); + printf(" CAN IP Clock (CK_CAN, Hz) = %d\r\n", CK_CAN); + printf(" CAN Prescaler (BRP) = %d\r\n", BRP); + printf(" 1 / time quantum (1/tq, Hz) = %d\r\n", ftq); + printf(" Prop_Seg + Phase_Seg0 = %d\r\n", TSEG0); + printf(" Phase_Seg1 = %d\r\n", TSEG1); + printf(" Nominal Bit Time(NBT, calc) = %d tq\r\n", HTCFG_CAN_CF0_NOMINAL_BIT_TIME); + printf(" Nominal Bit Time(NBT, real) = %d tq\r\n", NBT); + printf(" Sample Point (setting) = %d %%\r\n", HTCFG_CAN_CF0_SAMPLE_POINT); + printf(" Sample Point (real) = %d %%\r\n", SamplePoint); + printf(" CAN BAUDRATE (setting, Hz) = %d\r\n", HTCFG_CAN_CF0_BAUDRATE); + printf(" CAN BAUDRATE (real, Hz) = %d\r\n", Baudrate); + printf("\r\n"); + printf("Please check the above setting is as expected....\r\n\r\n"); +} +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h index 8919d357bc..5edace51cb 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_cm0plus_misc.h - * @version $Rev:: 750 $ - * @date $Date:: 2016-05-31 #$ + * @version $Rev:: 7802 $ + * @date $Date:: 2024-07-01 #$ * @brief All the function prototypes for the miscellaneous firmware library. ************************************************************************************************************* * @attention @@ -112,6 +112,11 @@ void SYSTICK_CounterCmd(u32 SysTick_Counter); void SYSTICK_IntConfig(ControlStatus NewState); void SYSTICK_SetReloadValue(u32 SysTick_Reload); u32 RBIT(u32 in); +#if (HTCFG_STACK_USAGE_ANALYSIS == 1) +void StackUsageAnalysisInit(u32 addr); +#else +#define StackUsageAnalysisInit(...) +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_config.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_config.h index bd4e561247..3ff43db6d6 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_config.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_config.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_config.h - * @version $Rev:: 7125 $ - * @date $Date:: 2023-08-16 #$ + * @version $Rev:: 8288 $ + * @date $Date:: 2024-11-27 #$ * @brief Configuration file of HT32. ************************************************************************************************************* * @attention @@ -200,6 +200,16 @@ #define USE_MEM_HT32F52367 #endif +#ifdef USE_HT50F3200U_SK + #define USE_HT32F62140_SK +#endif +#ifdef USE_HT50F3200U + #define USE_HT32F62140 +#endif +#ifdef USE_MEM_HT50F3200U + #define USE_MEM_HT32F62140 +#endif + #ifdef USE_HT32F62030_SK #define USE_HT32F52230_SK #endif @@ -220,6 +230,16 @@ #define USE_MEM_HT32F52241 #endif +#ifdef USE_HT32F62140_SK + #define USE_HT32F52241_SK +#endif +#ifdef USE_HT32F62140 + #define USE_HT32F52231_41 +#endif +#ifdef USE_MEM_HT32F62140 + #define USE_MEM_HT32F52241 +#endif + #ifdef USE_HT32F62050_SK #define USE_HT32F52253_SK #endif @@ -260,14 +280,14 @@ #define USE_MEM_HT32F57341 #endif -#ifdef USE_HT32F59046_SK - #define USE_HT32F50241_SK +#ifdef USE_HT32F59045_SK + #define USE_HT32F52241_SK #endif -#ifdef USE_HT32F59046 - #define USE_HT32F50231_41 +#ifdef USE_HT32F59045 + #define USE_HT32F52231_41 #endif -#ifdef USE_MEM_HT32F59046 - #define USE_MEM_HT32F50241 +#ifdef USE_MEM_HT32F59045 + #define USE_MEM_HT32F52241 #endif #ifdef USE_HT32F59746_SK @@ -300,6 +320,66 @@ #define USE_MEM_HT32F50241 #endif +#ifdef USE_HT32F61730_SK + #define USE_HT32F50030_SK +#endif +#ifdef USE_HT32F61730 + #define USE_HT32F50020_30 +#endif +#ifdef USE_MEM_HT32F61730 + #define USE_MEM_HT32F50030 +#endif + +#ifdef USE_HT32F61741_SK + #define USE_HT32F50241_SK +#endif +#ifdef USE_HT32F61741 + #define USE_HT32F50231_41 +#endif +#ifdef USE_MEM_HT32F61741 + #define USE_MEM_HT32F50241 +#endif + +#ifdef USE_MXTX52231_SK + #define USE_HT32F52241_SK +#endif +#ifdef USE_MXTX52231 + #define USE_HT32F52231_41 +#endif +#ifdef USE_MEM_MXTX52231 + #define USE_MEM_HT32F52241 +#endif + +#ifdef USE_MXTX52352_SK + #define USE_HT32F52352_SK +#endif +#ifdef USE_MXTX52352 + #define USE_HT32F52342_52 +#endif +#ifdef USE_MEM_MXTX52352 + #define USE_MEM_HT32F52352 +#endif + +#ifdef USE_NW32F61242_SK + #define USE_HT32F61245_SK +#endif +#ifdef USE_NW32F61242 + #define USE_HT32F61244_45 +#endif +#ifdef USE_MEM_NW32F61242 + #define USE_MEM_HT32F61245 +#endif + +#ifdef USE_HT32F61052_SK + #define USE_HT32F50452_SK +#endif +#ifdef USE_HT32F61052 + #define USE_HT32F50442_52 +#endif +#ifdef USE_MEM_HT32F61052 + #define USE_MEM_HT32F50452 +#endif + #ifdef __cplusplus } #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_dependency.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_dependency.h index d96ecb9c3c..518d99be5c 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_dependency.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_dependency.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_dependency.h - * @version $Rev:: 5863 $ - * @date $Date:: 2022-05-12 #$ + * @version $Rev:: 7593 $ + * @date $Date:: 2024-02-22 #$ * @brief The header file of dependency check. ************************************************************************************************************* * @attention @@ -41,14 +41,22 @@ #if 0 // Version setting example for module /* Dependency check ----------------------------------------------------------------------------------------*/ -#if (__CORTEX_M == 0) +#if defined(__HT32L5XXXX_LIB_H) +#define MIN_HT32_FWLIB_VER (0x01000000) //0xmmnnnrrr -> Vm.n.r +#define MIN_HT32_FWLIB_SVN (0x209) +#endif +#if defined(__HT32F5XXXX_LIB_H) #define MIN_HT32_FWLIB_VER (0x01000024) //0xmmnnnrrr -> Vm.n.r #define MIN_HT32_FWLIB_SVN (0x5762) #endif -#if (__CORTEX_M == 3) +#if defined(__HT32F1XXXX_LIB_H) #define MIN_HT32_FWLIB_VER (0x01000009) //0xmmnnnrrr -> Vm.n.r #define MIN_HT32_FWLIB_SVN (0x2556) #endif +#if defined(__HT32F4XXXX_LIB_H) +#define MIN_HT32_FWLIB_VER (0x01000000) //0xmmnnnrrr -> Vm.n.r +#define MIN_HT32_FWLIB_SVN (0x336) +#endif #include "ht32_dependency.h" // Not exist means the version of HT32 Firmware Library is older than the module required. #endif @@ -62,7 +70,7 @@ #endif -// Check "ht32fxxxxx_lib.h" for the version of HT32 Firmwar Library +// Check "ht32f5xxxx_lib.h" for the version of HT32 Firmwar Library #if (HT32_FWLIB_VER != 999999) #if HT32_FWLIB_VER < MIN_HT32_FWLIB_VER #error !!! The version of HT32 Firmware Library is older than the module required. Please update HT32 Firmware Library. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_time.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_time.h index 51aeba2c3e..1640af5c09 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_time.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_time.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_time.h - * @version $Rev:: 6751 $ - * @date $Date:: 2023-03-02 #$ + * @version $Rev:: 7693 $ + * @date $Date:: 2024-04-02 #$ * @brief The header file of time function. ************************************************************************************************************* * @attention @@ -132,23 +132,23 @@ #define TIME_TICKDIFF(start, current) ((current >= start) ? (u32)(current - start) : (u32)(0xFFFFFFFF - start + 1 + current)) #if (HTCFG_TIME_TICKHZ < 1000000) -#define TIME_US2TICK(us) (us / (1000000UL / HTCFG_TIME_TICKHZ)) -#define TIME_TICK2US(t) (t * (1000000UL / HTCFG_TIME_TICKHZ)) +#define TIME_US2TICK(us) ((us) / (1000000UL / HTCFG_TIME_TICKHZ)) +#define TIME_TICK2US(t) ((t) * (1000000UL / HTCFG_TIME_TICKHZ)) #else -#define TIME_US2TICK(us) (us * (HTCFG_TIME_TICKHZ / 1000000UL)) -#define TIME_TICK2US(t) (t / (HTCFG_TIME_TICKHZ / 1000000UL)) +#define TIME_US2TICK(us) ((us) * (HTCFG_TIME_TICKHZ / 1000000UL)) +#define TIME_TICK2US(t) ((t) / (HTCFG_TIME_TICKHZ / 1000000UL)) #endif #if (HTCFG_TIME_TICKHZ < 1000) -#define TIME_MS2TICK(ms) (ms / (1000UL / HTCFG_TIME_TICKHZ)) -#define TIME_TICK2MS(t) (t * (1000UL / HTCFG_TIME_TICKHZ)) +#define TIME_MS2TICK(ms) ((ms) / (1000UL / HTCFG_TIME_TICKHZ)) +#define TIME_TICK2MS(t) ((t) * (1000UL / HTCFG_TIME_TICKHZ)) #else -#define TIME_MS2TICK(ms) (ms * (HTCFG_TIME_TICKHZ / 1000UL)) -#define TIME_TICK2MS(t) (t / (HTCFG_TIME_TICKHZ / 1000UL)) +#define TIME_MS2TICK(ms) ((ms) * (HTCFG_TIME_TICKHZ / 1000UL)) +#define TIME_TICK2MS(t) ((t) / (HTCFG_TIME_TICKHZ / 1000UL)) #endif -#define TIME_S2TICK(s) (s * (u32)(HTCFG_TIME_TICKHZ)) -#define TIME_TICK2S(t) (t / (HTCFG_TIME_TICKHZ)) +#define TIME_S2TICK(s) ((s) * (u32)(HTCFG_TIME_TICKHZ)) +#define TIME_TICK2S(t) ((t) / (HTCFG_TIME_TICKHZ)) #define GET_CNT() (_HTCFG_TIME_PORT->CNTR) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50020_30_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50020_30_libcfg.h index 44d05bdcc9..dddf5d4e07 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50020_30_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50020_30_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f50020_30_libcfg.h - * @version $Rev:: 6386 $ - * @date $Date:: 2022-10-27 #$ + * @version $Rev:: 7661 $ + * @date $Date:: 2024-03-21 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -52,6 +52,7 @@ #define LIBCFG_GPIOC (1) #define LIBCFG_GPIOF (1) +#define LIBCFG_GPIO_SINK_CURRENT_ENHANCED (1) #define LIBCFG_LEDC (1) #define LIBCFG_LSE (1) #define LIBCFG_SCTM0 (1) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h index 2e13c2bea0..c8fc4b8afe 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f50343_libcfg.h - * @version $Rev:: 6386 $ - * @date $Date:: 2022-10-27 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50431_41_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50431_41_libcfg.h index 9c3bb3bb39..44898e5dd8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50431_41_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50431_41_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f50431_41_libcfg.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -90,6 +90,5 @@ #define LIBCFG_ADC_MVDDA (1) #define LIBCFG_USART_LIN (1) #define LIBCFG_USART_SINGLE_WIRE (1) -#define LIBCFG_GPIO_SINK_CURREMT_ENHANCED (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50442_52_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50442_52_libcfg.h index 6a3cff8ab6..d601c4699a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50442_52_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50442_52_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f50442_52_libcfg.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -80,6 +80,7 @@ #define LIBCFG_CKCU_ATM_V01 (1) #define LIBCFG_CKCU_SYS_CK_60M (1) #define LIBCFG_CKCU_REFCLK_EXT_PIN (1) +#define LIBCFG_CMP_IVREF_CN_IN (1) #define LIBCFG_PWRCU_VDD_5V (1) #define LIBCFG_PWRCU_WAKEUP1 (1) #define LIBCFG_PWRCU_WAKEUP_V01 (1) @@ -94,6 +95,5 @@ #define LIBCFG_ADC_MVDDA (1) #define LIBCFG_USART_LIN (1) #define LIBCFG_USART_SINGLE_WIRE (1) -#define LIBCFG_GPIO_SINK_CURREMT_ENHANCED (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53231_41_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53231_41_libcfg.h index 43068a9c12..839f61da6f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53231_41_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53231_41_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f53231_41_libcfg.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -91,6 +91,5 @@ #define LIBCFG_ADC_MVDDA (1) #define LIBCFG_USART_LIN (1) #define LIBCFG_USART_SINGLE_WIRE (1) -#define LIBCFG_GPIO_SINK_CURREMT_ENHANCED (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53242_52_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53242_52_libcfg.h index c2493ba610..bd9dc9cb51 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53242_52_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53242_52_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f53242_52_libcfg.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -81,6 +81,7 @@ #define LIBCFG_CKCU_ATM_V01 (1) #define LIBCFG_CKCU_SYS_CK_60M (1) #define LIBCFG_CKCU_REFCLK_EXT_PIN (1) +#define LIBCFG_CMP_IVREF_CN_IN (1) #define LIBCFG_PWRCU_VDD_5V (1) #define LIBCFG_PWRCU_WAKEUP1 (1) #define LIBCFG_PWRCU_WAKEUP_V01 (1) @@ -95,6 +96,5 @@ #define LIBCFG_ADC_MVDDA (1) #define LIBCFG_USART_LIN (1) #define LIBCFG_USART_SINGLE_WIRE (1) -#define LIBCFG_GPIO_SINK_CURREMT_ENHANCED (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54231_41_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54231_41_libcfg.h index 671765ef1b..d5876b4d50 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54231_41_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54231_41_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f54231_41_libcfg.h - * @version $Rev:: 7184 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -64,7 +64,6 @@ #define LIBCFG_FMC_PREFETCH (1) #define LIBCFG_FMC_WAIT_STATE_2 (1) #define LIBCFG_GPIOC (1) -#define LIBCFG_GPIO_SINK_CURRENT_ENHANCED (1) #define LIBCFG_I2C1 (1) #define LIBCFG_LEDC (1) #define LIBCFG_LEDC_NO_COM_8_11 (1) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54243_53_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54243_53_libcfg.h index 750e4fb377..d92296ea52 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54243_53_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54243_53_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f54243_53_libcfg.h - * @version $Rev:: 6896 $ - * @date $Date:: 2023-05-08 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -66,7 +66,6 @@ #define LIBCFG_FMC_WAIT_STATE_2 (1) #define LIBCFG_GPIOC (1) #define LIBCFG_GPIOD (1) -#define LIBCFG_GPIO_SINK_CURRENT_ENHANCED (1) #define LIBCFG_I2C1 (1) #define LIBCFG_I2C2 (1) #define LIBCFG_LEDC (1) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h index c50babaa1a..dc06ae3145 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_adc.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7678 $ + * @date $Date:: 2024-04-01 #$ * @brief The header file of the ADC library. ************************************************************************************************************* * @attention @@ -634,7 +634,7 @@ void ADC_VREFConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_VREF_x); #endif #if (LIBCFG_ADC_VREFBUF) -void ADC_VREFOutputCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState); +void ADC_VREFOutputADVREFPCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState); #endif #if (LIBCFG_ADC_MVDDA) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h index a66d141dd7..465560807b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_can.h - * @version $Rev:: 7188 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8284 $ + * @date $Date:: 2024-11-22 #$ * @brief The header file of the CAN library. ************************************************************************************************************* * @attention @@ -44,66 +44,86 @@ * @{ */ + /* Exported types ------------------------------------------------------------------------------------------*/ /** @defgroup CAN_Exported_Types CAN exported types * @{ */ /** - * @brief CAN message structure - */ + * @brief CAN init structure definition + */ typedef struct { - u32 IdType; - u32 FrameType; - u32 Id; - u32 DLC; -} STR_CANMSG_TypeDef; + u16 CAN_BRPrescaler; /* Synchronisation Jump Width , Range: 1~1024. */ + u8 CAN_Mode; /* CAN_MODE_NORMAL : Normal mode. */ + /* CAN_MODE_BASIC : Basic mode. */ + /* CAN_MODE_SILENT : Silent mode. */ + /* CAN_MODE_LBACK : Loop Back Mode. */ + /* CAN_MODE_MONITORER : Sample Point can be monitored. */ + /* CAN_MODE_TX_DOMINANT : CAN_TX pin drives a dominant. */ + /* CAN_MODE_TX_RECESSIVE : CAN_TX pin drives a recessive. */ + u8 CAN_SJW; /* Synchronisation Jump Width , Range: 1~4. */ + u8 CAN_TSEG0; /* The time segment before the sample point. */ + u8 CAN_TSEG1; /* The time segment after the sample point. */ + ControlStatus CAN_NART; /* Set the no automatic retransmission */ +} CAN_InitTypeDef; /** - * @brief CAN TX message structure + * @brief CAN receive status structure */ -typedef struct +typedef enum { - u32 IdType; - u32 FrameType; - u32 Id; - u32 MCR; - u32 DLC; - u32 EOB; - u32 RMTEN; - u32 UMASK; - u32 Data[8]; -} STR_CANMSG_T_TypeDef; - -/** - * @brief CAN RX message structure - */ -typedef struct -{ - u32 IdType; - u32 Id; - u32 u8Xtd; - u32 u8Dir; - u32 MCR; - u32 MASK0; - u32 MASK1; - u32 EOB; - u32 UMASK; - u32 RMTEN; - u32 DIR; /* For receive remote frame. */ - } STR_CANMSG_R_TypeDef; + MSG_RX_FINISH, + MSG_OBJ_NOT_SET, + MSG_NOT_RECEIVED, + MSG_OVER_RUN +} CAN_RxStatus_TypeDef; /** * @brief CAN mask message structure */ +typedef enum +{ + NO_ERROR = 0, + STUFF_ERROR = 1, + FORM_ERROR = 2, + ACK_ERROR = 3, + BIT1_EROR = 4, + BIT0_ERROR = 5, + CRC_ERROR = 6, + NO_CHANGE = 7 +} CAN_LastErrorCode_TypeDef; + +/** + * @brief Message ID Type Constant structure + */ +typedef enum +{ + CAN_STD_ID = 0, + CAN_EXT_ID = 1 +} CAN_IdType_Enum; + +/** + * @brief Message Frame Type Constant structure + */ +typedef enum +{ + CAN_REMOTE_FRAME = 0, + CAN_DATA_FRAME = 1 +} CAN_FrameType_Enum; + +/** + * @brief CAN message structure + */ typedef struct { - u32 u8Xtd; - u32 u8Dir; - u32 u32Id; - u32 u8IdType; -} STR_CANMASK_TyprDef; + u32 Id; /* Arbitration ID. Rang 0x0 ~ 0x1FFFFFFF */ + u32 IdMask; /* Arbitration ID mask. Rang 0x0 ~ 0x1FFFFFFF */ + u8 MsgNum; /* Message number */ + CAN_IdType_Enum IdType; /* CAN_STD_ID (0x0 ~ 0x7FF) or CAN_EXT_ID (0x0 ~ 0x1FFFFFFF) */ + CAN_FrameType_Enum FrameType; /* CAN_REMOTE_FRAME or CAN_DATA_FRAME */ +} CAN_MSG_TypeDef; /** * @} */ @@ -115,336 +135,311 @@ typedef struct #define IS_CAN(x) IS_CAN0(x) #define IS_CAN0(x) (x == HT_CAN0) -/** - * @brief CAN Test Mode Constant Definitions - */ -#define CAN_NORMAL_MODE 0 -#define CAN_BASIC_MODE 0x04 -#define CAN_SILENT_MODE 0x08 -#define CAN_LBACK_MODE 0x10 -#define CAN_LBS_MODE 0x18 +#define CAN_STD_FRAME_Msk 0x7FF +#define CAN_EXT_FRAME_MSB_Msk 0x1FFF +#define CAN_EXT_FRAME_LSB_Msk 0xFFFF -/** - * @brief DMessage ID Type Constant Definitions - */ -#define CAN_STD_ID 0 -#define CAN_EXT_ID 1 -/** - * @brief Message Frame Type Constant Definitions - */ -#define CAN_REMOTE_FRAME 0 -#define CAN_DATA_FRAME 1 - -#define CAN_NBR 1 -#define CAN_VECTOR_NBR 1 -#define DATA_NBR 4 +#define CAN_MODE_NORMAL 0 +#define MSG_OBJ_TOTAL_NUM 32 /** * @brief CAN CR Bit Field Definitions */ -#define CAN_CR_TEST_Pos 7 /*!< CAN_T::CR: TEST Position */ -#define CAN_CR_TEST_Msk (1ul << CAN_CR_TEST_Pos) /*!< CAN_T::CR: TEST Mask */ +#define CAN_CR_TEST_Pos 7 /*!< CAN_T::CR: TEST Position */ +#define CAN_CR_TEST (1ul << CAN_CR_TEST_Pos) /*!< CAN_T::CR: TEST */ -#define CAN_CR_CCE_Pos 6 /*!< CAN_T::CR: CCE Position */ -#define CAN_CR_CCE_Msk (1ul << CAN_CR_CCE_Pos) /*!< CAN_T::CR: CCE Mask */ +#define CAN_CR_CCE_Pos 6 /*!< CAN_T::CR: CCE Position */ +#define CAN_CR_CCE (1ul << CAN_CR_CCE_Pos) /*!< CAN_T::CR: CCE */ -#define CAN_CR_DAR_Pos 5 /*!< CAN_T::CR: DAR Position */ -#define CAN_CR_DAR_Msk (1ul << CAN_CR_DAR_Pos) /*!< CAN_T::CR: DAR Mask */ +#define CAN_CR_DAR_Pos 5 /*!< CAN_T::CR: DAR Position */ +#define CAN_CR_DAR (1ul << CAN_CR_DAR_Pos) /*!< CAN_T::CR: DAR */ -#define CAN_CR_EIE_Pos 3 /*!< CAN_T::CR: EIE Position */ -#define CAN_CR_EIE_Msk (1ul << CAN_CR_EIE_Pos) /*!< CAN_T::CR: EIE Mask */ +#define CAN_CR_EIE_Pos 3 /*!< CAN_T::CR: EIE Position */ +#define CAN_INT_EIE (1ul << CAN_CR_EIE_Pos) /*!< CAN_T::CR: EIE */ -#define CAN_CR_SIE_Pos 2 /*!< CAN_T::CR: SIE Position */ -#define CAN_CR_SIE_Msk (1ul << CAN_CR_SIE_Pos) /*!< CAN_T::CR SIE Mask */ +#define CAN_CR_SIE_Pos 2 /*!< CAN_T::CR: SIE Position */ +#define CAN_INT_SIE (1ul << CAN_CR_SIE_Pos) /*!< CAN_T::CR SIE */ -#define CAN_CR_IE_Pos 1 /*!< CAN_T::CR: IE Position */ -#define CAN_CR_IE_Msk (1ul << CAN_CR_IE_Pos) /*!< CAN_T::CR: IE Mask */ +#define CAN_CR_IE_Pos 1 /*!< CAN_T::CR: IE Position */ +#define CAN_INT_IE (1ul << CAN_CR_IE_Pos) /*!< CAN_T::CR: IE */ -#define CAN_CR_INIT_Pos 0 /*!< CAN_T::CR: INIT Position */ -#define CAN_CR_INIT_Msk (1ul << CAN_CR_INIT_Pos) /*!< CAN_T::CR: INIT Mask */ +#define CAN_INT_ALL (CAN_INT_EIE | CAN_INT_SIE | CAN_INT_IE) + +#define CAN_CR_INIT_Pos 0 /*!< CAN_T::CR: INIT Position */ +#define CAN_CR_INIT (1ul << CAN_CR_INIT_Pos) /*!< CAN_T::CR: INIT */ /** * @brief CAN STATUS Bit Field Definitions */ -#define CAN_SR_BOFF_Pos 7 /*!< CAN_T::STATUS: BOFF Position */ -#define CAN_SR_BOFF_Msk (1ul << CAN_SR_BOFF_Pos) /*!< CAN_T::STATUS: BOFF Mask */ +#define CAN_BOFF_Pos 7 /*!< CAN_T::STATUS: BOFF Position */ +#define CAN_FLAG_BOFF (1ul << CAN_BOFF_Pos) /*!< CAN_T::STATUS: BOFF Flag */ -#define CAN_SR_EWARN_Pos 6 /*!< CAN_T::STATUS: EWARN Position */ -#define CAN_SR_EWARN_Msk (1ul << CAN_SR_EWARN_Pos) /*!< CAN_T::STATUS: EWARN Mask */ +#define CAN_EWARN_Pos 6 /*!< CAN_T::STATUS: EWARN Position */ +#define CAN_FLAG_EWARN (1ul << CAN_EWARN_Pos) /*!< CAN_T::STATUS: EWARN Flag */ -#define CAN_SR_EPASS_Pos 5 /*!< CAN_T::STATUS: EPASS Position */ -#define CAN_SR_EPASS_Msk (1ul << CAN_SR_EPASS_Pos) /*!< CAN_T::STATUS: EPASS Mask */ +#define CAN_EPASS_Pos 5 /*!< CAN_T::STATUS: EPASS Position */ +#define CAN_FLAG_EPASS (1ul << CAN_EPASS_Pos) /*!< CAN_T::STATUS: EPASS Flag */ -#define CAN_SR_RXOK_Pos 4 /*!< CAN_T::STATUS: RXOK Position */ -#define CAN_SR_RXOK_Msk (1ul << CAN_SR_RXOK_Pos) /*!< CAN_T::STATUS: RXOK Mask */ +#define CAN_RXOK_Pos 4 /*!< CAN_T::STATUS: RXOK Position */ +#define CAN_FLAG_RXOK (1ul << CAN_RXOK_Pos) /*!< CAN_T::STATUS: RXOK Flag */ -#define CAN_SR_TXOK_Pos 3 /*!< CAN_T::STATUS: TXOK Position */ -#define CAN_SR_TXOK_Msk (1ul << CAN_SR_TXOK_Pos) /*!< CAN_T::STATUS: TXOK Mask */ +#define CAN_TXOK_Pos 3 /*!< CAN_T::STATUS: TXOK Position */ +#define CAN_FLAG_TXOK (1ul << CAN_TXOK_Pos) /*!< CAN_T::STATUS: TXOK Flag */ -#define CAN_SR_LEC_Pos 0 /*!< CAN_T::STATUS: LEC Position */ -#define CAN_SR_LEC_Msk (0x3ul << CAN_SR_LEC_Pos) /*!< CAN_T::STATUS: LEC Mask */ +#define CAN_LEC_Pos 0 /*!< CAN_T::STATUS: LEC Position */ +#define CAN_LEC_Msk (0x7ul << CAN_LEC_Pos) /*!< CAN_T::STATUS: LEC Mask */ /** * @brief CAN ECR Bit Field Definitions */ -#define CAN_ECR_RP_Pos 15 /*!< CAN_T::ECR: RP Position */ -#define CAN_ECR_RP_Msk (1ul << CAN_ECR_RP_Pos) /*!< CAN_T::ECR: RP Mask */ +#define CAN_ECR_RP_Pos 15 /*!< CAN_T::ECR: RP Position */ +#define CAN_ECR_RP_MsK (1ul << CAN_ECR_RP_Pos) /*!< CAN_T::ECR: RP */ -#define CAN_ECR_REC_Pos 8 /*!< CAN_T::ECR: REC Position */ -#define CAN_ECR_REC_Msk (0x7Ful << CAN_ECR_REC_Pos) /*!< CAN_T::ECR: REC Mask */ +#define CAN_ECR_REC_Pos 8 /*!< CAN_T::ECR: REC Position */ +#define CAN_ECR_REC_MsK (0x7Ful << CAN_ECR_REC_Pos) /*!< CAN_T::ECR: REC Mask */ -#define CAN_ECR_TEC_Pos 0 /*!< CAN_T::ECR: TEC Position */ -#define CAN_ECR_TEC_Msk (0xFFul << CAN_ECR_TEC_Pos) /*!< CAN_T::ECR: TEC Mask */ +#define CAN_ECR_TEC_Pos 0 /*!< CAN_T::ECR: TEC Position */ +#define CAN_ECR_TEC_MsK (0xFFul << CAN_ECR_TEC_Pos) /*!< CAN_T::ECR: TEC Mask */ /** * @brief CAN BTR Bit Field Definitions */ -#define CAN_BTR_TSEG1_Pos 12 /*!< CAN_T::BTR: TSEG1 Position */ -#define CAN_BTR_TSEG1_Msk (0x7ul << CAN_BTR_TSEG1_Pos) /*!< CAN_T::BTR: TSEG1 Mask */ +#define CAN_BTR_TSEG1_Pos 12 /*!< CAN_T::BTR: TSEG1 Position */ +#define CAN_BTR_TSEG1_Msk (0x7ul << CAN_BTR_TSEG1_Pos) /*!< CAN_T::BTR: TSEG1 Mask */ -#define CAN_BTR_TSEG0_Pos 8 /*!< CAN_T::BTR: TSEG0 Position */ -#define CAN_BTR_TSEG0_Msk (0xFul << CAN_BTR_TSEG0_Pos) /*!< CAN_T::BTR: TSEG0 Mask */ +#define CAN_BTR_TSEG0_Pos 8 /*!< CAN_T::BTR: TSEG0 Position */ +#define CAN_BTR_TSEG0_Msk (0xFul << CAN_BTR_TSEG0_Pos) /*!< CAN_T::BTR: TSEG0 Mask */ -#define CAN_BTR_SJW_Pos 6 /*!< CAN_T::BTR: SJW Position */ -#define CAN_BTR_SJW_Msk (0x3ul << CAN_BTR_SJW_Pos) /*!< CAN_T::BTR: SJW Mask */ +#define CAN_BTR_SJW_Pos 6 /*!< CAN_T::BTR: SJW Position */ +#define CAN_BTR_SJW_Msk (0x3ul << CAN_BTR_SJW_Pos) /*!< CAN_T::BTR: SJW Mask */ -#define CAN_BTR_BRP_Pos 0 /*!< CAN_T::BTR: BRP Position */ -#define CAN_BTR_BRP_Msk (0x3Ful << CAN_BTR_BRP_Pos) /*!< CAN_T::BTR: BRP Mask */ +#define CAN_BTR_BRP_Pos 0 /*!< CAN_T::BTR: BRP Position */ +#define CAN_BTR_BRP_Msk (0x3Ful << CAN_BTR_BRP_Pos) /*!< CAN_T::BTR: BRP Mask */ /** * @brief CAN IR Bit Field Definitions */ -#define CAN_IR_INTID_Pos 0 /*!< CAN_T::IR: INTID Position */ -#define CAN_IR_INTID_Msk (0xFFFFul << CAN_IR_INTID_Pos) /*!< CAN_T::R: INTID Mask */ +#define CAN_IR_INTID_Pos 0 /*!< CAN_T::IR: INTID Position */ +#define CAN_IR_INTID_Msk (0xFFFFul << CAN_IR_INTID_Pos) /*!< CAN_T::IR: INTID Mask */ /** * @brief CAN TEST Bit Field Definitions */ -#define CAN_TEST_RX_Pos 7 /*!< CAN_T::TEST: RX Position */ -#define CAN_TEST_RX_Msk (1ul << CAN_TEST_RX_Pos) /*!< CAN_T::TEST: RX Mask */ +#define CAN_TEST_RX_Pos 7 /*!< CAN_T::TEST: RX Position */ +#define CAN_TEST_RX (1ul << CAN_TEST_RX_Pos) /*!< CAN_T::TEST: RX */ -#define CAN_TEST_TX_Pos 5 /*!< CAN_T::TEST: TX Position */ -#define CAN_TEST_TX_Msk (0x3ul << CAN_TEST_TX_Pos) /*!< CAN_T::TEST: TX Mask */ +#define CAN_TEST_TX_Pos 5 /*!< CAN_T::TEST: TX Position */ +#define CAN_MODE_MONITORER (0x1ul << CAN_TEST_TX_Pos) /*!< CAN_T::TEST: SP monitored */ +#define CAN_MODE_TX_DOMINANT (0x2ul << CAN_TEST_TX_Pos) /*!< CAN_T::TEST: TX dominant */ +#define CAN_MODE_TX_RECESSIVE (0x3ul << CAN_TEST_TX_Pos) /*!< CAN_T::TEST: TX recessive */ -#define CAN_TEST_LBACK_Pos 4 /*!< CAN_T::TEST: LBACK Position */ -#define CAN_TEST_LBACK_Msk (1ul << CAN_TEST_LBACK_Pos) /*!< CAN_T::TEST: LBACK Mask */ +#define CAN_TEST_LBACK_Pos 4 /*!< CAN_T::TEST: LBACK Position */ +#define CAN_MODE_LBACK (1ul << CAN_TEST_LBACK_Pos) /*!< CAN_T::TEST: LBACK */ -#define CAN_TEST_SILENT_Pos 3 /*!< CAN_T::TEST: Silent Position */ -#define CAN_TEST_SILENT_Msk (1ul << CAN_TEST_SILENT_Pos) /*!< CAN_T::TEST: Silent Mask */ +#define CAN_TEST_SILENT_Pos 3 /*!< CAN_T::TEST: Silent Position */ +#define CAN_MODE_SILENT (1ul << CAN_TEST_SILENT_Pos) /*!< CAN_T::TEST: Silent */ -#define CAN_TEST_BASIC_Pos 2 /*!< CAN_T::TEST: Basic Position */ -#define CAN_TEST_BASIC_Msk (1ul << CAN_TEST_BASIC_Pos) /*!< CAN_T::TEST: Basic Mask */ +#define CAN_TEST_BASIC_Pos 2 /*!< CAN_T::TEST: Basic Position */ +#define CAN_MODE_BASIC (1ul << CAN_TEST_BASIC_Pos) /*!< CAN_T::TEST: Basic */ /** * @brief CAN BPRE Bit Field Definitions */ -#define CAN_BRPE_BRPE_Pos 0 /*!< CAN_T::BRPE: BRPE Position */ -#define CAN_BRPE_BRPE_Msk (0xFul << CAN_BRPE_BRPE_Pos) /*!< CAN_T::BRPE: BRPE Mask */ +#define CAN_BRPE_BRPE_Pos 0 /*!< CAN_T::BRPE: BRPE Position */ +#define CAN_BRPE_BRPE_Msk (0xFul << CAN_BRPE_BRPE_Pos) /*!< CAN_T::BRPE: BRPE Mask */ /** * @brief CAN IFn_CREQ Bit Field Definitions */ -#define CAN_IF_CREQ_BUSY_Pos 15 /*!< CAN_T::IFnCREQ: BUSY Position */ -#define CAN_IF_CREQ_BUSY_Msk (1ul << CAN_IF_CREQ_BUSY_Pos) /*!< CAN_T::IFnCREQ: BUSY Mask */ +#define CAN_IF_CREQ_BUSY_Pos 15 /*!< CAN_T::IFnCREQ: BUSY Position */ +#define CAN_FLAG_IF_BUSY (1ul << CAN_IF_CREQ_BUSY_Pos) /*!< CAN_T::IFnCREQ: BUSY FLAG */ -#define CAN_IF_CREQ_MSGNUM_Pos 0 /*!< CAN_T::IFnCREQ: MSGNUM Position */ -#define CAN_IF_CREQ_MSGNUM_Msk (0x3Ful << CAN_IF_CREQ_MSGNUM_Pos) /*!< CAN_T::IFnCREQ: MSGNUM Mask */ +#define CAN_IF_CREQ_MSGNUM_Pos 0 /*!< CAN_T::IFnCREQ: MSGNUM Position */ +#define CAN_IF_CREQ_MSGNUM_Msk (0x3Ful << CAN_IF_CREQ_MSGNUM_Pos) /*!< CAN_T::IFnCREQ: MSGNUM Mask */ /** * @brief CAN IFn_CMASK Bit Field Definitions */ -#define CAN_IF_CMASK_WRRD_Pos 7 /*!< CAN_T::IFnCMASK: WRRD Position */ -#define CAN_IF_CMASK_WRRD_Msk (1ul << CAN_IF_CMASK_WRRD_Pos) /*!< CAN_T::IFnCMASK: WRRD Mask */ +#define CAN_IF_CMASK_WRRD_Pos 7 /*!< CAN_T::IFnCMASK: WRRD Position */ +#define CAN_IF_CMASK_WRRD (1ul << CAN_IF_CMASK_WRRD_Pos) /*!< CAN_T::IFnCMASK: WRRD */ -#define CAN_IF_CMASK_MASK_Pos 6 /*!< CAN_T::IFnCMASK: MASK Position */ -#define CAN_IF_CMASK_MASK_Msk (1ul << CAN_IF_CMASK_MASK_Pos) /*!< CAN_T::IFnCMASK: MASK Mask */ +#define CAN_IF_CMASK_MASK_Pos 6 /*!< CAN_T::IFnCMASK: MASK Position */ +#define CAN_IF_CMASK_MASK (1ul << CAN_IF_CMASK_MASK_Pos) /*!< CAN_T::IFnCMASK: MASK */ -#define CAN_IF_CMASK_ARB_Pos 5 /*!< CAN_T::IFnCMASK: ARB Position */ -#define CAN_IF_CMASK_ARB_Msk (1ul << CAN_IF_CMASK_ARB_Pos) /*!< CAN_T::IFnCMASK: ARB Mask */ +#define CAN_IF_CMASK_ARB_Pos 5 /*!< CAN_T::IFnCMASK: ARB Position */ +#define CAN_IF_CMASK_ARB (1ul << CAN_IF_CMASK_ARB_Pos) /*!< CAN_T::IFnCMASK: ARB */ -#define CAN_IF_CMASK_CONTROL_Pos 4 /*!< CAN_T::IFnCMASK: CONTROL Position */ -#define CAN_IF_CMASK_CONTROL_Msk (1ul << CAN_IF_CMASK_CONTROL_Pos) /*!< CAN_T::IFnCMASK: CONTROL Mask */ +#define CAN_IF_CMASK_CONTROL_Pos 4 /*!< CAN_T::IFnCMASK: CONTROL Position */ +#define CAN_IF_CMASK_CONTROL (1ul << CAN_IF_CMASK_CONTROL_Pos) /*!< CAN_T::IFnCMASK: CONTROL */ -#define CAN_IF_CMASK_CLRINTPND_Pos 3 /*!< CAN_T::IFnCMASK: CLRINTPND Position */ -#define CAN_IF_CMASK_CLRINTPND_Msk (1ul << CAN_IF_CMASK_CLRINTPND_Pos) /*!< CAN_T::IFnCMASK: CLRINTPND Mask */ +#define CAN_IF_CMASK_CLRINTPND_Pos 3 /*!< CAN_T::IFnCMASK: CLRINTPND Position */ +#define CAN_IF_CMASK_CLRINTPND (1ul << CAN_IF_CMASK_CLRINTPND_Pos) /*!< CAN_T::IFnCMASK: CLRINTPND */ -#define CAN_IF_CMASK_TXRQSTNEWDAT_Pos 2 /*!< CAN_T::IFnCMASK: TXRQSTNEWDAT Position */ -#define CAN_IF_CMASK_TXRQSTNEWDAT_Msk (1ul << CAN_IF_CMASK_TXRQSTNEWDAT_Pos) /*!< CAN_T::IFnCMASK: TXRQSTNEWDAT Mask */ +#define CAN_IF_CMASK_TXRQSTNEWDAT_Pos 2 /*!< CAN_T::IFnCMASK: TXRQSTNEWDAT Position */ +#define CAN_IF_CMASK_TXRQSTNEWDAT (1ul << CAN_IF_CMASK_TXRQSTNEWDAT_Pos) /*!< CAN_T::IFnCMASK: TXRQSTNEWDAT */ -#define CAN_IF_CMASK_DATAA_Pos 1 /*!< CAN_T::IFnCMASK: DATAA Position */ -#define CAN_IF_CMASK_DATAA_Msk (1ul << CAN_IF_CMASK_DATAA_Pos) /*!< CAN_T::IFnCMASK: DATAA Mask */ +#define CAN_IF_CMASK_DATAA_Pos 1 /*!< CAN_T::IFnCMASK: DATAA Position */ +#define CAN_IF_CMASK_DATAA (1ul << CAN_IF_CMASK_DATAA_Pos) /*!< CAN_T::IFnCMASK: DATAA */ -#define CAN_IF_CMASK_DATAB_Pos 0 /*!< CAN_T::IFnCMASK: DATAB Position */ -#define CAN_IF_CMASK_DATAB_Msk (1ul << CAN_IF_CMASK_DATAB_Pos) /*!< CAN_T::IFnCMASK: DATAB Mask */ +#define CAN_IF_CMASK_DATAB_Pos 0 /*!< CAN_T::IFnCMASK: DATAB Position */ +#define CAN_IF_CMASK_DATAB (1ul << CAN_IF_CMASK_DATAB_Pos) /*!< CAN_T::IFnCMASK: DATAB */ /** * @brief CAN IFn_MASK0 Bit Field Definitions */ -#define CAN_IF_MASK0_MSK_Pos 0 /*!< CAN_T::IFnMASK0: MSK Position */ -#define CAN_IF_MASK0_MSK_Msk (0xFFul << CAN_IF_MASK0_MSK_Pos) /*!< CAN_T::IFnMASK0: MSK Mask */ +#define CAN_IF_MASK0_MSK_Pos 0 /*!< CAN_T::IFnMASK0: MSK Position */ +#define CAN_IF_MASK0_MSK_Msk (0xFFul << CAN_IF_MASK0_MSK_Pos) /*!< CAN_T::IFnMASK0: MSK Mask */ /** * @brief CAN IFn_MASK1 Bit Field Definitions */ #define CAN_IF_MASK1_MXTD_Pos 15 /*!< CAN_T::IFnMASK1: MXTD Position */ -#define CAN_IF_MASK1_MXTD_Msk (1ul << CAN_IF_MASK1_MXTD_Pos) /*!< CAN_T::IFnMASK1: MXTD Mask */ +#define CAN_IF_MASK1_MXTD (1ul << CAN_IF_MASK1_MXTD_Pos) /*!< CAN_T::IFnMASK1: MXTD */ #define CAN_IF_MASK1_MDIR_Pos 14 /*!< CAN_T::IFnMASK1: MDIR Position */ -#define CAN_IF_MASK1_MDIR_Msk (1ul << CAN_IF_MASK1_MDIR_Pos) /*!< CAN_T::IFnMASK1: MDIR Mask */ +#define CAN_IF_MASK1_MDIR (1ul << CAN_IF_MASK1_MDIR_Pos) /*!< CAN_T::IFnMASK1: MDIR */ -#define CAN_IF_MASK1_MSK_Pos 0 /*!< CAN_T::IFnMASK1: MSK Position */ -#define CAN_IF_MASK1_MSK_Msk (0x1FFul << CAN_IF_MASK1_MSK_Pos) /*!< CAN_T::IFnMASK1: MSK Mask */ +#define CAN_IF_MASK1_MSK_Pos 0 /*!< CAN_T::IFnMASK1: MSK Position */ +#define CAN_IF_MASK1_MSK_Msk (0x1FFul << CAN_IF_MASK1_MSK_Pos) /*!< CAN_T::IFnMASK1: MSK Mask */ /** * @brief CAN IFn_ARB0 Bit Field Definitions */ -#define CAN_IF_ARB0_ID_Pos 0 /*!< CAN_T::IFnARB0: ID Position */ -#define CAN_IF_ARB0_ID_Msk (0xFFFFul << CAN_IF_ARB0_ID_Pos) /*!< CAN_T::IFnARB0: ID Mask */ +#define CAN_IF_ARB0_ID_Pos 0 /*!< CAN_T::IFnARB0: ID Position */ +#define CAN_IF_ARB0_ID_Msk (0xFFFFul << CAN_IF_ARB0_ID_Pos) /*!< CAN_T::IFnARB0: ID Mask */ /** * @brief CAN IFn_ARB1 Bit Field Definitions */ -#define CAN_IF_ARB1_MSGVAL_Pos 15 /*!< CAN_T::IFnARB1: MSGVAL Position */ -#define CAN_IF_ARB1_MSGVAL_Msk (1ul << CAN_IF_ARB1_MSGVAL_Pos) /*!< CAN_T::IFnARB1: MSGVAL Mask */ +#define CAN_IF_ARB1_MSGVAL_Pos 15 /*!< CAN_T::IFnARB1: MSGVAL Position */ +#define CAN_IF_ARB1_MSGVAL (1ul << CAN_IF_ARB1_MSGVAL_Pos) /*!< CAN_T::IFnARB1: MSGVAL */ -#define CAN_IF_ARB1_XTD_Pos 14 /*!< CAN_T::IFnARB1: XTD Position */ -#define CAN_IF_ARB1_XTD_Msk (1ul << CAN_IF_ARB1_XTD_Pos) /*!< CAN_T::IFnARB1: XTD Mask */ +#define CAN_IF_ARB1_XTD_Pos 14 /*!< CAN_T::IFnARB1: XTD Position */ +#define CAN_IF_ARB1_XTD (1ul << CAN_IF_ARB1_XTD_Pos) /*!< CAN_T::IFnARB1: XTD */ -#define CAN_IF_ARB1_DIR_Pos 13 /*!< CAN_T::IFnARB1: DIR Position */ -#define CAN_IF_ARB1_DIR_Msk (1ul << CAN_IF_ARB1_DIR_Pos) /*!< CAN_T::IFnARB1: DIR Mask */ +#define CAN_IF_ARB1_DIR_Pos 13 /*!< CAN_T::IFnARB1: DIR Position */ +#define CAN_IF_ARB1_DIR (1ul << CAN_IF_ARB1_DIR_Pos) /*!< CAN_T::IFnARB1: DIR */ -#define CAN_IF_ARB1_ID_Pos 0 /*!< CAN_T::IFnARB1: ID Position */ -#define CAN_IF_ARB1_ID_Msk (0x1FFFul << CAN_IF_ARB1_ID_Pos) /*!< CAN_T::IFnARB1: ID Mask */ +#define CAN_IF_ARB1_ID_Pos 0 /*!< CAN_T::IFnARB1: ID Position */ +#define CAN_IF_ARB1_ID_Msk (0x1FFFul << CAN_IF_ARB1_ID_Pos) /*!< CAN_T::IFnARB1: ID Mask */ /** * @brief CAN IFn_MCR Bit Field Definitions */ #define CAN_IF_MCR_NEWDAT_Pos 15 /*!< CAN_T::IFnMCON: NEWDAT Position */ -#define CAN_IF_MCR_NEWDAT_Msk (1ul << CAN_IF_MCR_NEWDAT_Pos) /*!< CAN_T::IFnMCON: NEWDAT Mask */ +#define CAN_IF_MCR_NEWDAT (1ul << CAN_IF_MCR_NEWDAT_Pos) /*!< CAN_T::IFnMCON: NEWDAT */ #define CAN_IF_MCR_MSGLST_Pos 14 /*!< CAN_T::IFnMCON: MSGLST Position */ -#define CAN_IF_MCR_MSGLST_Msk (1ul << CAN_IF_MCR_MSGLST_Pos) /*!< CAN_T::IFnMCON: MSGLST Mask */ +#define CAN_IF_MCR_MSGLST (1ul << CAN_IF_MCR_MSGLST_Pos) /*!< CAN_T::IFnMCON: MSGLST */ #define CAN_IF_MCR_INTPND_Pos 13 /*!< CAN_T::IFnMCON: INTPND Position */ -#define CAN_IF_MCR_INTPND_Msk (1ul << CAN_IF_MCR_INTPND_Pos) /*!< CAN_T::IFnMCON: INTPND Mask */ +#define CAN_IF_MCR_INTPND (1ul << CAN_IF_MCR_INTPND_Pos) /*!< CAN_T::IFnMCON: INTPND */ #define CAN_IF_MCR_UMASK_Pos 12 /*!< CAN_T::IFnMCON: UMASK Position */ -#define CAN_IF_MCR_UMASK_Msk (1ul << CAN_IF_MCR_UMASK_Pos) /*!< CAN_T::IFnMCON: UMASK Mask */ +#define CAN_IF_MCR_UMASK (1ul << CAN_IF_MCR_UMASK_Pos) /*!< CAN_T::IFnMCON: UMASK */ #define CAN_IF_MCR_TXIE_Pos 11 /*!< CAN_T::IFnMCON: TXIE Position */ -#define CAN_IF_MCR_TXIE_Msk (1ul << CAN_IF_MCR_TXIE_Pos) /*!< CAN_T::IFnMCON: TXIE Mask */ +#define CAN_IF_MCR_TXIE (1ul << CAN_IF_MCR_TXIE_Pos) /*!< CAN_T::IFnMCON: TXIE */ #define CAN_IF_MCR_RXIE_Pos 10 /*!< CAN_T::IFnMCON: RXIE Position */ -#define CAN_IF_MCR_RXIE_Msk (1ul << CAN_IF_MCR_RXIE_Pos) /*!< CAN_T::IFnMCON: RXIE Mask */ +#define CAN_IF_MCR_RXIE (1ul << CAN_IF_MCR_RXIE_Pos) /*!< CAN_T::IFnMCON: RXIE */ #define CAN_IF_MCR_RMTEN_Pos 9 /*!< CAN_T::IFnMCON: RMTEN Position */ -#define CAN_IF_MCR_RMTEN_Msk (1ul << CAN_IF_MCR_RMTEN_Pos) /*!< CAN_T::IFnMCON: RMTEN Mask */ +#define CAN_IF_MCR_RMTEN (1ul << CAN_IF_MCR_RMTEN_Pos) /*!< CAN_T::IFnMCON: RMTEN */ #define CAN_IF_MCR_TXRQST_Pos 8 /*!< CAN_T::IFnMCON: TXRQST Position */ -#define CAN_IF_MCR_TXRQST_Msk (1ul << CAN_IF_MCR_TXRQST_Pos) /*!< CAN_T::IFnMCON: TXRQST Mask */ +#define CAN_IF_MCR_TXRQST (1ul << CAN_IF_MCR_TXRQST_Pos) /*!< CAN_T::IFnMCON: TXRQST */ #define CAN_IF_MCR_EOB_Pos 7 /*!< CAN_T::IFnMCON: EOB Position */ -#define CAN_IF_MCR_EOB_Msk (1ul << CAN_IF_MCR_EOB_Pos) /*!< CAN_T::IFnMCON: EOB Mask */ +#define CAN_IF_MCR_EOB (1ul << CAN_IF_MCR_EOB_Pos) /*!< CAN_T::IFnMCON: EOB */ #define CAN_IF_MCR_DLC_Pos 0 /*!< CAN_T::IFnMCON: DLC Position */ -#define CAN_IF_MCR_DLC_Msk (0xFul << CAN_IF_MCR_DLC_Pos) /*!< CAN_T::IFnMCON: DLC Mask */ +#define CAN_IF_MCR_DLC_Msk (0xFul << CAN_IF_MCR_DLC_Pos) /*!< CAN_T::IFnMCON: DLC Mask */ /** * @brief CAN IFn_DATA_A0 Bit Field Definitions */ -#define CAN_IF_DAT_A0_DATA1_Pos 8 /*!< CAN_T::IFnDATAA0: DATA1 Position */ -#define CAN_IF_DAT_A0_DATA1_Msk (0xFFul << CAN_IF_DAT_A0_DATA1_Pos) /*!< CAN_T::IFnDATAA0: DATA1 Mask */ +#define CAN_IF_DAT_A0_DATA1_Pos 8 /*!< CAN_T::IFnDATAA0: DATA1 Position */ +#define CAN_IF_DAT_A0_DATA1_Msk (0xFFul << CAN_IF_DAT_A0_DATA1_Pos) /*!< CAN_T::IFnDATAA0: DATA1 Mask */ -#define CAN_IF_DAT_A0_DATA0_Pos 0 /*!< CAN_T::IFnDATAA0: DATA0 Position */ -#define CAN_IF_DAT_A0_DATA0_Msk (0xFFul << CAN_IF_DAT_A0_DATA0_Pos) /*!< CAN_T::IFnDATAA0: DATA0 Mask */ +#define CAN_IF_DAT_A0_DATA0_Pos 0 /*!< CAN_T::IFnDATAA0: DATA0 Position */ +#define CAN_IF_DAT_A0_DATA0_Msk (0xFFul << CAN_IF_DAT_A0_DATA0_Pos) /*!< CAN_T::IFnDATAA0: DATA0 Mask */ /** * @brief CAN IFn_DATA_A1 Bit Field Definitions */ -#define CAN_IF_DAT_A1_DATA3_Pos 8 /*!< CAN_T::IFnDATAA1: DATA3 Position */ -#define CAN_IF_DAT_A1_DATA3_Msk (0xFFul << CAN_IF_DAT_A1_DATA3_Pos) /*!< CAN_T::IFnDATAA1: DATA3 Mask */ +#define CAN_IF_DAT_A1_DATA3_Pos 8 /*!< CAN_T::IFnDATAA1: DATA3 Position */ +#define CAN_IF_DAT_A1_DATA3_Msk (0xFFul << CAN_IF_DAT_A1_DATA3_Pos) /*!< CAN_T::IFnDATAA1: DATA3 Mask */ -#define CAN_IF_DAT_A1_DATA2_Pos 0 /*!< CAN_T::IFnDATAA1: DATA2 Position */ -#define CAN_IF_DAT_A1_DATA2_Msk (0xFFul << CAN_IF_DAT_A1_DATA2_Pos) /*!< CAN_T::IFnDATAA1: DATA2 Mask */ +#define CAN_IF_DAT_A1_DATA2_Pos 0 /*!< CAN_T::IFnDATAA1: DATA2 Position */ +#define CAN_IF_DAT_A1_DATA2_Msk (0xFFul << CAN_IF_DAT_A1_DATA2_Pos) /*!< CAN_T::IFnDATAA1: DATA2 Mask */ /** * @brief CAN IFn_DATA_B0 Bit Field Definitions */ -#define CAN_IF_DAT_B0_DATA5_Pos 8 /*!< CAN_T::IFnDATAB0: DATA5 Position */ -#define CAN_IF_DAT_B0_DATA5_Msk (0xFFul << CAN_IF_DAT_B0_DATA5_Pos) /*!< CAN_T::IFnDATAB0: DATA5 Mask */ +#define CAN_IF_DAT_B0_DATA5_Pos 8 /*!< CAN_T::IFnDATAB0: DATA5 Position */ +#define CAN_IF_DAT_B0_DATA5_Msk (0xFFul << CAN_IF_DAT_B0_DATA5_Pos) /*!< CAN_T::IFnDATAB0: DATA5 Mask */ -#define CAN_IF_DAT_B0_DATA4_Pos 0 /*!< CAN_T::IFnDATAB0: DATA4 Position */ -#define CAN_IF_DAT_B0_DATA4_Msk (0xFFul << CAN_IF_DAT_B0_DATA4_Pos) /*!< CAN_T::IFnDATAB0: DATA4 Mask */ +#define CAN_IF_DAT_B0_DATA4_Pos 0 /*!< CAN_T::IFnDATAB0: DATA4 Position */ +#define CAN_IF_DAT_B0_DATA4_Msk (0xFFul << CAN_IF_DAT_B0_DATA4_Pos) /*!< CAN_T::IFnDATAB0: DATA4 Mask */ /** * @brief CAN IFn_DATA_B1 Bit Field Definitions */ -#define CAN_IF_DAT_B1_DATA7_Pos 8 /*!< CAN_T::IFnDATAB1: DATA7 Position */ -#define CAN_IF_DAT_B1_DATA7_Msk (0xFFul << CAN_IF_DAT_B1_DATA7_Pos) /*!< CAN_T::IFnDATAB1: DATA7 Mask */ +#define CAN_IF_DAT_B1_DATA7_Pos 8 /*!< CAN_T::IFnDATAB1: DATA7 Position */ +#define CAN_IF_DAT_B1_DATA7_Msk (0xFFul << CAN_IF_DAT_B1_DATA7_Pos) /*!< CAN_T::IFnDATAB1: DATA7 Mask */ -#define CAN_IF_DAT_B1_DATA6_Pos 0 /*!< CAN_T::IFnDATAB1: DATA6 Position */ -#define CAN_IF_DAT_B1_DATA6_Msk (0xFFul << CAN_IF_DAT_B1_DATA6_Pos) /*!< CAN_T::IFnDATAB1: DATA6 Mask */ +#define CAN_IF_DAT_B1_DATA6_Pos 0 /*!< CAN_T::IFnDATAB1: DATA6 Position */ +#define CAN_IF_DAT_B1_DATA6_Msk (0xFFul << CAN_IF_DAT_B1_DATA6_Pos) /*!< CAN_T::IFnDATAB1: DATA6 Mask */ /** * @brief CAN IFn_TXRQST0 Bit Field Definitions */ -#define CAN_IF_TXRQST0_TXRQST_Pos 0 /*!< CAN_T::IFnTXRQST0: TXRQST Position */ -#define CAN_IF_TXRQST0_TXRQST_Msk (0xFFFFul << CAN_IF_TXRQST0_TXRQST_Pos) /*!< CAN_T::IFnTXRQST0: TXRQST Mask */ +#define CAN_IF_TXRQST0_TXRQST_Pos 0 /*!< CAN_T::IFnTXRQST0: TXRQST Position */ +#define CAN_IF_TXRQST0_TXRQST_Msk (0xFFFFul << CAN_IF_TXRQST0_TXRQST_Pos) /*!< CAN_T::IFnTXRQST0: TXRQST Mask */ /** * @brief CAN IFn_TXRQST1 Bit Field Definitions */ -#define CAN_IF_TXRQST1_TXRQST_Pos 0 /*!< CAN_T::IFnTXRQST1: TXRQST Position */ -#define CAN_IF_TXRQST1_TXRQST_Msk (0xFFFFul << CAN_IF_TXRQST1_TXRQST_Pos) /*!< CAN_T::IFnTXRQST1: TXRQST Mask */ +#define CAN_IF_TXRQST1_TXRQST_Pos 0 /*!< CAN_T::IFnTXRQST1: TXRQST Position */ +#define CAN_IF_TXRQST1_TXRQST_Msk (0xFFFFul << CAN_IF_TXRQST1_TXRQST_Pos) /*!< CAN_T::IFnTXRQST1: TXRQST Mask */ /** * @brief CAN IFn_NDAT0 Bit Field Definitions */ -#define CAN_IF_NDAT0_NEWDATA_Pos 0 /*!< CAN_T::IFnNDAT0: NEWDATA Position */ -#define CAN_IF_NDAT0_NEWDATA_Msk (0xFFFFul << CAN_IF_NDAT0_NEWDATA_Pos) /*!< CAN_T::IFnNDAT0: NEWDATA Mask */ +#define CAN_IF_NDAT0_NEWDATA_Pos 0 /*!< CAN_T::IFnNDAT0: NEWDATA Position */ +#define CAN_IF_NDAT0_NEWDATA_Msk (0xFFFFul << CAN_IF_NDAT0_NEWDATA_Pos) /*!< CAN_T::IFnNDAT0: NEWDATA Mask */ /** * @brief CAN IFn_NDAT1 Bit Field Definitions */ -#define CAN_IF_NDAT1_NEWDATA_Pos 0 /*!< CAN_T::IFnNDAT1: NEWDATA Position */ -#define CAN_IF_NDAT1_NEWDATA_Msk (0xFFFFul << CAN_IF_NDAT1_NEWDATA_Pos) /*!< CAN_T::IFnNDAT1: NEWDATA Mask */ +#define CAN_IF_NDAT1_NEWDATA_Pos 0 /*!< CAN_T::IFnNDAT1: NEWDATA Position */ +#define CAN_IF_NDAT1_NEWDATA_Msk (0xFFFFul << CAN_IF_NDAT1_NEWDATA_Pos) /*!< CAN_T::IFnNDAT1: NEWDATA Mask */ /** * @brief CAN IFn_IPND0 Bit Field Definitions */ -#define CAN_IF_IPND0_INTPND_Pos 0 /*!< CAN_T::IFnIPND0: INTPND Position */ -#define CAN_IF_IPND0_INTPND_Msk (0xFFFFul << CAN_IF_IPND0_INTPND_Pos) /*!< CAN_T::IFnIPND0: INTPND Mask */ +#define CAN_IF_IPND0_INTPND_Pos 0 /*!< CAN_T::IFnIPND0: INTPND Position */ +#define CAN_IF_IPND0_INTPND_Msk (0xFFFFul << CAN_IF_IPND0_INTPND_Pos) /*!< CAN_T::IFnIPND0: INTPND Mask */ /** * @brief CAN IFn_IPND1 Bit Field Definitions */ -#define CAN_IF_IPND1_INTPND_Pos 0 /*!< CAN_T::IFnIPND1: INTPND Position */ -#define CAN_IF_IPND1_INTPND_Msk (0xFFFFul << CAN_IF_IPND1_INTPND_Pos) /*!< CAN_T::IFnIPND1: INTPND Mask */ +#define CAN_IF_IPND1_INTPND_Pos 0 /*!< CAN_T::IFnIPND1: INTPND Position */ +#define CAN_IF_IPND1_INTPND_Msk (0xFFFFul << CAN_IF_IPND1_INTPND_Pos) /*!< CAN_T::IFnIPND1: INTPND Mask */ /** * @brief CAN IFn_MVLD0 Bit Field Definitions */ -#define CAN_IF_MVLD0_MSGVAL_Pos 0 /*!< CAN_T::IFnMVLD0: MSGVAL Position */ -#define CAN_IF_MVLD0_MSGVAL_Msk (0xFFFFul << CAN_IF_MVLD0_MSGVAL_Pos) /*!< CAN_T::IFnMVLD0: MSGVAL Mask */ +#define CAN_IF_MVLD0_MSGVAL_Pos 0 /*!< CAN_T::IFnMVLD0: MSGVAL Position */ +#define CAN_IF_MVLD0_MSGVAL_Msk (0xFFFFul << CAN_IF_MVLD0_MSGVAL_Pos) /*!< CAN_T::IFnMVLD0: MSGVAL Mask */ /** * @brief CAN IFn_MVLD1 Bit Field Definitions */ -#define CAN_IF_MVLD1_MSGVAL_Pos 0 /*!< CAN_T::IFnMVLD1: MSGVAL Position */ -#define CAN_IF_MVLD1_MSGVAL_Msk (0xFFFFul << CAN_IF_MVLD1_MSGVAL_Pos) /*!< CAN_T::IFnMVLD1: MSGVAL Mask */ - -/** - * @brief CAN WUEN Bit Field Definitions - */ -#define CAN_WUEN_WAKUP_EN_Pos 0 /*!< CAN_T::WUEN: WAKUP_EN Position */ -#define CAN_WUEN_WAKUP_EN_Msk (1ul << CAN_WUEN_WAKUP_EN_Pos) /*!< CAN_T::WUEN: WAKUP_EN Mask */ - -/** - * @brief CAN WUSTATUS Bit Field Definitions - */ -#define CAN_WUSTATUS_WAKUP_STS_Pos 0 /*!< CAN_T::WUSTATUS: WAKUP_STS Position */ -#define CAN_WUSTATUS_WAKUP_STS_Msk (1ul << CAN_WUSTATUS_WAKUP_STS_Pos) /*!< CAN_T::WUSTATUS: WAKUP_STS Mask */ +#define CAN_IF_MVLD1_MSGVAL_Pos 0 /*!< CAN_T::IFnMVLD1: MSGVAL Position */ +#define CAN_IF_MVLD1_MSGVAL_Msk (0xFFFFul << CAN_IF_MVLD1_MSGVAL_Pos) /*!< CAN_T::IFnMVLD1: MSGVAL Mask */ /** * @} */ @@ -453,31 +448,45 @@ typedef struct /** @defgroup CAN_Exported_Functions CAN exported functions * @{ */ +/* Initialization functions *********************************************************************************/ void CAN_DeInit(HT_CAN_TypeDef* CANx); -u32 CAN_SetBaudRate(HT_CAN_TypeDef *CANx, u32 u32BaudRate); -void CAN_Close(HT_CAN_TypeDef *CANx); -u32 CAN_Open(HT_CAN_TypeDef *CANx, u32 u32BaudRate, u32 u32Mode); -void CAN_CLR_INT_PENDING_BIT(HT_CAN_TypeDef *CANx, u32 u32MsgNum); -void CAN_EnableInt(HT_CAN_TypeDef *CANx, u32 u32Mask); -void CAN_DisableInt(HT_CAN_TypeDef *CANx, u32 u32Mask); -s32 CAN_Transmit(HT_CAN_TypeDef *CANx, u32 u32MsgNum , STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_Receive(HT_CAN_TypeDef *CANx, u32 u32MsgNum , STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_SetRxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum , STR_CANMSG_R_TypeDef* pCanMsg); -s32 CAN_SetTxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum , STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_TriggerTxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum); -void CAN_EnterInitMode(HT_CAN_TypeDef *CANx); -void CAN_LeaveInitMode(HT_CAN_TypeDef *CANx); -void CAN_WaitMsg(HT_CAN_TypeDef *CANx); -u32 CAN_GetCANBitRate(HT_CAN_TypeDef *CANx); +void CAN_Init(HT_CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct); + +/* Interrupts and flags management functions ****************************************************************/ +void CAN_IntConfig(HT_CAN_TypeDef *CANx, u32 CAN_Int, ControlStatus NewState); +FlagStatus CAN_GetIntStatus(HT_CAN_TypeDef* CANx, u32 CAN_Int); +FlagStatus CAN_GetFlagStatus(HT_CAN_TypeDef* CANx, uint32_t CAN_Flag); +void CAN_ClearFlag(HT_CAN_TypeDef* CANx, uint32_t CAN_Flag); + +/* Error management functions *******************************************************************************/ +CAN_LastErrorCode_TypeDef CAN_GetLastErrorCode(HT_CAN_TypeDef* CANx); +u32 CAN_GetReceiveErrorCounter(HT_CAN_TypeDef* CANx); +u32 CAN_GetLSBTransmitErrorCounter(HT_CAN_TypeDef* CANx); +void CAN_BusOffRecovery(HT_CAN_TypeDef *CANx); + +/* Test Mode functions **************************************************************************************/ void CAN_EnterTestMode(HT_CAN_TypeDef *CANx, u32 u8TestMask); void CAN_LeaveTestMode(HT_CAN_TypeDef *CANx); -u32 CAN_IsNewDataReceived(HT_CAN_TypeDef *CANx, u32 u8MsgObj); -s32 CAN_BasicSendMsg(HT_CAN_TypeDef *CANx, STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_BasicReceiveMsg(HT_CAN_TypeDef *CANx, STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_SetRxMsgObj(HT_CAN_TypeDef *CANx, u32 MsgObj, STR_CANMSG_R_TypeDef* pCanMsg); -s32 CAN_ReadMsgObj(HT_CAN_TypeDef *CANx, u32 u8MsgObj, u32 u8Release, STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_MsgObjMaskConfig(HT_CAN_TypeDef *tCAN, u32 u8MsgObj, STR_CANMSG_R_TypeDef* MaskMsg); -s32 CAN_SetMultiRxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum , u32 u32MsgCount, STR_CANMSG_R_TypeDef* pCanMsg); +ErrStatus CAN_BasicSendMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len); +ErrStatus CAN_BasicReceiveMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8* len); + +/* Transmit/Receive functions *******************************************************************************/ +ErrStatus CAN_Transmit(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len); +CAN_RxStatus_TypeDef CAN_Receive(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u32* len); +ErrStatus CAN_UpdateTxMsgData(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len); +ErrStatus CAN_TriggerTxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg); + +/* Set Rx Message Object ************************************************************************************/ +ErrStatus CAN_SetRxMsg(HT_CAN_TypeDef *CANx ,CAN_MSG_TypeDef* pCanMsg, u32 FifoDepth); + +/* Message Object status function ***************************************************************************/ +ErrStatus CAN_CancelTransmit(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg); +ErrStatus CAN_DiscardRxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg); +bool CAN_NewDataReceived(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg); +s32 CAN_TransmitStatus(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg); +bool CAN_GetMsgPending(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg); +ErrStatus CAN_ClearMsgPendingFlag(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg); +void CAN_ClearAllMsgPendingFlag(HT_CAN_TypeDef *CANx); /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h index 531078537b..cc5dabb858 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_ckcu.h - * @version $Rev:: 7108 $ - * @date $Date:: 2023-08-09 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the Clock Control Unit library. ************************************************************************************************************* * @attention @@ -425,9 +425,9 @@ typedef union unsigned long DIV :1; // Bit 24 unsigned long QSPI :1; // Bit 25 unsigned long RF :1; // Bit 26 - unsigned long :1; // Bit 27 + unsigned long PID0 :1; // Bit 27 unsigned long :1; // Bit 28 - unsigned long :1; // Bit 29 + unsigned long CORDIC :1; // Bit 29 unsigned long :1; // Bit 30 unsigned long :1; // Bit 31 @@ -494,8 +494,11 @@ typedef union unsigned long LCDC :1; // Bit 20 unsigned long DAC0 :1; // Bit 21 unsigned long CMP :1; // Bit 22 +#if defined(USE_HT32F66242) || defined(USE_HT32F66246) + unsigned long PGA :1; // Bit 23 +#else unsigned long OPA :1; // Bit 23 - +#endif unsigned long ADC0 :1; // Bit 24 unsigned long ADC1 :1; // Bit 25 unsigned long :1; // Bit 26 @@ -565,6 +568,9 @@ typedef enum #if (LIBCFG_OPA) CKCU_PCLK_OPA = (CKCU_APBPCSR1 | 10), #endif + #if (LIBCFG_PGA) + CKCU_PCLK_PGA = (CKCU_APBPCSR1 | 10), + #endif CKCU_PCLK_WDTR = (CKCU_APBPCSR1 | 12), CKCU_PCLK_BKPR = (CKCU_APBPCSR1 | 14), #if (LIBCFG_SCI0) @@ -679,6 +685,13 @@ typedef enum #define CKCU_PLL_16M_56M ((1UL << 28) | ( 7UL << 23) | (0UL << 21)) #endif +#if (LIBCFG_CKCU_SYS_CK_80M) +#define CKCU_PLL_4M_80M ((0UL << 28) | (20UL << 23) | (0UL << 21)) +#define CKCU_PLL_8M_80M ((0UL << 28) | (10UL << 23) | (0UL << 21)) +#define CKCU_PLL_12M_78M ((1UL << 28) | (13UL << 23) | (0UL << 21)) +#define CKCU_PLL_16M_80M ((0UL << 28) | ( 5UL << 23) | (0UL << 21)) +#endif + #define IS_PLL_CFG(CFG) (((CFG & 0xE81FFFFF) == 0x0) && (CFG != 0)) #endif @@ -699,13 +712,12 @@ typedef enum #define IS_USBPLL_CFG(CFG) (((CFG & 0xFFFFF81F) == 0x0) && (CFG != 0)) #endif - - - /* Definitions of MCU debug control */ #define CKCU_DBG_SLEEP (1UL) #define CKCU_DBG_DEEPSLEEP1 (1UL << 1) +#if (!LIBCFG_PWRCU_NO_PD_MODE) #define CKCU_DBG_POWERDOWN (1UL << 2) +#endif #define CKCU_DBG_WDT_HALT (1UL << 3) #if (LIBCFG_MCTM0) @@ -828,6 +840,14 @@ typedef enum #if (LIBCFG_CKCU_HSIRDYCR) #define IS_COUNTER_VALUE(VALUE) ((VALUE) < 0x20) #endif + +/* HSE Gain mode */ +#define CKCU_HSE_LOW_GAIN_MODE (0UL << 8) +#define CKCU_HSE_HIGH_GAIN_MODE (1UL << 8) + +#define IS_GAINMODE(GanMode) ((GanMode == CKCU_HSE_LOW_GAIN_MODE) || \ + (GanMode == CKCU_HSE_HIGH_GAIN_MODE)) + /** * @} */ @@ -904,7 +924,7 @@ void CKCU_IntConfig(u32 CKCU_INT, ControlStatus Cmd); FlagStatus CKCU_GetIntStatus(u32 CKCU_INT); void CKCU_ClearIntFlag(u32 CKCU_INT); -#if (((LIBCFG_LSE) || (LIBCFG_USBD)) && (!LIBCFG_CKCU_NO_AUTO_TRIM)) +#if (((LIBCFG_LSE) || (LIBCFG_USBD) || (LIBCFG_CKCU_REFCLK_EXT_PIN)) && (!LIBCFG_CKCU_NO_AUTO_TRIM)) #if (LIBCFG_CKCU_ATM_V01) void CKCU_ATCInit(CKCU_ATCInitTypeDef* ATC_InitStruct); #endif @@ -914,8 +934,11 @@ bool CKCU_HSIAutoTrimIsReady(void); #endif #if (LIBCFG_CKCU_HSIRDYCR) -void CKCU_Set_HSIReadyCounter(u8 value); +void CKCU_SetHSIReadyCounter(u8 value); #endif + +void CKCU_SetHSEGainMode(u32 GanMode); + /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h index 5869bcd21c..5213360e5e 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_cmp.h - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the CMP library. ************************************************************************************************************* * @attention @@ -59,7 +59,7 @@ typedef struct u32 CMP_ScalerEnable; u32 CMP_CoutSync; u32 CMP_OutputPol; - #if (LIBCFG_CMP_65x_VER) + #if (LIBCFG_CMP_65x_66x_VER) u32 CMP_InputSelection; #endif u32 CMP_InvInputSelection; @@ -108,7 +108,7 @@ typedef enum /* Definitions of CMP Output Selection for IP Trigger Source */ -#if (LIBCFG_CMP_65x_VER) +#if (LIBCFG_CMP_65x_66x_VER) #define CMP_TRIG_NONE ((u32)0x0 << 11) #define CMP_TRIG_GPTM_CH0 ((u32)0x1 << 11) // CMP0 #define CMP_TRIG_GPTM_CH1 ((u32)0x1 << 11) // CMP1 @@ -198,7 +198,7 @@ typedef enum /* Definitions of CMP Inverted Input Source Selection */ -#if (LIBCFG_CMP_65x_VER) +#if (LIBCFG_CMP_65x_66x_VER) #if (LIBCFG_CMP_POS_INPUT_SEL_V2) #define CMP_INPUT_CMPnP ((u32)0x00000000) #define CMP_INPUT_CMPnP0 ((u32)0x00000000) @@ -211,6 +211,26 @@ typedef enum (x == CMP_INPUT_CMPnP1) || \ (x == CMP_INPUT_CMPnP2) || \ (x == CMP_INPUT_OPA0O)) +#elif (LIBCFG_CMP_POS_INPUT_SEL_V3) +#define CMP_INPUT_CMP0P ((u32)0x00000000) +#define CMP_INPUT_CMP0P0 ((u32)0x00000000) +#define CMP_INPUT_CMP1P0 ((u32)0x00000001) +#define CMP_INPUT_CMP1P1 ((u32)0x00000002) +#define CMP_INPUT_CMP1P2 ((u32)0x00000003) +#define CMP_INPUT_PGA0O ((u32)0x00000004) +#define CMP_INPUT_PGA1O ((u32)0x00000005) +#define CMP_INPUT_PGA2O ((u32)0x00000006) +#define CMP_INPUT_PGA3O ((u32)0x00000007) + +#define IS_CMP_InputSelection(x) ((x == CMP_INPUT_CMP0P) || \ + (x == CMP_INPUT_CMP0P0) || \ + (x == CMP_INPUT_CMP1P0) || \ + (x == CMP_INPUT_CMP1P1) || \ + (x == CMP_INPUT_CMP1P2) || \ + (x == CMP_INPUT_PGA0O) || \ + (x == CMP_INPUT_PGA1O) || \ + (x == CMP_INPUT_PGA2O) || \ + (x == CMP_INPUT_PGA3O)) #else #define CMP_INPUT_CMPnP ((u32)0x00000000) #define CMP_INPUT_OPA0O ((u32)0x00000001) @@ -223,6 +243,22 @@ typedef enum /* Definitions of CMP Inverted Input Source Selection */ #define CMP_EXTERNAL_CN_IN ((u32)0x00000000) + +#if defined(USE_HT32F66242) || defined(USE_HT32F66246) +#define CMP0_CMP0N_CN_IN ((u32)0x00000000) +#define CMP1_CMP1N_CN_IN ((u32)0x00000000) + +#define CMP0_CMP1N_CN_IN ((u32)0x00000010) +#define CMP1_CMP0N_CN_IN ((u32)0x00000010) + +#define CMP_CVREF0_CN_IN ((u32)0x00000020) +#define CMP_CVREF1_CN_IN ((u32)0x00000030) + +#define IS_CMP_InvInputSelection(x) ((x == CMP_EXTERNAL_CN_IN) || (x == CMP0_CMP0N_CN_IN) || (x == CMP1_CMP1N_CN_IN) || \ + (x == CMP0_CMP1N_CN_IN) || (x == CMP1_CMP0N_CN_IN) || \ + (x == CMP_CVREF0_CN_IN) || \ + (x == CMP_CVREF1_CN_IN)) +#else #define CMP_SCALER_CN_IN ((u32)0x00000010) #define IS_CMP_InvInSel2(x) (0) @@ -247,6 +283,7 @@ typedef enum #endif #define IS_CMP_InvInputSelection(x) ((x == CMP_EXTERNAL_CN_IN) || (x == CMP_SCALER_CN_IN) || IS_CMP_InvInSel2(x)) +#endif /* Definitions of CMP Hysteresis Level Selection */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h index 0ee8ba77d7..d3b2c90180 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_flash.h - * @version $Rev:: 5496 $ - * @date $Date:: 2021-07-19 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the FLASH library. ************************************************************************************************************* * @attention @@ -97,8 +97,13 @@ typedef struct #if (LIBCFG_FMC_WAIT_STATE_2) #define FLASH_WAITSTATE_2 (0x00000003) /* FLASH two wait state */ #endif +#if (LIBCFG_FMC_WAIT_STATE_3) +#define FLASH_WAITSTATE_3 (0x00000004) /* FLASH three wait state */ +#endif -#if (LIBCFG_FMC_WAIT_STATE_2) +#if (LIBCFG_FMC_WAIT_STATE_3) +#define FLASH_WAITSTATE_MAX (FLASH_WAITSTATE_3) +#elif (LIBCFG_FMC_WAIT_STATE_2) #define FLASH_WAITSTATE_MAX (FLASH_WAITSTATE_2) #else #define FLASH_WAITSTATE_MAX (FLASH_WAITSTATE_1) @@ -159,7 +164,7 @@ void FLASH_PrefetchBufferCmd(ControlStatus NewState); #if (LIBCFG_FMC_BRANCHCACHE) void FLASH_BranchCacheCmd(ControlStatus NewState); #endif -void FLASH_SetRemappingMode(FLASH_Vector RemapMode); +void FLASH_SetRemappingMode(FLASH_Vector FLASH_BOOT_x); FLASH_State FLASH_ErasePage(u32 PageAddress); FLASH_State FLASH_EraseOptionByte(void); FLASH_State FLASH_MassErase(void); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h index 42f274c4e7..8d0bc22df9 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_gpio.h - * @version $Rev:: 7115 $ - * @date $Date:: 2023-08-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the GPIO and AFIO library. ************************************************************************************************************* * @attention @@ -166,7 +166,15 @@ typedef enum #else #define AFIO_FUN_LEDC AFIO_MODE_14 /*!< AFIO mode LEDC */ #endif +#if ((LIBCFG_CMP) && (LIBCFG_OPA)) +#define AFIO_FUN_CMP AFIO_FUN_CMP_OPA /*!< AFIO mode CMP */ +#define AFIO_FUN_OPA AFIO_FUN_CMP_OPA /*!< AFIO mode OPA */ +#elif ((LIBCFG_CMP) && (LIBCFG_PGA)) +#define AFIO_FUN_CMP AFIO_FUN_CMP_PGA /*!< AFIO mode CMP */ +#define AFIO_FUN_PGA AFIO_FUN_CMP_PGA /*!< AFIO mode PGA */ +#elif (LIBCFG_CMP) #define AFIO_FUN_CMP AFIO_MODE_3 /*!< AFIO mode CMP */ +#endif #define AFIO_FUN_MCTM_GPTM AFIO_MODE_4 /*!< AFIO mode MCTM/GPTM */ #if (LIBCFG_AFIO_SCTM_MODE4) #define AFIO_FUN_SCTM AFIO_MODE_4 /*!< AFIO mode SCTM */ @@ -184,7 +192,11 @@ typedef enum #define AFIO_FUN_USART_UART AFIO_MODE_6 /*!< AFIO mode USART/UART */ #define AFIO_FUN_I2C AFIO_MODE_7 /*!< AFIO mode I2C */ #define AFIO_FUN_SCI AFIO_MODE_8 /*!< AFIO mode SCI */ +#if ((LIBCFG_CMP) && (LIBCFG_OPA)) #define AFIO_FUN_CMP_OPA AFIO_MODE_8 /*!< AFIO mode CMP/OPA */ +#elif ((LIBCFG_CMP) && (LIBCFG_PGA)) +#define AFIO_FUN_CMP_PGA AFIO_MODE_8 /*!< AFIO mode CMP/PGA */ +#endif #define AFIO_FUN_EBI AFIO_MODE_9 /*!< AFIO mode EBI */ #define AFIO_FUN_I2S AFIO_MODE_10 /*!< AFIO mode I2S */ #define AFIO_FUN_CAN AFIO_MODE_12 /*!< AFIO mode CAN */ @@ -465,7 +477,7 @@ void GPIO_PullResistorConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, GP void GPIO_InputConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, ControlStatus Cmd); void GPIO_DriveConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, GPIO_DV_Enum GPIO_DV_nMA); void GPIO_OpenDrainConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, ControlStatus Cmd); -#if LIBCFG_GPIO_SINK_CURRENT_ENHANCED +#if (LIBCFG_GPIO_SINK_CURRENT_ENHANCED) void GPIO_SinkConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_n, ControlStatus Cmd); #endif FlagStatus GPIO_ReadInBit(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_n); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h index 1f822f93d6..af864739f4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_i2c.h - * @version $Rev:: 7104 $ - * @date $Date:: 2023-08-08 #$ + * @version $Rev:: 7698 $ + * @date $Date:: 2024-04-15 #$ * @brief The header file of the I2C library. ************************************************************************************************************* * @attention @@ -347,7 +347,7 @@ typedef enum #define SEQ_FILTER_2_PCLK ((u32)0x00008000) #define IS_I2C_SEQ_FILTER_MASK(CONFIG) ((CONFIG == SEQ_FILTER_DISABLE) || \ - (CONFIG == SEQ_FILTER_1_PCLK) || \ + (CONFIG == SEQ_FILTER_1_PCLK) || \ (CONFIG == SEQ_FILTER_2_PCLK)) /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h index b04cdb33a4..d49a8a111d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_lib.h - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 7924 $ + * @date $Date:: 2024-08-07 #$ * @brief The header file includes all the header files of the libraries. ************************************************************************************************************* * @attention @@ -34,8 +34,8 @@ #endif /* Settings ------------------------------------------------------------------------------------------------*/ -#define HT32_FWLIB_VER (0x01009001) -#define HT32_FWLIB_SVN (0x7446) +#define HT32_FWLIB_VER (0x01014003) +#define HT32_FWLIB_SVN (0x8294) #if defined(USE_HT32F52220_30) #include "ht32f52220_30_libcfg.h" @@ -179,6 +179,10 @@ void assert_error(u8* file, u32 line); #include "ht32f5xxxx_cmp.h" #endif +#if _CORDIC && LIBCFG_CORDIC + #include "ht32f66xxx_cordic.h" +#endif + #if _CRC && LIBCFG_CRC #include "ht32f5xxxx_crc.h" #endif @@ -253,6 +257,14 @@ void assert_error(u8* file, u32 line); #include "ht32f5xxxx_pdma.h" #endif +#if _PGA && LIBCFG_PGA + #include "ht32f65xxx_66xxx_pga.h" +#endif + +#if _PID && LIBCFG_PID + #include "ht32f66xxx_pid.h" +#endif + #if _PWRCU #include "ht32f5xxxx_pwrcu.h" #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h index cbea7b628b..42da0d5588 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_mctm.h - * @version $Rev:: 5258 $ - * @date $Date:: 2021-02-04 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the MCTM library. ************************************************************************************************************* * @attention @@ -75,7 +75,7 @@ typedef union /* Definitions of CHBRKCTR */ unsigned long Break0 :1; // BK0E unsigned long Break0Polarity :1; // BK0P - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) unsigned long Break1 :1; // BK1E unsigned long Break1Polarity :1; // BK1E #else @@ -84,7 +84,7 @@ typedef union #endif unsigned long :1; // CHMOE unsigned long AutomaticOutput :1; // CHAOE - #if (LIBCFG_TM_65232) + #if (LIBCFG_TM_BK_FROM_CMP) unsigned long Break0FromCMP0 :1; // BK0CMP0 unsigned long Break0FromCMP1 :1; // BK0CMP1 #else @@ -92,7 +92,7 @@ typedef union unsigned long :1; #endif - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) unsigned long Break0EventCount :2; // BK0FN unsigned long Break0FDiv :2; // BK0FF unsigned long Break1EventCount :2; // BK1FN @@ -103,11 +103,11 @@ typedef union #endif unsigned long LockLevel :2; // LOCKLV - unsigned long DeglitchFilte :1; // GFSEL + unsigned long DeglitchFilter :1; // GFSEL unsigned long :1; unsigned long OSSIState :1; // CHOSSI unsigned long OSSRState :1; // CHOSSR - #if (LIBCFG_TM_65232) + #if (LIBCFG_TM_BK_FROM_CMP) unsigned long Break1FromCMP0 :1; // BK1CMP0 unsigned long Break1FromCMP1 :1; // BK1CMP1 #else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h index 1dbea97ba3..35cba593cd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_pdma.h - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the PDMA library. ************************************************************************************************************* * @attention @@ -134,7 +134,7 @@ typedef struct #define PDMA_DAC1_CH1 PDMA_CH5 /*!< DAC1 CH1 PDMA channel number */ #endif -#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F0006) || defined(USE_HT32F61244_45) +#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F0006) || defined(USE_HT32F61244_45) || defined(USE_HT32F66242) || defined (USE_HT32F66246) #define PDMA_SPI0_RX PDMA_CH4 /*!< SPI0_RX PDMA channel number */ #define PDMA_SPI0_TX PDMA_CH5 /*!< SPI0_TX PDMA channel number */ #elif defined(USE_HT32F57342_52) || defined(USE_HT32F52357_67) || defined(USE_HT32F67041_51) || defined(USE_HT32F52234_44) @@ -196,6 +196,7 @@ typedef struct #endif #endif +#if (LIBCFG_I2C2) #if defined(USE_HT32F52243_53) || defined(USE_HT32F54243_53) #define PDMA_I2C2_RX PDMA_CH0 /*!< I2C2_RX PDMA channel number */ #define PDMA_I2C2_TX PDMA_CH1 /*!< I2C2_TX PDMA channel number */ @@ -203,6 +204,7 @@ typedef struct #define PDMA_I2C2_RX PDMA_CH4 /*!< I2C2_RX PDMA channel number */ #define PDMA_I2C2_TX PDMA_CH5 /*!< I2C2_TX PDMA channel number */ #endif +#endif #if defined(USE_HT32F52342_52) || defined(USE_HT32F5826) || defined(USE_HT32F57342_52) || defined(USE_HT32F52357_67) #define PDMA_SCI0_TX PDMA_CH5 /*!< SCI0_TX PDMA channel number */ @@ -228,7 +230,7 @@ typedef struct #if (LIBCFG_NO_GPTM0) #else -#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) +#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F66242) || defined (USE_HT32F66246) #define PDMA_GPTM0_CH1 PDMA_CH0 /*!< GPTM0_CH1 PDMA channel number */ #define PDMA_GPTM0_CH2 PDMA_CH1 /*!< GPTM0_CH2 PDMA channel number */ #define PDMA_GPTM0_CH0 PDMA_CH2 /*!< GPTM0_CH0 PDMA channel number */ @@ -254,7 +256,7 @@ typedef struct #define PDMA_GPTM1_TRIG PDMA_CH5 /*!< GPTM1_TRIG PDMA channel number */ #endif -#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) +#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F66242) || defined (USE_HT32F66246) #define PDMA_SCTM0_CH0 PDMA_CH0 /*!< SCTM0_CH0 PDMA channel number */ #define PDMA_SCTM0_CH1 PDMA_CH1 /*!< SCTM0_CH1 PDMA channel number */ #define PDMA_SCTM1_CH0 PDMA_CH2 /*!< SCTM1_CH0 PDMA channel number */ @@ -318,6 +320,11 @@ typedef struct #define PDMA_MIDI_OUT PDMA_CH4 /*!< MIDI_OUT PDMA channel number */ #endif +#if (LIBCFG_CORDIC) +#define PDMA_CORDIC_WR PDMA_CH4 /*!< CORDIC_WR PDMA channel number */ +#define PDMA_CORDIC_RD PDMA_CH5 /*!< CORDIC_RD PDMA channel number */ +#endif + /* flag */ #define PDMA_FLAG_GE (1UL << 0) /*!< PDMA channel global event flag */ #define PDMA_FLAG_BE (1UL << 1) /*!< PDMA channel block end flag */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h index a98fb16289..45eba73ee5 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_pwrcu.h - * @version $Rev:: 7054 $ - * @date $Date:: 2023-07-24 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the Power Control Unit library. ************************************************************************************************************* * @attention @@ -64,6 +64,7 @@ typedef enum PWRCU_WAKEUP_PIN_1 #endif } PWRCU_WUP_Enum; + /** * @brief Wakeup pin trigger type selection */ @@ -82,6 +83,8 @@ typedef enum PWRCU_TIMEOUT, /*!< Time out */ PWRCU_ERROR /*!< Error */ } PWRCU_Status; + +#if (!LIBCFG_PWRCU_NO_DS2_MODE) /** * @brief DMOS status */ @@ -91,6 +94,8 @@ typedef enum PWRCU_DMOS_STS_OFF, /*!< DMOS off */ PWRCU_DMOS_STS_OFF_BY_BODRESET /*!< DMOS off caused by brow out reset */ } PWRCU_DMOSStatus; +#endif + /** * @brief LVD level selection */ @@ -105,6 +110,7 @@ typedef enum PWRCU_LVDS_LV7 = 0x00440000, /*!< LVD level 7 */ PWRCU_LVDS_LV8 = 0x00460000 /*!< LVD level 8 */ } PWRCU_LVDS_Enum; + #if (LIBCFG_PWRCU_VDD_5V) #define PWRCU_LVDS_2V65 PWRCU_LVDS_LV1 #define PWRCU_LVDS_2V85 PWRCU_LVDS_LV2 @@ -133,6 +139,7 @@ typedef enum #define PWRCU_LVDS_2V95 PWRCU_LVDS_LV7 #define PWRCU_LVDS_3V15 PWRCU_LVDS_LV8 #endif + /** * @brief BOD reset or interrupt selection */ @@ -141,6 +148,7 @@ typedef enum PWRCU_BODRIS_RESET = 0, /*!< Reset the whole chip */ PWRCU_BODRIS_INT = 1, /*!< Assert interrupt */ } PWRCU_BODRIS_Enum; + /** * @brief Sleep entry instruction selection */ @@ -149,6 +157,7 @@ typedef enum PWRCU_SLEEP_ENTRY_WFE = 0, /*!< Sleep then wait for event */ PWRCU_SLEEP_ENTRY_WFI /*!< Sleep then wait for interrupt */ } PWRCU_SLEEP_ENTRY_Enum; + #if (LIBCFG_BAKREG) /** * @brief Backup register selection @@ -167,6 +176,8 @@ typedef enum PWRCU_BAKREG_9 } PWRCU_BAKREG_Enum; #endif + +#if (LIBCFG_PWRCU_V15_READY_SOURCE) /** * @brief Vdd15 power good source selection */ @@ -175,6 +186,8 @@ typedef enum PWRCU_V15RDYSC_V33ISO = 0, /*!< Vdd15 power good source come from BK_ISO bit in CKCU unit */ PWRCU_V15RDYSC_V15POR /*!< Vdd15 power good source come from Vdd15 power on reset */ } PWRCU_V15RDYSC_Enum; +#endif + /** * @brief LDO operation mode selection */ @@ -183,6 +196,7 @@ typedef enum PWRCU_LDO_NORMAL = 0, /*!< The LDO is operated in normal current mode */ PWRCU_LDO_LOWCURRENT /*!< The LDO is operated in low current mode */ } PWRCU_LDOMODE_Enum; + #if defined(USE_HT32F52342_52) || defined(USE_HT32F5826) /** * @brief HSI ready counter bit length selection @@ -195,6 +209,7 @@ typedef enum PWRCU_HSIRCBL_7 /*!< 7 bits (Default) */ } PWRCU_HSIRCBL_Enum; #endif + #if (LIBCFG_PWRCU_VREG) /** * @brief VREG output voltage selection @@ -210,6 +225,7 @@ typedef enum PWRCU_VREG_3V0 = 0x04000000, /*!< VREG output voltage is 3.0 V */ PWRCU_VREG_1V8 = 0x0C000000, /*!< VREG output voltage is 1.8 V */ } PWRCU_VREG_VOLT_Enum; + /** * @brief VREG operation mode */ @@ -220,6 +236,7 @@ typedef enum PWRCU_VREG_BYPASS = 0x02000000, /*!< VREG is bypassed */ } PWRCU_VREG_MODE_Enum; #endif + /** * @} */ @@ -254,17 +271,23 @@ typedef enum /* check PWRCU_BODRIS parameter */ #define IS_PWRCU_BODRIS(x) ((x == PWRCU_BODRIS_RESET) || (x == PWRCU_BODRIS_INT)) +#if defined(USE_HT32F52342_52) || defined(USE_HT32F5826) /* check PWRCU_HSIRCBL parameter */ #define IS_PWRCU_HSIRCBL(x) (x <= 3) +#endif /* check PWRCU_SLEEP_ENTRY parameter */ #define IS_PWRCU_SLEEP_ENTRY(x) ((x == PWRCU_SLEEP_ENTRY_WFI) || (x == PWRCU_SLEEP_ENTRY_WFE)) +#if (LIBCFG_BAKREG) /* check PWRCU_BAKREG parameter */ #define IS_PWRCU_BAKREG(x) (x < 10) +#endif +#if (LIBCFG_PWRCU_V15_READY_SOURCE) /* check PWRCU_V15RDY_SRC parameter */ #define IS_PWRCU_V15RDYSC(x) ((x == PWRCU_V15RDYSC_V33ISO) || (x == PWRCU_V15RDYSC_V15POR)) +#endif /* check PWRCU_LDOMODE parameter */ #define IS_PWRCU_LDOMODE(x) ((x == PWRCU_LDO_NORMAL) || (x == PWRCU_LDO_LOWCURRENT)) @@ -324,10 +347,12 @@ void PWRCU_WriteBackupRegister(PWRCU_BAKREG_Enum BAKREGx, u32 DATA); #endif void PWRCU_Sleep(PWRCU_SLEEP_ENTRY_Enum SleepEntry); void PWRCU_DeepSleep1(PWRCU_SLEEP_ENTRY_Enum SleepEntry); +#if (!LIBCFG_PWRCU_NO_DS2_MODE) void PWRCU_DeepSleep2(PWRCU_SLEEP_ENTRY_Enum SleepEntry); #if !defined(USE_HT32F52220_30) void PWRCU_DeepSleep2Ex(PWRCU_SLEEP_ENTRY_Enum SleepEntry); #endif +#endif #if (!LIBCFG_PWRCU_NO_PD_MODE) void PWRCU_PowerDown(void); #endif @@ -338,8 +363,10 @@ void PWRCU_BODCmd(ControlStatus NewState); void PWRCU_BODRISConfig(PWRCU_BODRIS_Enum Selection); FlagStatus PWRCU_GetLVDFlagStatus(void); FlagStatus PWRCU_GetBODFlagStatus(void); +#if (!LIBCFG_PWRCU_NO_DS2_MODE) PWRCU_DMOSStatus PWRCU_GetDMOSStatus(void); void PWRCU_DMOSCmd(ControlStatus NewState); +#endif #if (LIBCFG_PWRCU_V15_READY_SOURCE) void PWRCU_V15RDYSourceConfig(PWRCU_V15RDYSC_Enum Sel); #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h index 60eabde780..907452261a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_rstcu.h - * @version $Rev:: 7115 $ - * @date $Date:: 2023-08-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the Reset Control Unit library. ************************************************************************************************************* * @attention @@ -87,7 +87,7 @@ typedef union unsigned long :1; // Bit 14 unsigned long AES :1; // Bit 15 - #ifdef USE_HT32F65230_40 + #if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) unsigned long DIV :1; // Bit 16 #else unsigned long :1; // Bit 16 @@ -100,7 +100,7 @@ typedef union unsigned long :1; // Bit 22 unsigned long :1; // Bit 23 - #ifndef USE_HT32F65230_40 + #if !defined(USE_HT32F65230_40) && !defined(USE_HT32F65232) unsigned long DIV :1; // Bit 24 #else unsigned long :1; // Bit 24 @@ -108,8 +108,8 @@ typedef union unsigned long QSPI :1; // Bit 25 unsigned long RF :1; // Bit 26 unsigned long :1; // Bit 27 - unsigned long :1; // Bit 28 - unsigned long :1; // Bit 29 + unsigned long CORDIC :1; // Bit 28 + unsigned long PID0 :1; // Bit 29 unsigned long :1; // Bit 30 unsigned long :1; // Bit 31 @@ -176,8 +176,11 @@ typedef union unsigned long :1; // Bit 20 unsigned long DAC0 :1; // Bit 21 unsigned long CMP :1; // Bit 22 + #if defined(USE_HT32F66242) || defined(USE_HT32F66246) + unsigned long PGA :1; // Bit 23 + #else unsigned long OPA :1; // Bit 23 - + #endif unsigned long ADC0 :1; // Bit 24 unsigned long ADC1 :1; // Bit 25 unsigned long :1; // Bit 26 diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h index 0677ae6717..3544ae3744 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_rtc.h - * @version $Rev:: 7278 $ - * @date $Date:: 2023-10-04 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the RTC library. ************************************************************************************************************* * @attention @@ -60,6 +60,8 @@ typedef enum RTC_SRC_LSE /*!< Low speed external 32768 Hz clock */ #endif } RTC_SRC_Enum; + +#if (LIBCFG_LSE) /** * @brief Selection of RTC LSE startup mode */ @@ -68,6 +70,7 @@ typedef enum RTC_LSESM_NORMAL = 0, /*!< Little power consumption but longer startup time. */ RTC_LSESM_FAST /*!< Shortly startup time but higher power consumption. */ } RTC_LSESM_Enum; +#endif /** * @brief Selection of RTC prescaler */ @@ -107,7 +110,7 @@ typedef enum RTC_ROWM_LEVEL /*!< Level mode. */ } RTC_ROWM_Enum; /** - * @brief Waveform mode of RTC output + * @brief Event selection of RTC output */ typedef enum { @@ -166,10 +169,13 @@ typedef enum #define IS_RTC_SRC_LSE(x) (0) #endif #define IS_RTC_SRC(x) ((x == RTC_SRC_LSI) || IS_RTC_SRC_LSE(x)) + +#if (LIBCFG_LSE) /** * @brief Used to check RTC_LSESM_Enum parameter */ #define IS_RTC_LSESM(x) ((x == RTC_LSESM_NORMAL) || (x == RTC_LSESM_FAST)) +#endif /** * @brief Used to check RTC_RPRE_Enum parameter */ @@ -220,7 +226,9 @@ void RTC_ClockSourceConfig(RTC_SRC_Enum Source); #if (LIBCFG_RTC_LSI_LOAD_TRIM) void RTC_LSILoadTrimData(void); #endif +#if (LIBCFG_LSE) void RTC_LSESMConfig(RTC_LSESM_Enum Mode); +#endif void RTC_LSECmd(ControlStatus NewState); void RTC_CMPCLRCmd(ControlStatus NewState); void RTC_SetPrescaler(RTC_RPRE_Enum Psc); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h index eb0d814f23..a94a2118f2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_tm.h - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the TM library. ************************************************************************************************************* * @attention @@ -103,7 +103,7 @@ typedef enum TM_CHPSC_4 = 0x00080000, /*!< TM channel capture is done once every 4 event */ TM_CHPSC_8 = 0x000C0000 /*!< TM channel capture is done once every 8 event */ } TM_CHPSC_Enum; -#if (LIBCFG_TM_652XX_V1) +#if (LIBCFG_TM_65X_66X_V1) /** * @brief Enumeration of TM channel Filter (Fsampling) Clock Divider. */ @@ -176,7 +176,7 @@ typedef enum TM_CKDIV_OFF = 0x0000, /*!< fDTS = fCLKIN */ TM_CKDIV_2 = 0x0100, /*!< fDTS = fCLKIN / 2 */ TM_CKDIV_4 = 0x0200, /*!< fDTS = fCLKIN / 4 */ - #if (LIBCFG_TM_652XX_V1 || LIBCFG_TM_CKDIV_8) + #if (LIBCFG_TM_65X_66X_V1 || LIBCFG_TM_CKDIV_8) TM_CKDIV_8 = 0x0300, /*!< fDTS = fCLKIN / 8 */ #endif } TM_CKDIV_Enum; @@ -237,7 +237,7 @@ typedef enum TM_SMSEL_PAUSE = 0x0500, /*!< Slave pause mode */ TM_SMSEL_TRIGGER = 0x0600, /*!< Slave trigger mode */ TM_SMSEL_STIED = 0x0700, /*!< Rising edge of the selected trigger(STI) clock the counter */ - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) TM_SMSEL_DECODER4 = 0x0800, /*!< Pluse/Direction mode(Counter counts on Ch0, Count up/down on Ch1 */ #endif } TM_SMSEL_Enum; @@ -254,7 +254,7 @@ typedef enum TM_MMSEL_CH1OREF = 0x00050000, /*!< The CH1OREF signal is used as trigger output. */ TM_MMSEL_CH2OREF = 0x00060000, /*!< The CH2OREF signal is used as trigger output. */ TM_MMSEL_CH3OREF = 0x00070000, /*!< The CH3OREF signal is used as trigger output. */ - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) TM_MMSEL_VCLK = 0x000C0000 /*!< The VCLK signal is used as trigger output. */ #endif #if (LIBCFG_PWM_8_CHANNEL) @@ -314,7 +314,7 @@ typedef struct TM_CHP_Enum Polarity; /*!< Channel input polarity refer to \ref TM_CHP_Enum */ TM_CHCCS_Enum Selection; /*!< Channel capture source selection refer to \ref TM_CHCCS_Enum */ TM_CHPSC_Enum Prescaler; /*!< Channel Capture prescaler refer to \ref TM_CHPSC_Enum */ - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) TM_CHFDIV_Enum Fsampling; /*!< Digital filter Fsampling Frequency, it must fDTS/1 ~ fDTS/64 */ #if (LIBCFG_TM_TIFN_5BIT) u8 Event; /*!< Digital filter N-event counter Setting, it must be 0 ~ 31 */ @@ -352,7 +352,7 @@ typedef struct #define TM_INT_TEV 0x0400 /*!< Trigger interrupt */ #define TM_INT_BRKEV 0x0800 /*!< Break interrupt */ -#if (LIBCFG_TM_652XX_V1) +#if (LIBCFG_TM_65X_66X_V1) #define MCTM_INT_CH0CD 0x100000 /*!< Channel 0 Count-Down compare interrupt */ #define MCTM_INT_CH1CD 0x200000 /*!< Channel 1 Count-Down compare interrupt */ #define MCTM_INT_CH2CD 0x400000 /*!< Channel 2 Count-Down compare interrupt */ @@ -365,7 +365,7 @@ typedef struct #define MCTM_INT_OVER 0x2000 /*!< Counter overflow interrupt */ #define MCTM_INT_UNDER 0x4000 /*!< Counter underflow Interrupt */ -#if (LIBCFG_TM_65232) +#if (LIBCFG_TM_RECCDI) #define MCTM_INT_RECCDIF 0x8000 /*!< CCIF or CDIF Interrupt flag control by REPR */ #endif @@ -512,11 +512,11 @@ typedef struct * @brief Used to check parameter of the output compare mode. */ #define IS_TM_OM_CMP(x) (((x) == TM_OM_MATCH_NOCHANGE) || \ - ((x) == TM_OM_MATCH_INACTIVE) || \ - ((x) == TM_OM_MATCH_ACTIVE) || \ - ((x) == TM_OM_MATCH_TOGGLE) || \ - ((x) == TM_OM_PWM1) || \ - ((x) == TM_OM_PWM2)) + ((x) == TM_OM_MATCH_INACTIVE) || \ + ((x) == TM_OM_MATCH_ACTIVE) || \ + ((x) == TM_OM_MATCH_TOGGLE) || \ + ((x) == TM_OM_PWM1) || \ + ((x) == TM_OM_PWM2)) /** * @brief Used to check parameter of the output mode. */ @@ -586,7 +586,7 @@ typedef struct /** * @brief Used to check parameter of the counter mode. */ -#define IS_TM_CNT_MODE(x) ((x == TM_CNT_MODE_UP) || \ +#define IS_TM_CNT_MODE(x) ((x == TM_CNT_MODE_UP) || \ (x == TM_CNT_MODE_CA1) || \ (x == TM_CNT_MODE_CA2) || \ (x == TM_CNT_MODE_CA3) || \ @@ -606,24 +606,24 @@ typedef struct /** * @brief Used to check parameter of the channel input selection. */ -#define IS_TM_CHCCS(x) ((x == TM_CHCCS_DIRECT) || \ - (x == TM_CHCCS_INDIRECT) || \ - (x == TM_CHCCS_TRCED)) +#define IS_TM_CHCCS(x) ((x == TM_CHCCS_DIRECT) || \ + (x == TM_CHCCS_INDIRECT) || \ + (x == TM_CHCCS_TRCED)) /** * @brief Used to check parameter of the channel capture prescaler. */ #define IS_TM_CHPSC(x) ((x == TM_CHPSC_OFF) || \ - (x == TM_CHPSC_2) || \ - (x == TM_CHPSC_4) || \ - (x == TM_CHPSC_8)) + (x == TM_CHPSC_2) || \ + (x == TM_CHPSC_4) || \ + (x == TM_CHPSC_8)) #if 0 /** * @brief Used to check parameter of the ETI prescaler. */ #define IS_TM_ETIPSC(x) ((x == TM_ETIPSC_OFF) || \ - (x == TM_ETIPSC_2) || \ - (x == TM_ETIPSC_4) || \ - (x == TM_ETIPSC_8)) + (x == TM_ETIPSC_2) || \ + (x == TM_ETIPSC_4) || \ + (x == TM_ETIPSC_8)) #endif /** * @brief Used to check parameter of the TM interrupt. @@ -804,7 +804,7 @@ typedef struct /** * @brief Used to check value of TM digital filter. */ -#if (LIBCFG_TM_652XX_V1) +#if (LIBCFG_TM_65X_66X_V1) #define IS_TM_FILTER(x) (x <= 0xFF) #else #define IS_TM_FILTER(x) (x <= 0xF) @@ -886,7 +886,9 @@ void TM_DecoderConfig(HT_TM_TypeDef* TMx, TM_SMSEL_Enum DecoderMod, TM_CHP_Enum void TM_ForcedOREF(HT_TM_TypeDef* TMx, TM_CH_Enum TM_CH_n, TM_OM_Enum ForcedAction); void TM_CRRPreloadCmd(HT_TM_TypeDef* TMx, ControlStatus NewState); void TM_CHCCRPreloadConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus NewState); +#if 0 // M0+ not supported void TM_ClearOREFConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus NewState); +#endif void TM_ChPolarityConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, TM_CHP_Enum Pol); void TM_ImmActiveConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus NewState); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h index ae5fdd1c5e..ed96545ac7 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_wdt.h - * @version $Rev:: 1704 $ - * @date $Date:: 2017-08-17 #$ + * @version $Rev:: 7779 $ + * @date $Date:: 2024-06-24 #$ * @brief The header file of the WDT library. ************************************************************************************************************* * @attention @@ -72,14 +72,17 @@ /* WDT runs or halts in sleep and deep sleep1 mode */ /* WDT WDTSHLT mask */ -#define MODE0_WDTSHLT_BOTH ((u32)0x00000000) -#define MODE0_WDTSHLT_SLEEP ((u32)0x00004000) -#define MODE0_WDTSHLT_HALT ((u32)0x00008000) +#define WDT_SLEEP_HALT_NONE ((u32)0x00000000) +#define WDT_SLEEP_HALT_DEEPSLEEP ((u32)0x00004000) +#define WDT_SLEEP_HALT_ALL ((u32)0x00008000) -#define IS_WDT_WDTSHLT_MODE(WDT_Mode) ((WDT_Mode == MODE0_WDTSHLT_BOTH) || \ - (WDT_Mode == MODE0_WDTSHLT_SLEEP) || \ - (WDT_Mode == MODE0_WDTSHLT_HALT)) +#define MODE0_WDTSHLT_BOTH WDT_SLEEP_HALT_NONE +#define MODE0_WDTSHLT_SLEEP WDT_SLEEP_HALT_DEEPSLEEP +#define MODE0_WDTSHLT_HALT WDT_SLEEP_HALT_ALL +#define IS_WDT_WDTSHLT_MODE(WDT_Mode) ((WDT_Mode == WDT_SLEEP_HALT_NONE) || \ + (WDT_Mode == WDT_SLEEP_HALT_DEEPSLEEP) || \ + (WDT_Mode == WDT_SLEEP_HALT_ALL)) /* WDT Flag */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65230_40_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65230_40_libcfg.h index bbf4192d74..df5f4dfa9f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65230_40_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65230_40_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65230_40_libcfg.h - * @version $Rev:: 7184 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -56,12 +56,13 @@ #define LIBCFG_BFTM1 (1) #define LIBCFG_CKCU_ATM_V01 (1) #define LIBCFG_CKCU_NO_ADCPRE_DIV1 (1) +#define LIBCFG_CKCU_NO_LPCR (1) #define LIBCFG_CKCU_PLLSRCDIV (1) #define LIBCFG_CKCU_SYS_CK_60M (1) #define LIBCFG_CMP (1) #define LIBCFG_CMP2 (1) #define LIBCFG_CMP_NOSCALER_SRC (1) -#define LIBCFG_CMP_65x_VER (1) +#define LIBCFG_CMP_65x_66x_VER (1) #define LIBCFG_CRC (1) #define LIBCFG_DIV (1) #define LIBCFG_EXTI_4_9_GROUP (1) @@ -75,6 +76,7 @@ #define LIBCFG_MCTM_UEV1DIS (1) #define LIBCFG_PWRCU_NO_PD_MODE (1) #define LIBCFG_PWRCU_NO_PDF (1) +#define LIBCFG_PWRCU_NO_DS2_MODE (1) #define LIBCFG_PWRCU_NO_VDDPORF (1) #define LIBCFG_NO_PWRCU_TEST_REG (1) #define LIBCFG_OPA (1) @@ -85,7 +87,7 @@ #define LIBCFG_SCTM1 (1) #define LIBCFG_SCTM2 (1) #define LIBCFG_SCTM3 (1) -#define LIBCFG_TM_652XX_V1 (1) +#define LIBCFG_TM_65X_66X_V1 (1) #define LIBCFG_PWRCU_VDD_5V (1) #define LIBCFG_PWRCU_NO_PORF (1) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h index 8787c99413..6909553bc4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65232_libcfg.h - * @version $Rev:: 6932 $ - * @date $Date:: 2023-05-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -52,11 +52,12 @@ #define LIBCFG_BFTM1 (1) #define LIBCFG_CKCU_ATM_V01 (1) #define LIBCFG_CKCU_NO_ADCPRE_DIV1 (1) +#define LIBCFG_CKCU_NO_LPCR (1) #define LIBCFG_CKCU_PLLSRCDIV (1) #define LIBCFG_CKCU_SYS_CK_60M (1) #define LIBCFG_CMP (1) #define LIBCFG_CMP_NOSCALER_SRC (1) -#define LIBCFG_CMP_65x_VER (1) +#define LIBCFG_CMP_65x_66x_VER (1) #define LIBCFG_CMP_POS_INPUT_SEL_V2 (1) #define LIBCFG_CMP_CO (1) #define LIBCFG_CMP_SCALER_8BIT (1) @@ -72,6 +73,7 @@ #define LIBCFG_MCTM_UEV1DIS (1) #define LIBCFG_PWRCU_NO_PD_MODE (1) #define LIBCFG_PWRCU_NO_PDF (1) +#define LIBCFG_PWRCU_NO_DS2_MODE (1) #define LIBCFG_PWRCU_NO_VDDPORF (1) #define LIBCFG_NO_PWRCU_TEST_REG (1) #define LIBCFG_OPA (1) @@ -81,10 +83,9 @@ #define LIBCFG_SCTM1 (1) #define LIBCFG_SCTM2 (1) #define LIBCFG_SCTM3 (1) -#define LIBCFG_TM_652XX_V1 (1) -#define LIBCFG_TM_65232 (1) +#define LIBCFG_TM_65X_66X_V1 (1) +#define LIBCFG_TM_BK_FROM_CMP (1) #define LIBCFG_TM_TIFN_5BIT (1) #define LIBCFG_PWRCU_VDD_5V (1) -#define LIBCFG_PWRCU_NO_PORF (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_adc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_adc.h index 0b0313fc40..35f8689af8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_adc.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_adc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_adc.h - * @version $Rev:: 7058 $ - * @date $Date:: 2023-07-27 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the ADC library. ************************************************************************************************************* * @attention @@ -67,6 +67,7 @@ ((HP_MODE) == CONTINUOUS_MODE) || \ ((HP_MODE) == DISCONTINUOUS_MODE)) +#if (LIBCFG_ADC1) #define DUAL_INDEPENDENT (0x00000000) #define DUAL_CASCADE_REGULAR (0x00000001) #define DUAL_CASCADE_REGULAR_H_PRIORITY (0x00000003) @@ -74,6 +75,7 @@ #define IS_ADC_DUAL_MODE(DUAL_MODE) (((DUAL_MODE) == DUAL_INDEPENDENT) || \ ((DUAL_MODE) == DUAL_CASCADE_REGULAR) || \ ((DUAL_MODE) == DUAL_CASCADE_REGULAR_H_PRIORITY)) +#endif #if (LIBCFG_ADC_CH_65232) #define ADC_CH_0 (0) @@ -106,6 +108,44 @@ ((CHANNEL) == ADC_CH_4) || ((CHANNEL) == ADC_CH_5) || \ ((CHANNEL) == ADC_CH_6) || ((CHANNEL) == ADC_CH_7) || \ ((CHANNEL) == ADC_CH_OPA0)) +#elif (LIBCFG_ADC_CH_66XXX_V1) +#define ADC_CH_0 (0) +#define ADC_CH_1 (1) +#define ADC_CH_2 (2) +#define ADC_CH_3 (3) +#define ADC_CH_4 (4) +#define ADC_CH_5 (5) +#define ADC_CH_6 (6) +#define ADC_CH_7 (7) +#define ADC_CH_8 (8) +#define ADC_CH_9 (9) +#define ADC_CH_10 (10) +#define ADC_CH_11 (11) +#define ADC_CH_PGA0O (12) +#define ADC_CH_PGA1O (13) +#define ADC_CH_PGA2O (14) +#define ADC_CH_PGA3O (15) +#define ADC_CH_BANDGAP (16) +#define ADC_CH_MVDDA (17) + +#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_CH_0) || ((CHANNEL) == ADC_CH_1) || \ + ((CHANNEL) == ADC_CH_2) || ((CHANNEL) == ADC_CH_3) || \ + ((CHANNEL) == ADC_CH_4) || ((CHANNEL) == ADC_CH_5) || \ + ((CHANNEL) == ADC_CH_6) || ((CHANNEL) == ADC_CH_7) || \ + ((CHANNEL) == ADC_CH_8) || ((CHANNEL) == ADC_CH_9) || \ + ((CHANNEL) == ADC_CH_10) || ((CHANNEL) == ADC_CH_11) || \ + ((CHANNEL) == ADC_CH_PGA0O) || ((CHANNEL) == ADC_CH_PGA1O) || \ + ((CHANNEL) == ADC_CH_PGA2O) || ((CHANNEL) == ADC_CH_PGA3O) || \ + ((CHANNEL) == ADC_CH_BANDGAP) || ((CHANNEL) == ADC_CH_MVDDA)) + +#define IS_ADC_INPUT_CHANNEL(CHANNEL) (((CHANNEL) == ADC_CH_0) || ((CHANNEL) == ADC_CH_1) || \ + ((CHANNEL) == ADC_CH_2) || ((CHANNEL) == ADC_CH_3) || \ + ((CHANNEL) == ADC_CH_4) || ((CHANNEL) == ADC_CH_5) || \ + ((CHANNEL) == ADC_CH_6) || ((CHANNEL) == ADC_CH_7) || \ + ((CHANNEL) == ADC_CH_8) || ((CHANNEL) == ADC_CH_9) || \ + ((CHANNEL) == ADC_CH_10) || ((CHANNEL) == ADC_CH_11) || \ + ((CHANNEL) == ADC_CH_PGA0O) || ((CHANNEL) == ADC_CH_PGA1O) || \ + ((CHANNEL) == ADC_CH_PGA2O) || ((CHANNEL) == ADC_CH_PGA3O)) #else #define ADC_CH_0 (0) #define ADC_CH_1 (1) @@ -170,8 +210,14 @@ #define ADC_TRIG_CMP0 ((1UL << 4) | (0UL << 20)) #define ADC_TRIG_CMP1 ((1UL << 4) | (1UL << 20)) +#if (LIBCFG_CMP2) #define ADC_TRIG_CMP2 ((1UL << 4) | (2UL << 20)) +#define IS_ADC_TRIG_CMP2(REGTRIG) ((REGTRIG == ADC_TRIG_CMP2)) +#else +#define IS_ADC_TRIG_CMP2(REGTRIG) (0) +#endif + #define ADC_TRIG_BFTM0 ((1UL << 3) | (0UL << 22) | (0UL << 19)) #define ADC_TRIG_BFTM1 ((1UL << 3) | (0UL << 22) | (1UL << 19)) @@ -225,7 +271,7 @@ ((REGTRIG) == ADC_TRIG_BFTM1) || \ ((REGTRIG) == ADC_TRIG_CMP0) || \ ((REGTRIG) == ADC_TRIG_CMP1) || \ - ((REGTRIG) == ADC_TRIG_CMP2) || \ + (IS_ADC_TRIG_CMP2(REGTRIG)) || \ ((REGTRIG) == ADC_TRIG_EXTI_0) || \ ((REGTRIG) == ADC_TRIG_EXTI_1) || \ ((REGTRIG) == ADC_TRIG_EXTI_2) || \ @@ -256,7 +302,7 @@ #define ADC_INT_DATA_OVERWRITE (0x01000000) #define ADC_INT_HP_DATA_OVERWRITE (0x02000000) -#define IS_ADC_INT(INT) ((((INT) & 0xFCFCFF88) == 0) && ((INT) != 0)) +#define IS_ADC_INT(INT) ((((INT) & 0xFCFCF8F8) == 0) && ((INT) != 0)) #define ADC_FLAG_SINGLE_EOC (0x00000001) @@ -270,7 +316,7 @@ #define ADC_FLAG_DATA_OVERWRITE (0x01000000) #define ADC_FLAG_HP_DATA_OVERWRITE (0x02000000) -#define IS_ADC_FLAG(FLAG) ((((FLAG) & 0xFCFCFF88) == 0) && ((FLAG) != 0)) +#define IS_ADC_FLAG(FLAG) ((((FLAG) & 0xFCFCF8F8) == 0) && ((FLAG) != 0)) #define ADC_REGULAR_DATA0 (0) @@ -289,8 +335,22 @@ #define ADC_HP_DATA1 (1) #define ADC_HP_DATA2 (2) #define ADC_HP_DATA3 (3) +#if (LIBCFG_ADC_HDR_4_11) +#define ADC_HP_DATA4 (4) +#define ADC_HP_DATA5 (5) +#define ADC_HP_DATA6 (6) +#define ADC_HP_DATA7 (7) +#define ADC_HP_DATA8 (8) +#define ADC_HP_DATA9 (9) +#define ADC_HP_DATA10 (10) +#define ADC_HP_DATA11 (11) +#endif +#if (LIBCFG_ADC_HDR_4_11) +#define IS_ADC_HP_DATA(DATA) ((DATA) < 12) +#else #define IS_ADC_HP_DATA(DATA) ((DATA) < 4) +#endif #define ADC_AWD_DISABLE (u8)0x00 @@ -329,20 +389,34 @@ #define IS_ADC_INPUT_SAMPLING_TIME(TIME) ((TIME) <= 255) +#if (!LIBCFG_ADC_NO_OFFSET_REG) #define IS_ADC_OFFSET(OFFSET) ((OFFSET) < 4096) +#endif #define IS_ADC_REGULAR_RANK(RANK) ((RANK) < 8) +#if (LIBCFG_ADC_HDR_4_11) +#define IS_ADC_HP_RANK(RANK) ((RANK) < 12) +#else #define IS_ADC_HP_RANK(RANK) ((RANK) < 4) +#endif #define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 1) && ((LENGTH) <= 8)) #define IS_ADC_REGULAR_SUB_LENGTH(SUB_LENGTH) (((SUB_LENGTH) >= 1) && ((SUB_LENGTH) <= 8)) +#if (LIBCFG_ADC_HCONV_LENGTH_V2) +#define IS_ADC_HP_LENGTH(LENGTH) (((LENGTH) >= 1) && ((LENGTH) <= 8)) +#define IS_ADC_HP_SUB_LENGTH(SUB_LENGTH) (((SUB_LENGTH) >= 1) && ((SUB_LENGTH) <= 8)) +#else #define IS_ADC_HP_LENGTH(LENGTH) (((LENGTH) >= 1) && ((LENGTH) <= 4)) #define IS_ADC_HP_SUB_LENGTH(SUB_LENGTH) (((SUB_LENGTH) >= 1) && ((SUB_LENGTH) <= 4)) +#endif +#if (LIBCFG_ADC_TRIG_DELAY) #define IS_ADC_TRIG_DELAY(DELAY) ((DELAY) < 256) +#endif +#if (!LIBCFG_ADC_NO_OFFSET_REG) typedef enum { ADC_ALIGN_RIGHT = (0 << 14), @@ -350,6 +424,7 @@ typedef enum } ADC_ALIGN_Enum; #define IS_ADC_ALIGN(ALIGN) (((ALIGN) == ADC_ALIGN_RIGHT) || ((ALIGN) == ADC_ALIGN_LEFT)) +#endif /** * @} */ @@ -373,9 +448,11 @@ void ADC_HPChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 Sampl void ADC_HPGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 SubLength); void ADC_HPTrigConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_TRIG_x); +#if (!LIBCFG_ADC_NO_OFFSET_REG) void ADC_ChannelDataAlign(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, ADC_ALIGN_Enum ADC_ALIGN_x); void ADC_ChannelOffsetValue(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u16 OffsetValue); void ADC_ChannelOffsetCmd(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, ControlStatus NewState); +#endif #if (LIBCFG_ADC_TRIG_DELAY) void ADC_TrigDelayConfig(HT_ADC_TypeDef* HT_ADCn, u8 HDelayTime, u8 DelayTime); @@ -397,6 +474,14 @@ void ADC_AWDSingleChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n); void ADC_AWDThresholdsConfig(HT_ADC_TypeDef* HT_ADCn, u16 UPPER, u16 LOWER); void ADC_PDMAConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_PDMA_x, ControlStatus NewState); + +#if (LIBCFG_ADC_IVREF) +void ADC_VREFCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState); +#endif + +#if (LIBCFG_ADC_MVDDA) +void ADC_MVDDACmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState); +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_opa.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_opa.h index f8cfc6cca8..495ca58923 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_opa.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_opa.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_opa.h - * @version $Rev:: 6911 $ - * @date $Date:: 2023-05-10 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the OPA library. ************************************************************************************************************* * @attention @@ -57,11 +57,6 @@ typedef struct { u32 OPA_ScalerEnable; u32 OPA_ExternalPinEnable; - #if (LIBCFG_OPA_PGA) - u32 OPA_PGAEnable; - u32 OPA_UnitGainEnable; - u32 OPA_PGAGain; - #endif } OPA_InitTypeDef; /** * @brief Enumeration of OPA PGA Gain. @@ -115,14 +110,6 @@ typedef enum #define OPA_ExternalPin_ENABLE ((u32)0x00000008) #define OPA_ExternalPin_DISABLE ((u32)0x00000000) -/* Definitions of OPA PGA Enable Bit */ -#define OPA_PGA_ENABLE ((u32)0x00000004) -#define OPA_PGA_DISABLE ((u32)0x00000000) - -/* Definitions of OPA UnitGain Enable Bit */ -#define OPA_UNITGAIN_ENABLE ((u32)0x00000002) -#define OPA_UNITGAIN_DISABLE ((u32)0x00000000) - /* Definitions of OPA Output Status */ #define OPA_OUTPUT_HIGH ((u32)0x00000080) #define OPA_OUTPUT_LOW ((u32)0x00000000) @@ -140,19 +127,6 @@ typedef enum #define IS_OPA_ExtPinEnable(x) ((x == OPA_ExternalPin_ENABLE) || (x == OPA_ExternalPin_DISABLE)) -#define IS_OPA_PGAEnable(x) ((x == OPA_PGA_ENABLE) || (x == OPA_PGA_DISABLE)) - -#define IS_OPA_UnitGainEnable(x) ((x == OPA_UNITGAIN_ENABLE) || (x == OPA_UNITGAIN_DISABLE)) - -#define IS_OPA_PGA_SEL(SEL) ((SEL == PGA_GAIN_5) || (SEL == PGA_GAIN_6) || \ - (SEL == PGA_GAIN_7) || (SEL == PGA_GAIN_8) || \ - (SEL == PGA_GAIN_11) || (SEL == PGA_GAIN_12) || \ - (SEL == PGA_GAIN_15) || (SEL == PGA_GAIN_16) || \ - (SEL == PGA_GAIN_23) || (SEL == PGA_GAIN_24) || \ - (SEL == PGA_GAIN_31) || (SEL == PGA_GAIN_32) || \ - (SEL == PGA_GAIN_47) || (SEL == PGA_GAIN_48) || \ - (SEL == PGA_GAIN_63) || (SEL == PGA_GAIN_64)) - #define IS_OPA_OFMMODE(MODE) ((MODE == OPA_OFFSET_CALIBRATION_MODE) || \ (MODE == OPA_NORMAL_MODE)) @@ -183,11 +157,6 @@ void OPA_UnprotectConfig(HT_OPA_TypeDef* HT_OPAn); void OPA_Init(HT_OPA_TypeDef* HT_OPAn, OPA_InitTypeDef* OPA_InitStruct); void OPA_StructInit(OPA_InitTypeDef* OPA_InitStruct); void OPA_ExternalInputCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState); -#if (LIBCFG_OPA_PGA) -void OPA_UnitGainCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState); -void OPA_PGACmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState); -void OPA_PGAGain(HT_OPA_TypeDef* HT_OPAn, u8 bGAIN_SEL); -#endif void OPA_ScalerCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState); void OPA_SetScalerValue(HT_OPA_TypeDef* HT_OPAn, u32 Scaler_Value); FlagStatus OPA_GetOutputStatus(HT_OPA_TypeDef* HT_OPAn); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_pga.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_pga.h index c72336c2fa..740ae8da56 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_pga.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_pga.h @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_pga.h - * @version $Rev:: 6915 $ - * @date $Date:: 2023-05-10 #$ - * @brief The header file of the PGA library (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief The header file of the PGA library. ************************************************************************************************************* * @attention * @@ -44,8 +44,109 @@ * @{ */ +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Exported_Types PGA exported types + * @{ + */ +#define PGA_GAIN_LEVEL_0 (0x0) +#define PGA_GAIN_LEVEL_1 (0x1) +#define PGA_GAIN_LEVEL_2 (0x2) +#define PGA_GAIN_LEVEL_3 (0x3) +#define PGA_GAIN_LEVEL_4 (0x4) +#define PGA_GAIN_LEVEL_5 (0x5) +/** + * @brief Enumeration of PGA Gain Type 1. + */ +typedef enum +{ + /* PGAnPGA = 1, PGAnHVDDAEN[1:0] = b0x, PGAnNUG = 0 */ + PGA_GAIN_6 = PGA_GAIN_LEVEL_0, + PGA_GAIN_8 = PGA_GAIN_LEVEL_1, + PGA_GAIN_12 = PGA_GAIN_LEVEL_2, + PGA_GAIN_16 = PGA_GAIN_LEVEL_3, + PGA_GAIN_24 = PGA_GAIN_LEVEL_4, + PGA_GAIN_32 = PGA_GAIN_LEVEL_5, +} PGA_GAIN_TYPE1_Enum; +/** + * @brief Enumeration of PGA Gain Type 2. + */ +typedef enum +{ + /* PGAnPGA = 1, PGAnHVDDAEN[1:0] = b10, PGAnNUG = 0 */ + PGA_GAIN_5 = PGA_GAIN_LEVEL_0, + PGA_GAIN_7 = PGA_GAIN_LEVEL_1, + PGA_GAIN_11 = PGA_GAIN_LEVEL_2, + PGA_GAIN_15 = PGA_GAIN_LEVEL_3, + PGA_GAIN_23 = PGA_GAIN_LEVEL_4, + PGA_GAIN_31 = PGA_GAIN_LEVEL_5, +} PGA_GAIN_TYPE2_Enum; +/** + * @brief Enumeration of Calibration Reference Input. + */ +typedef enum +{ + PGA_CALIBRATION_INPUT_NEGATIVE = 0, + PGA_CALIBRATION_INPUT_POSITIVE = 1, +} PGA_CALIBRATION_INPUT_Enum; +/** + * @brief Definition of PGA init structure. + */ +typedef struct +{ + u8 PGA_REF; + u8 PGA_NUG; + u8 PGA_NE; + u8 PGA_PGA; + u8 PGA_HVDDA; +} PGA_InitTypeDef; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Exported_Constants PGA exported constants + * @{ + */ +#define PGA_UNPROTECT_KEY (0x9C3A) + +#define PGA_HVDDA_DISABLE (0x0) +#define PGA_HVDDA_RESISTOR (0x2) +#define PGA_HVDDA_POS_INPUT (0x3) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Exported_Functions PGA exported functions + * @{ + */ +void PGA_DeInit(void); +void PGA_Cmd(HT_PGA0_X_TypeDef* HT_PGAn, ControlStatus NewState); +void PGA_SetUnProtectKey(u32 uUnProtectKey); +void PGA_ProtectConfig(HT_PGA0_X_TypeDef* HT_PGAn); +void PGA_UnprotectConfig(HT_PGA0_X_TypeDef* HT_PGAn); +void PGA_Init(HT_PGA0_X_TypeDef* HT_PGAn, PGA_InitTypeDef* PGA_InitStruct); +void PGA_StructInit(PGA_InitTypeDef* PGA_InitStruct); +void PGA_GainConfig(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x); +void PGA_HVDDACmd(ControlStatus NewState); +void PGA_CalibrationCmd(HT_PGA0_X_TypeDef* HT_PGAn, ControlStatus NewState); +void PGA_SetCalibrationInput(HT_PGA0_X_TypeDef* HT_PGAn, PGA_CALIBRATION_INPUT_Enum PGA_INPUT_x); +void PGA_SetCalibrationValue(HT_PGA0_X_TypeDef* HT_PGAn, u32 Value); +FlagStatus PGA_ReadOutputBit(HT_PGA0_X_TypeDef* HT_PGAn); +void PGA_SetModeInverting(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x); +void PGA_SetModeDifferentiator(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x); +void PGA_SetModeNonInverting(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x); +void PGA_SetModeInvertingAdder(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x); +void PGA_SetModeExponent(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x); +void PGA_SetModeManual(HT_PGA0_X_TypeDef* HT_PGAn); +void PGA_SetModeNonInvertingAdder(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x); +void PGA_SetModeComparator(HT_PGA0_X_TypeDef* HT_PGAn); + +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h index 953106da19..8a64ca1567 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f66242_libcfg.h - * @version $Rev:: 7184 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -44,9 +44,65 @@ #define LIBCFG_CHIPNAME (0x66242) #endif +#define LIBCFG_ADC_SAMPLE_TIME_BY_CH (1) #define LIBCFG_ADC_NO_OFFSET_REG (1) +#define LIBCFG_ADC_CH_66XXX_V1 (1) +#define LIBCFG_ADC_TRIG_SRC_V2 (1) +#define LIBCFG_ADC_TRIG_DELAY (1) +#define LIBCFG_ADC_HCONV_LENGTH_V2 (1) +#define LIBCFG_ADC_HDR_4_11 (1) +#define LIBCFG_ADC_STR_16_17 (1) +#define LIBCFG_ADC_HLST_0_2 (1) +#define LIBCFG_ADC_IVREF (1) +#define LIBCFG_ADC_MVDDA (1) +#define LIBCFG_AFIO_SCTM_MODE9 (1) +#define LIBCFG_BFTM1 (1) +#define LIBCFG_CKCU_ATM_V01 (1) +#define LIBCFG_CKCU_NO_ADCPRE_DIV1 (1) +#define LIBCFG_CKCU_NO_LPCR (1) +#define LIBCFG_CKCU_PLLSRCDIV (1) +#define LIBCFG_CKCU_REFCLK_EXT_PIN (1) +#define LIBCFG_CKCU_SYS_CK_60M (1) +#define LIBCFG_CKCU_SYS_CK_80M (1) +#define LIBCFG_CMP (1) +#define LIBCFG_CMP_65x_66x_VER (1) +#define LIBCFG_CMP_CO (1) +#define LIBCFG_CMP_NOSCALER_SRC (1) +#define LIBCFG_CMP_POS_INPUT_SEL_V3 (1) +#define LIBCFG_CMP_SCALER_8BIT (1) +#define LIBCFG_CRC (1) +#define LIBCFG_CORDIC (1) +#define LIBCFG_DIV (1) +#define LIBCFG_FMC_PREFETCH (1) +#define LIBCFG_FMC_BRANCHCACHE (1) +#define LIBCFG_FMC_WAIT_STATE_2 (1) +#define LIBCFG_FMC_WAIT_STATE_3 (1) +#define LIBCFG_MCTM0 (1) +#define LIBCFG_MCTM_UEV1DIS (1) #define LIBCFG_GPIOC (1) -#define LIBCFG_NO_PWRCU_TEST_REG (1) +#define LIBCFG_GPTM_GIRQ (1) #define LIBCFG_PDMA (1) +#define LIBCFG_PGA (1) +#define LIBCFG_PGA1 (1) +#define LIBCFG_PGA2 (1) +#define LIBCFG_PGA3 (1) +#define LIBCFG_PID (1) +#define LIBCFG_PWRCU_VDD_5V (1) +#define LIBCFG_PWRCU_NO_PORF (1) +#define LIBCFG_PWRCU_NO_PD_MODE (1) +#define LIBCFG_PWRCU_NO_PDF (1) +#define LIBCFG_PWRCU_NO_DS2_MODE (1) +#define LIBCFG_PWRCU_NO_VDDPORF (1) +#define LIBCFG_NO_PWRCU_TEST_REG (1) +#define LIBCFG_SCTM0 (1) +#define LIBCFG_SCTM1 (1) +#define LIBCFG_SCTM2 (1) +#define LIBCFG_SCTM3 (1) +#define LIBCFG_TM_65X_66X_V1 (1) +#define LIBCFG_TM_BK_FROM_CMP (1) +#define LIBCFG_TM_RECCDI (1) +#define LIBCFG_TM_TIFN_5BIT (1) +#define LIBCFG_USART_LIN (1) +#define LIBCFG_USART_SINGLE_WIRE (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h index 90a37a1703..ef490dac1c 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f66246_libcfg.h - * @version $Rev:: 7184 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -44,9 +44,66 @@ #define LIBCFG_CHIPNAME (0x66246) #endif +#define LIBCFG_ADC_SAMPLE_TIME_BY_CH (1) #define LIBCFG_ADC_NO_OFFSET_REG (1) +#define LIBCFG_ADC_CH_66XXX_V1 (1) +#define LIBCFG_ADC_TRIG_SRC_V2 (1) +#define LIBCFG_ADC_TRIG_DELAY (1) +#define LIBCFG_ADC_HCONV_LENGTH_V2 (1) +#define LIBCFG_ADC_HDR_4_11 (1) +#define LIBCFG_ADC_STR_16_17 (1) +#define LIBCFG_ADC_HLST_0_2 (1) +#define LIBCFG_ADC_IVREF (1) +#define LIBCFG_ADC_MVDDA (1) +#define LIBCFG_AFIO_SCTM_MODE9 (1) +#define LIBCFG_BFTM1 (1) +#define LIBCFG_CAN0 (1) +#define LIBCFG_CKCU_ATM_V01 (1) +#define LIBCFG_CKCU_NO_ADCPRE_DIV1 (1) +#define LIBCFG_CKCU_NO_LPCR (1) +#define LIBCFG_CKCU_PLLSRCDIV (1) +#define LIBCFG_CKCU_REFCLK_EXT_PIN (1) +#define LIBCFG_CKCU_SYS_CK_60M (1) +#define LIBCFG_CKCU_SYS_CK_80M (1) +#define LIBCFG_CMP (1) +#define LIBCFG_CMP_65x_66x_VER (1) +#define LIBCFG_CMP_CO (1) +#define LIBCFG_CMP_NOSCALER_SRC (1) +#define LIBCFG_CMP_POS_INPUT_SEL_V3 (1) +#define LIBCFG_CMP_SCALER_8BIT (1) +#define LIBCFG_CRC (1) +#define LIBCFG_CORDIC (1) +#define LIBCFG_DIV (1) +#define LIBCFG_FMC_PREFETCH (1) +#define LIBCFG_FMC_BRANCHCACHE (1) +#define LIBCFG_FMC_WAIT_STATE_2 (1) +#define LIBCFG_FMC_WAIT_STATE_3 (1) +#define LIBCFG_MCTM0 (1) +#define LIBCFG_MCTM_UEV1DIS (1) #define LIBCFG_GPIOC (1) -#define LIBCFG_NO_PWRCU_TEST_REG (1) +#define LIBCFG_GPTM_GIRQ (1) #define LIBCFG_PDMA (1) +#define LIBCFG_PGA (1) +#define LIBCFG_PGA1 (1) +#define LIBCFG_PGA2 (1) +#define LIBCFG_PGA3 (1) +#define LIBCFG_PID (1) +#define LIBCFG_PWRCU_VDD_5V (1) +#define LIBCFG_PWRCU_NO_PORF (1) +#define LIBCFG_PWRCU_NO_PD_MODE (1) +#define LIBCFG_PWRCU_NO_PDF (1) +#define LIBCFG_PWRCU_NO_DS2_MODE (1) +#define LIBCFG_PWRCU_NO_VDDPORF (1) +#define LIBCFG_NO_PWRCU_TEST_REG (1) +#define LIBCFG_SCTM0 (1) +#define LIBCFG_SCTM1 (1) +#define LIBCFG_SCTM2 (1) +#define LIBCFG_SCTM3 (1) +#define LIBCFG_TM_65X_66X_V1 (1) +#define LIBCFG_TM_BK_FROM_CMP (1) +#define LIBCFG_TM_RECCDI (1) +#define LIBCFG_TM_TIFN_5BIT (1) +#define LIBCFG_USART_LIN (1) +#define LIBCFG_USART_SINGLE_WIRE (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h index 1c25b4c036..24e7abaf07 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f66xxx_cordic.h - * @version $Rev:: 6915 $ - * @date $Date:: 2023-05-10 #$ - * @brief The header file of the CORDIC library (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief The header file of the CORDIC library. ************************************************************************************************************* * @attention * @@ -44,7 +44,243 @@ * @{ */ +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Exported_Types CORDIC exported types + * @{ + */ +typedef struct +{ + u32 Function; + u32 Scale; + u32 InSize; + u32 OutSize; + u32 NbWrite; + u32 NbRead; + u32 Precision; +} CORDIC_InitTypeDef; +/** + * @} + */ +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Exported_Constants CORDIC exported constants + * @{ + */ +/************************ Bit definition for CORDIC_CSR register **********************/ +#define CORDIC_CSR_FUNC_POS (0U) +#define CORDIC_CSR_FUNC_MASK (0xFUL << CORDIC_CSR_FUNC_POS) /*!< 0x0000000F */ +#define CORDIC_CSR_FUNC CORDIC_CSR_FUNC_MASK /*!< Function */ +#define CORDIC_CSR_FUNC_0 (0x1UL << CORDIC_CSR_FUNC_POS) /*!< 0x00000001 */ +#define CORDIC_CSR_FUNC_1 (0x2UL << CORDIC_CSR_FUNC_POS) /*!< 0x00000002 */ +#define CORDIC_CSR_FUNC_2 (0x4UL << CORDIC_CSR_FUNC_POS) /*!< 0x00000004 */ +#define CORDIC_CSR_FUNC_3 (0x8UL << CORDIC_CSR_FUNC_POS) /*!< 0x00000008 */ +#define CORDIC_CSR_PRECISION_POS (4U) +#define CORDIC_CSR_PRECISION_MASK (0xFUL << CORDIC_CSR_PRECISION_POS) /*!< 0x000000F0 */ +#define CORDIC_CSR_PRECISION CORDIC_CSR_PRECISION_MASK /*!< Precision */ +#define CORDIC_CSR_PRECISION_0 (0x1UL << CORDIC_CSR_PRECISION_POS) /*!< 0x00000010 */ +#define CORDIC_CSR_PRECISION_1 (0x2UL << CORDIC_CSR_PRECISION_POS) /*!< 0x00000020 */ +#define CORDIC_CSR_PRECISION_2 (0x4UL << CORDIC_CSR_PRECISION_POS) /*!< 0x00000040 */ +#define CORDIC_CSR_PRECISION_3 (0x8UL << CORDIC_CSR_PRECISION_POS) /*!< 0x00000080 */ +#define CORDIC_CSR_SCALE_POS (8U) +#define CORDIC_CSR_SCALE_MASK (0x7UL << CORDIC_CSR_SCALE_POS) /*!< 0x00000700 */ +#define CORDIC_CSR_SCALE CORDIC_CSR_SCALE_MASK /*!< Scaling factor */ +#define CORDIC_CSR_SCALE_0 (0x1UL << CORDIC_CSR_SCALE_POS) /*!< 0x00000100 */ +#define CORDIC_CSR_SCALE_1 (0x2UL << CORDIC_CSR_SCALE_POS) /*!< 0x00000200 */ +#define CORDIC_CSR_SCALE_2 (0x4UL << CORDIC_CSR_SCALE_POS) /*!< 0x00000400 */ +#define CORDIC_CSR_IEN_POS (16U) +#define CORDIC_CSR_IEN_MASK (0x1UL << CORDIC_CSR_IEN_POS) /*!< 0x00010000 */ +#define CORDIC_CSR_IEN CORDIC_CSR_IEN_MASK /*!< Interrupt Enable */ +#define CORDIC_CSR_DMAREN_POS (17U) +#define CORDIC_CSR_DMAREN_MASK (0x1UL << CORDIC_CSR_DMAREN_POS) /*!< 0x00020000 */ +#define CORDIC_CSR_DMAREN CORDIC_CSR_DMAREN_MASK /*!< DMA Read channel Enable */ +#define CORDIC_CSR_DMAWEN_POS (18U) +#define CORDIC_CSR_DMAWEN_MASK (0x1UL << CORDIC_CSR_DMAWEN_POS) /*!< 0x00040000 */ +#define CORDIC_CSR_DMAWEN CORDIC_CSR_DMAWEN_MASK /*!< DMA Write channel Enable */ +#define CORDIC_CSR_NRES_POS (19U) +#define CORDIC_CSR_NRES_MASK (0x1UL << CORDIC_CSR_NRES_POS) /*!< 0x00080000 */ +#define CORDIC_CSR_NRES CORDIC_CSR_NRES_MASK /*!< Number of results in WDATA register */ +#define CORDIC_CSR_NARGS_POS (20U) +#define CORDIC_CSR_NARGS_MASK (0x3UL << CORDIC_CSR_NARGS_POS) /*!< 0x00300000 */ +#define CORDIC_CSR_NARGS CORDIC_CSR_NARGS_MASK /*!< Number of arguments in RDATA register */ +#define CORDIC_CSR_NARGS_0 (0x1UL << CORDIC_CSR_NARGS_POS) /*!< 0x00100000 */ +#define CORDIC_CSR_NARGS_1 (0x2UL << CORDIC_CSR_NARGS_POS) /*!< 0x00200000 */ +#define CORDIC_CSR_RESSIZE_POS (22U) +#define CORDIC_CSR_RESSIZE_MASK (0x1UL << CORDIC_CSR_RESSIZE_POS) /*!< 0x00400000 */ +#define CORDIC_CSR_RESSIZE CORDIC_CSR_RESSIZE_MASK /*!< Width of output data */ +#define CORDIC_CSR_ARGSIZE_POS (23U) +#define CORDIC_CSR_ARGSIZE_MASK (0x1UL << CORDIC_CSR_ARGSIZE_POS) /*!< 0x00800000 */ +#define CORDIC_CSR_ARGSIZE CORDIC_CSR_ARGSIZE_MASK /*!< Width of input data */ +#define CORDIC_CSR_RRDY_POS (31U) +#define CORDIC_CSR_RRDY_MASK (0x1UL << CORDIC_CSR_RRDY_POS) /*!< 0x80000000 */ +#define CORDIC_CSR_RRDY CORDIC_CSR_RRDY_MASK /*!< Result Ready Flag */ + +/************************ Bit definition for CORDIC_WDATA register ********************/ +#define CORDIC_WDATA_ARG_POS (0U) +#define CORDIC_WDATA_ARG_MASK (0xFFFFFFFFUL << CORDIC_WDATA_ARG_POS) /*!< 0xFFFFFFFF */ +#define CORDIC_WDATA_ARG CORDIC_WDATA_ARG_MASK /*!< Input Argument */ + +/************************ Bit definition for CORDIC_RDATA register ********************/ +#define CORDIC_RDATA_RES_POS (0U) +#define CORDIC_RDATA_RES_MASK (0xFFFFFFFFUL << CORDIC_RDATA_RES_POS) /*!< 0xFFFFFFFF */ +#define CORDIC_RDATA_RES CORDIC_RDATA_RES_MASK /*!< Output Result */ + +/** @defgroup CORDIC_Function CORDIC Function + * @{ + */ +#define CORDIC_FUNCTION_COSINE (0x00000000U) /*!< Cosine */ +#define CORDIC_FUNCTION_SINE ((u32)(CORDIC_CSR_FUNC_0)) /*!< Sine */ +#define CORDIC_FUNCTION_PHASE ((u32)(CORDIC_CSR_FUNC_1)) /*!< Phase */ +#define CORDIC_FUNCTION_MODULUS ((u32)(CORDIC_CSR_FUNC_1 | CORDIC_CSR_FUNC_0)) /*!< Modulus */ +#define CORDIC_FUNCTION_ARCTANGENT ((u32)(CORDIC_CSR_FUNC_2)) /*!< Arctangent */ +#define CORDIC_FUNCTION_HCOSINE ((u32)(CORDIC_CSR_FUNC_2 | CORDIC_CSR_FUNC_0)) /*!< Hyperbolic Cosine */ +#define CORDIC_FUNCTION_HSINE ((u32)(CORDIC_CSR_FUNC_2 | CORDIC_CSR_FUNC_1)) /*!< Hyperbolic Sine */ +#define CORDIC_FUNCTION_HARCTANGENT ((u32)(CORDIC_CSR_FUNC_2 | CORDIC_CSR_FUNC_1 | CORDIC_CSR_FUNC_0))/*!< Hyperbolic Arctangent */ +#define CORDIC_FUNCTION_NATURALLOG ((u32)(CORDIC_CSR_FUNC_3)) /*!< Natural Logarithm */ +#define CORDIC_FUNCTION_SQUAREROOT ((u32)(CORDIC_CSR_FUNC_3 | CORDIC_CSR_FUNC_0)) /*!< Square Root */ +#define CORDIC_FUNCTION_ROTATIONMATRIX ((u32)(CORDIC_CSR_FUNC_3 | CORDIC_CSR_FUNC_1)) /*!< Rotation Matrix */ +#define CORDIC_FUNCTION_INTEGERMODULUS ((u32)(CORDIC_CSR_FUNC_3 | CORDIC_CSR_FUNC_1 | CORDIC_CSR_FUNC_0))/*!< Integer Modulus */ +#define CORDIC_FUNCTION_INTEGERSQUAREROOT ((u32)(CORDIC_CSR_FUNC_3 | CORDIC_CSR_FUNC_2)) /*!< Integer Square Root */ +/** + * @} + */ + +/** @defgroup CORDIC_Precision_In_Cycles_Number CORDIC Precision in Cycles Number + * @{ + */ +/* Note: 1 cycle corresponds to 4 algorithm iterations */ +#define CORDIC_PRECISION_1CYCLE ((u32)(CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_2CYCLES ((u32)(CORDIC_CSR_PRECISION_1)) +#define CORDIC_PRECISION_3CYCLES ((u32)(CORDIC_CSR_PRECISION_1 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_4CYCLES ((u32)(CORDIC_CSR_PRECISION_2)) +#define CORDIC_PRECISION_5CYCLES ((u32)(CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_6CYCLES ((u32)(CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_1)) +#define CORDIC_PRECISION_7CYCLES ((u32)(CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_1 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_8CYCLES ((u32)(CORDIC_CSR_PRECISION_3)) +#define CORDIC_PRECISION_9CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_10CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_1)) +#define CORDIC_PRECISION_11CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_1 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_12CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_2)) +#define CORDIC_PRECISION_13CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_14CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_1)) +#define CORDIC_PRECISION_15CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_1 |CORDIC_CSR_PRECISION_0)) +/** + * @} + */ + +/** @defgroup CORDIC_Scale CORDIC Scaling factor + * @{ + */ +/* Scale factor value 'n' implies that the input data have been multiplied + by a factor 2exp(-n), and/or the output data need to be multiplied by 2exp(n). */ +#define CORDIC_SCALE_0 (0x00000000U) +#define CORDIC_SCALE_1 ((u32)(CORDIC_CSR_SCALE_0)) +#define CORDIC_SCALE_2 ((u32)(CORDIC_CSR_SCALE_1)) +#define CORDIC_SCALE_3 ((u32)(CORDIC_CSR_SCALE_1 | CORDIC_CSR_SCALE_0)) +#define CORDIC_SCALE_4 ((u32)(CORDIC_CSR_SCALE_2)) +#define CORDIC_SCALE_5 ((u32)(CORDIC_CSR_SCALE_2 | CORDIC_CSR_SCALE_0)) +#define CORDIC_SCALE_6 ((u32)(CORDIC_CSR_SCALE_2 | CORDIC_CSR_SCALE_1)) +#define CORDIC_SCALE_7 ((u32)(CORDIC_CSR_SCALE_2 | CORDIC_CSR_SCALE_1 | CORDIC_CSR_SCALE_0)) +/** + * @} + */ + +/** @defgroup CORDIC_Interrupts_Enable CORDIC Interrupts Enable bit + * @{ + */ +#define CORDIC_IT_IEN CORDIC_CSR_IEN /*!< Result ready interrupt enable */ +/** + * @} + */ + +/** @defgroup CORDIC_DMAR DMA Read Request Enable bit + * @{ + */ +#define CORDIC_DMA_REN CORDIC_CSR_DMAREN /*!< DMA Read requests enable */ +/** + * @} + */ + +/** @defgroup CORDIC_DMAW DMA Write Request Enable bit + * @{ + */ +#define CORDIC_DMA_WEN CORDIC_CSR_DMAWEN /*!< DMA Write channel enable */ +/** + * @} + */ + +/** @defgroup CORDIC_Nb_Write CORDIC Number of 32-bit write required for one calculation + * @{ + */ +#define CORDIC_NBWRITE_1 (0x00000000U) /*!< One 32-bits write containing either only one + 32-bit data input (Q1.31 format), or two 16-bit + data input (Q1.15 format) packed in one 32 bits + Data */ +#define CORDIC_NBWRITE_2 ((u32)(CORDIC_CSR_NARGS_0)) /*!< Two 32-bit write containing two 32-bits data input + (Q1.31 format) */ +#define CORDIC_NBWRITE_3 ((u32)(CORDIC_CSR_NARGS_1)) /*!< Three 32-bit write containing three 32-bits data input + (Q1.31 format) */ +/** + * @} + */ + +/** @defgroup CORDIC_Nb_Read CORDIC Number of 32-bit read required after one calculation + * @{ + */ +#define CORDIC_NBREAD_1 (0x00000000U) /*!< One 32-bits read containing either only one + 32-bit data output (Q1.31 format), or two 16-bit + data output (Q1.15 format) packed in one 32 bits + Data */ +#define CORDIC_NBREAD_2 CORDIC_CSR_NRES /*!< Two 32-bit Data containing two 32-bits data output + (Q1.31 format) */ +/** + * @} + */ + +/** @defgroup CORDIC_In_Size CORDIC input data size + * @{ + */ +#define CORDIC_INSIZE_32BITS (0x00000000U) /*!< 32 bits input data size (Q1.31 format) */ +#define CORDIC_INSIZE_16BITS CORDIC_CSR_ARGSIZE /*!< 16 bits input data size (Q1.15 format) */ +/** + * @} + */ + +/** @defgroup CORDIC_Out_Size CORDIC Results Size + * @{ + */ +#define CORDIC_OUTSIZE_32BITS (0x00000000U) /*!< 32 bits output data size (Q1.31 format) */ +#define CORDIC_OUTSIZE_16BITS CORDIC_CSR_RESSIZE /*!< 16 bits output data size (Q1.15 format) */ +/** + * @} + */ + +/** @defgroup CORDIC_Flags CORDIC status flags + * @{ + */ +#define CORDIC_FLAG_RRDY CORDIC_CSR_RRDY /*!< Result Ready Flag */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Exported_Functions CORDIC exported functions + * @{ + */ +void CORDIC_DeInit(void); +void CORDIC_Init(CORDIC_InitTypeDef *CORDIC_InitStruct); +void CORDIC_IntCmd(ControlStatus NewState); +void CORDIC_PDMACmd(u32 CORDIC_DMA, ControlStatus NewState); +FlagStatus CORDIC_GetFlagStatus_RRDY(void); +void CORDIC_WriteData(u32 InData); +u32 CORDIC_ReadData(void); + +/** + * @} + */ /** diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h index c47671643c..56d3bbe830 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f66xxx_pid.h - * @version $Rev:: 6915 $ - * @date $Date:: 2023-05-10 #$ - * @brief The header file of the PID library (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief The header file of the PID library. ************************************************************************************************************* * @attention * @@ -44,8 +44,105 @@ * @{ */ +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup PID_Exported_Types PID exported types + * @{ + */ +/** + * @brief PID PID_Mode + */ +typedef enum +{ + PID_SPD_MODE = 0, + PID_IQ_MODE, + PID_ID_MODE, + PID_FWNK_MODE, + PID_PLL_MODE, + PID_USR_MODE, +} PID_Mode_Enum; +#define IS_PID_MODE(PID_MODE) (((PID_MODE) == PID_SPD_MODE) || \ + ((PID_MODE) == PID_IQ_MODE) || \ + ((PID_MODE) == PID_ID_MODE) || \ + ((PID_MODE) == PID_FWNK_MODE) || \ + ((PID_MODE) == PID_PLL_MODE) || \ + ((PID_MODE) == PID_USR_MODE)) + +/** + * @brief PID paramater init structure + */ +typedef struct +{ + s32 ERRn_1; + s32 UIn_1; + s32 KP; + s32 KI; + s32 KD; + s32 UI_MAX; + s32 UI_MIN; + s16 OUT_MAX; + s16 OUT_MIN; +} PID_InitTypeDef; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup PID_Exported_Constants PID exported constants + * @{ + */ +#define IS_PID(x) IS_PID0(x) +#define IS_PID0(x) (x == HT_PID0) + +/** + * @brief PID CR Bit Field Definitions + */ +#define PID_CR_MODSEL_Pos 24 +#define PID_CR_MODSEL_Msk (0xFul << PID_CR_MODSEL_Pos) + +#define PID_CR_UIF (0x00000008) +#define PID_CR_PIDEN (0x00000001) + +#define PID_FLAG_OVF (0x00020000) +#define PID_FLAG_CMP (0x00000200) + +#define IS_PID_FLAG(FLAG) ((FLAG == PID_FLAG_OVF) || \ + (FLAG == PID_FLAG_CMP)) + +#define PID_INT_OVF (0x00010000) +#define PID_INT_CMP (0x00000100) + +#define IS_PID_INT(INT) ((INT == PID_INT_OVF) || \ + (INT == PID_INT_CMP)) + +#define PID_INT_Status_Pos 2 +#define PID_INT_Clear_Pos 3 + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup PID_Exported_Functions PID exported functions + * @{ + */ +void PID_DeInit(HT_PID_TypeDef* HT_PIDn); +void PID_Init(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode, PID_InitTypeDef* PID_Para); +void PID_IntConfig(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x, ControlStatus NewState); +FlagStatus PID_GetIntStatus(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x); +void PID_ClearIntPendingBit(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x); +void PID_SetComPara_ERRn(HT_PID_TypeDef* HT_PIDn, s32 ERRn); +void PID_SetComPara_UI_Input(HT_PID_TypeDef* HT_PIDn, s32 UI_Input); +void PID_Compute(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode); +s16 PID_GetOutResult(HT_PID_TypeDef* HT_PIDn); +FlagStatus PID_GetFlagStatus(HT_PID_TypeDef* HT_PIDn, u32 PID_FLAG_x); +void PID_UI_InputCmd(HT_PID_TypeDef* HT_PIDn, ControlStatus NewState); +s32 PID_GetERRn_1(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode); +s32 PID_GetUIn_1(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode); +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c index 91fc97ab99..80a7b66eac 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_cm0plus_misc.c - * @version $Rev:: 5377 $ - * @date $Date:: 2021-05-26 #$ + * @version $Rev:: 7888 $ + * @date $Date:: 2024-07-22 #$ * @brief This file provides all the miscellaneous firmware functions. ************************************************************************************************************* * @attention @@ -221,7 +221,7 @@ u32 RBIT(u32 in) u32 uRBIT = 0; s32 i; - for(i = 31; i >=0; i--) + for (i = 31; i >=0; i--) { uRBIT |= ((in & 0x1) << i); in = in >> 1; @@ -229,6 +229,99 @@ u32 RBIT(u32 in) return uRBIT; } + +#if 0 +// Copy the code below to the begin of the main(). +// START + + #if (HTCFG_STACK_USAGE_ANALYSIS == 1) + /* !!! NOTICE !!! + Please update the Keil HT32 PACK and HT32 Firmware Library to the latest version to make sure the + Stack Usage Analysis function works properly. + */ + /* + Set HTCFG_STACK_USAGE_ANALYSIS as 1 in the "ht32xxxxxx_conf.h" to enable Stack Usage Analysis feature. + This feature is only applicable to the Keil MDK-ARM. Please call the "StackUsageAnalysisInit()" function + in the begin of the "main()". + The "StackUsageAnalysisInit()" parameter shall be the start address of the vector table. + Under Keil Debug mode, tick "View > Watch Window > HT32 Stack Usage Analysis" to show the stack usage + information. Those information is only valid after calling "StackUsageAnalysisInit()" function. + */ + StackUsageAnalysisInit(0x00000000); + #endif + +// END +#endif + +#if (HTCFG_STACK_USAGE_ANALYSIS == 1) +#if defined (__CC_ARM) +#define STACKLIMITADDR 0x20000010 +#define STACKSTART 0x20000014 +u32 _StackLimit __attribute__((at(STACKLIMITADDR)))= HT_SRAM_BASE + LIBCFG_RAM_SIZE; +u32 _StackStart __attribute__((at(STACKSTART)))= HT_SRAM_BASE; +/*********************************************************************************************************//** + * @brief Stack Usage Analysis Init + * @retval None + ***********************************************************************************************************/ +__ASM void StackUsageAnalysisInit(u32 addr) +{ + extern _StackLimit; + extern __HT_check_sp; + extern _StackStart; + LDR R0, [r0] + LDR R1, =_StackLimit + STR R0, [r1] + + LDR R0, =__HT_check_sp + LDR R1, =_StackStart + STR R0, [r1] + MOV R1, SP + LDR R2, =0xCDCDCDCD + LDR R3, =0xABABABAB + STR R3, [ R0 ] + B Loop_Check +Loop + STR R2, [ R0 ] +Loop_Check + ADDS R0, R0, #0x04 + CMP R0, R1 + BLT Loop + BX LR + ALIGN +} +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define STACKLIMITADDR "0x20000010" +#define STACKSTART "0x20000014" +u32 _StackLimit __attribute__((section(".ARM.__at_"STACKLIMITADDR))) = HT_SRAM_BASE + LIBCFG_RAM_SIZE; +u32 _StackStart __attribute__((section(".ARM.__at_"STACKSTART))) = HT_SRAM_BASE; +/*********************************************************************************************************//** + * @brief Stack Usage Analysis Init + * @retval None + ***********************************************************************************************************/ +__attribute__((noinline)) void StackUsageAnalysisInit(u32 addr) +{ + __ASM volatile (" LDR R0, [r0]"); + __ASM volatile (" LDR R1, =_StackLimit"); + __ASM volatile (" STR R0, [r1]"); + + __ASM volatile (" LDR R0, =__HT_check_sp"); + __ASM volatile (" LDR R1, =_StackStart"); + __ASM volatile (" STR R0, [r1]"); + __ASM volatile (" MOV R1, SP"); + __ASM volatile (" LDR R2, =0xCDCDCDCD"); + __ASM volatile (" LDR R3, =0xABABABAB"); + __ASM volatile (" STR R3, [ R0 ]"); + __ASM volatile (" B Loop_Check"); + __ASM volatile ("Loop:"); + __ASM volatile (" STR R2, [ R0 ]"); + __ASM volatile ("Loop_Check:"); + __ASM volatile (" ADDS R0, R0, #0x04"); + __ASM volatile (" CMP R0, R1"); + __ASM volatile (" BLT Loop"); + __ASM volatile (" BX LR"); +} +#endif +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c index d244507c11..af11e3bd48 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_adc.c - * @version $Rev:: 7366 $ - * @date $Date:: 2023-12-06 #$ + * @version $Rev:: 7691 $ + * @date $Date:: 2024-04-02 #$ * @brief This file provides all the ADC firmware functions. ************************************************************************************************************* * @attention @@ -90,6 +90,7 @@ void ADC_Reset(HT_ADC_TypeDef* HT_ADCn) Assert_Param(IS_ADC(HT_ADCn)); HT_ADCn->CR |= ADC_SOFTWARE_RESET; + while ((HT_ADCn->CR & ADC_SOFTWARE_RESET) != 0); } /*********************************************************************************************************//** @@ -107,6 +108,7 @@ void ADC_Cmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) if (NewState != DISABLE) { HT_ADCn->CR |= ADC_ENABLE_BIT; + ADC_Reset(HT_ADCn); } else { @@ -539,12 +541,13 @@ void ADC_VREFConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_VREF_x) #if (LIBCFG_ADC_VREFBUF) /*********************************************************************************************************//** - * @brief Enable or Disable the VREF output. When enable, the VREF provides a stable voltage output to the ADVREFP pin (ADC reference positive voltage). + * @brief Enable or Disable the VREF output. When enable, the VREF provides a stable voltage output to the + ADVREFP pin (ADC reference positive voltage). * @param HT_ADCn: where HT_ADCn is the selected ADC from the ADC peripherals. * @param NewState: This parameter can be ENABLE or DISABLE. * @retval None ************************************************************************************************************/ -void ADC_VREFOutputCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) +void ADC_VREFOutputADVREFPCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) { /* !!! NOTICE !!! The ADCREFP pin should not be connected to an external voltage when the VREF output is enabled. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c index 133889a258..cce69677ec 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_aes.c - * @version $Rev:: 7390 $ - * @date $Date:: 2023-12-12 #$ - * @brief This file provides all the ADC firmware functions. + * @version $Rev:: 8205 $ + * @date $Date:: 2024-10-15 #$ + * @brief This file provides all the AES firmware functions. ************************************************************************************************************* * @attention * @@ -355,12 +355,12 @@ void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, u32 *Key, u32 keySize) } HT_AESn->CR = uCRTemp; - for (i = 0; i < keySize; i += 4) + for (i = 0; i < (keySize / 4); i++) { #if (LIBCFG_AES_SWAP) - HT_AESn->KEYR[i >> 2] = __REV(*&Key[i]); + HT_AESn->KEYR[i] = __REV(*&Key[i]); #else - HT_AESn->KEYR[i >> 2] = *&Key[i]; + HT_AESn->KEYR[i] = *&Key[i]; #endif } @@ -378,12 +378,12 @@ void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, u32 *Vector) int i; Assert_Param(IS_AES(HT_AESn)); - for (i = 0; i < 16; i += 4) + for (i = 0; i < 4; i++) { #if (LIBCFG_AES_SWAP) - HT_AESn->IVR[i >> 2] = __REV(*&Vector[i]); + HT_AESn->IVR[i] = __REV(*&Vector[i]); #else - HT_AESn->IVR[i >> 2] = *&Vector[i]; + HT_AESn->IVR[i] = *&Vector[i]; #endif } } diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_can.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_can.c index 22fca5ab02..0287f0469a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_can.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_can.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_can.c - * @version $Rev:: 7187 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8284 $ + * @date $Date:: 2024-11-22 #$ * @brief This file provides all the CAN firmware functions. ************************************************************************************************************* * @attention @@ -37,6 +37,7 @@ * @{ */ + /* Private types -------------------------------------------------------------------------------------------*/ typedef enum { @@ -45,9 +46,18 @@ typedef enum IF_TOTAL_NUM } CANIF_NUMBER_Enum; - /* Private function prototypes -----------------------------------------------------------------------------*/ -static CANIF_NUMBER_Enum GetFreeIF(HT_CAN_TypeDef *CANx); +static HT_CANIF_TypeDef *_GetFreeIF(HT_CAN_TypeDef *CANx); +static void _CAN_EnterInitMode(HT_CAN_TypeDef *CANx); +static void _CAN_LeaveInitMode(HT_CAN_TypeDef *CANx); +static void _CAN_SetRxMsgObj(HT_CAN_TypeDef *CANx, u32 MsgNum, CAN_MSG_TypeDef* pCanMsg, u32 uSingleOrFifoLast); +static s32 _CAN_ReadMsgObj(HT_CAN_TypeDef *CANx, u32 MsgNum, u32 Release, CAN_MSG_TypeDef* pCanMsg, u8* data, u32* len); +static ErrStatus _CAN_SetTxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len); +static int _CAN_GetValidMsg(HT_CAN_TypeDef *CANx); +static bool _CAN_GetNewData(HT_CAN_TypeDef *CANx, u32 MsgNum); +static bool _CAN_CheckMsgIsValid(HT_CAN_TypeDef *CANx, u32 MsgNum); +static void _CAN_ClearMsgPendingFlag(HT_CAN_TypeDef *CANx, u32 MsgNum); +static volatile bool gIsBusOff = FALSE; /* Global functions ----------------------------------------------------------------------------------------*/ /** @defgroup CAN_Exported_Functions CAN exported functions @@ -73,943 +83,1049 @@ void CAN_DeInit(HT_CAN_TypeDef* CANx) } /*********************************************************************************************************//** - * @brief This function is used to set CAN to enter initialization mode and enable access bit timing - * register.After bit timing configuration ready, user must call CAN_LeaveInitMode() - * to leave initialization mode and lock bit timing register to let new configuration - * take effect. - * @param CANx: The pointer to CAN module base address. + * @brief Set CAN operation mode and target baud-rate. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure. * @retval None ***********************************************************************************************************/ -void CAN_EnterInitMode(HT_CAN_TypeDef *CANx) +void CAN_Init(HT_CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) { - CANx->CR |= CAN_CR_INIT_Msk; - CANx->CR |= CAN_CR_CCE_Msk; -} + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); -/*********************************************************************************************************//** - * @brief Leave initialization mode - * @param CANx: The pointer to CAN module base address. - * @retval None - ***********************************************************************************************************/ -void CAN_LeaveInitMode(HT_CAN_TypeDef *CANx) -{ - CANx->CR &= (~(CAN_CR_INIT_Msk | CAN_CR_CCE_Msk)); + _CAN_EnterInitMode(CANx); - while(CANx->CR & CAN_CR_INIT_Msk); /* Check INIT bit is released */ -} + CANx->BTR = (((u32)(CAN_InitStruct->CAN_TSEG1 - 1) << CAN_BTR_TSEG1_Pos) & CAN_BTR_TSEG1_Msk)| + (((u32)(CAN_InitStruct->CAN_TSEG0 -1) << CAN_BTR_TSEG0_Pos) & CAN_BTR_TSEG0_Msk)| + (((u32)(CAN_InitStruct->CAN_BRPrescaler -1) << CAN_BTR_BRP_Pos) & CAN_BTR_BRP_Msk) | + (((u32)(CAN_InitStruct->CAN_SJW -1) << CAN_BTR_SJW_Pos) & CAN_BTR_SJW_Msk); -/*********************************************************************************************************//** - * @brief This function is used to Wait message into message buffer in basic mode. Please notice the - * function is polling NEWDAT bit of MCR register by while loop and it is used in basic mode. - * @param CANx: The pointer to CAN module base address. - * @retval None - ***********************************************************************************************************/ -void CAN_WaitMsg(HT_CAN_TypeDef *CANx) -{ - CANx->SR = 0x0; /* clr status */ + CANx->BRPER = (CAN_InitStruct->CAN_BRPrescaler >> 6) & CAN_BRPE_BRPE_Msk; + _CAN_LeaveInitMode(CANx); - while(1) + if (CAN_InitStruct->CAN_NART) + HT_CAN0->CR |= CAN_CR_DAR; + + if (CAN_InitStruct->CAN_Mode) { - if(CANx->IF1.MCR & CAN_IF_MCR_NEWDAT_Msk) /* check new data */ - { - /*DEBUG_PRINTF("New Data IN\n");*/ - break; - } - if(CANx->SR & CAN_SR_RXOK_Msk) - { - /*DEBUG_PRINTF("Rx OK\n");*/ - } - if(CANx->SR & CAN_SR_LEC_Msk) - { - /*DEBUG_PRINTF("Error\n");*/ - } + CAN_EnterTestMode(CANx, CAN_InitStruct->CAN_Mode); + } + CAN_IntConfig(CANx, CAN_INT_EIE | CAN_INT_IE , ENABLE); + + return; +} + +/**********************************************************************************************************//** + * @brief Enable or Disable the specified CAN interrupt. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_Int: specify if the CAN interrupt source to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg CAN_INT_IE : Module interrupt enable. + * @arg CAN_INT_SIE : Status change interrupt enable. + * @arg CAN_INT_EIE : Error interrupt enable. + * @arg CAN_INT_ALL : All CAN interrupt + * @param NewState: this parameter can be ENABLE or DISABLE. + * @retval None + ***********************************************************************************************************/ +void CAN_IntConfig(HT_CAN_TypeDef *CANx, u32 CAN_Int, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + CAN_Int = CAN_Int & CAN_INT_ALL; + + _CAN_EnterInitMode(CANx); + if (NewState != DISABLE) + { + CANx->CR |= CAN_Int; + } + else + { + CANx->CR = CANx->CR & ~(CAN_Int); + } + _CAN_LeaveInitMode(CANx); +} + +/**********************************************************************************************************//** + * @brief Get the specified CAN INT status. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_Int: the CAN interrupt source. + * This parameter can be one of the following values: + * @arg CAN_INT_IE : Module interrupt enable. + * @arg CAN_INT_SIE : Status change interrupt enable. + * @arg CAN_INT_EIE : Error interrupt enable. + * @retval SET or RESET + ***********************************************************************************************************/ +FlagStatus CAN_GetIntStatus(HT_CAN_TypeDef* CANx, u32 CAN_Int) +{ + FlagStatus Status; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + if ((CANx->CR & CAN_Int) != RESET) + { + Status = SET; + } + else + { + Status = RESET; + } + return Status; +} + +/*********************************************************************************************************//** + * @brief Check whether the specified CAN flag has been set. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_Flag: specify the flag to be check. + * This parameter can be one of the following values: + * @arg CAN_FLAG_BOFF : Busoff Status + * @arg CAN_FLAG_EWARN : Warning Status + * @arg CAN_FLAG_EPASS : Error Passive + * @arg CAN_FLAG_RXOK : Received a Message Successfully + * @arg CAN_FLAG_TXOK : Transmitted a Message Successfully + * @retval SET or RESET + ************************************************************************************************************/ +FlagStatus CAN_GetFlagStatus(HT_CAN_TypeDef* CANx, uint32_t CAN_Flag) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + if (CANx->SR & CAN_Flag) + { + return SET; + } + else + { + return RESET; } } -/*********************************************************************************************************//** - * @brief Get current bit rate - * @param CANx: The pointer to CAN module base address. - * @retval Current Bit-Rate (kilo bit per second) +/**********************************************************************************************************//** + * @brief Clear the interrupt flag of the specified CAN. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_Flag: specify the flag that is to be cleared. + * @arg CAN_FLAG_RXOK : Received a Message Successfully + * @arg CAN_FLAG_TXOK : Transmitted a Message Successfully + * @retval None ***********************************************************************************************************/ -u32 CAN_GetCANBitRate(HT_CAN_TypeDef *CANx) +void CAN_ClearFlag(HT_CAN_TypeDef* CANx, uint32_t CAN_Flag) { - u32 wTseg1, wTseg2; - u32 wBpr; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); - wTseg1 = (CANx->BTR & CAN_BTR_TSEG0_Msk) >> CAN_BTR_TSEG0_Pos; - wTseg2 = (CANx->BTR & CAN_BTR_TSEG1_Msk) >> CAN_BTR_TSEG1_Pos; - wBpr = CANx->BTR & CAN_BTR_BRP_Msk; - wBpr |= CANx->BRPER << 6; + CANx->SR &= ~CAN_Flag; +} - return (SystemCoreClock / (wBpr + 1) / (wTseg1 + wTseg2 + 3)); +/**********************************************************************************************************//** + * @brief Returns the CANx's last error code (LEC). + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval This function will return the CAN_ErrorCode following values: + * - NO_ERROR : No Error + * - STUFF_ERROR : Stuff Error + * - FORM_ERROR : Form Error + * - ACK_ERROR : Acknowledgment Error + * - BIT1_EROR : Bit Recessive Error + * - BIT0_ERROR : Bit Dominant Error + * - CRC_ERROR : CRC Error + * - NO_CHANGE : Software Set Error + ***********************************************************************************************************/ +CAN_LastErrorCode_TypeDef CAN_GetLastErrorCode(HT_CAN_TypeDef* CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + return (CAN_LastErrorCode_TypeDef)(CANx->SR & CAN_LEC_Msk); +} + +/**********************************************************************************************************//** + * @brief Returns the CANx Receive Error Counter (REC). + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval CAN Receive Error Counter. + ***********************************************************************************************************/ +u32 CAN_GetReceiveErrorCounter(HT_CAN_TypeDef* CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + return ((CANx->ECR & CAN_ECR_REC_MsK) >> CAN_ECR_REC_Pos); +} + +/*********************************************************************************************************//** + * @brief Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC). + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval LSB of the 9-bit CAN Transmit Error Counter. + ***********************************************************************************************************/ +u32 CAN_GetLSBTransmitErrorCounter(HT_CAN_TypeDef* CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + return (CANx->ECR & CAN_ECR_TEC_MsK); +} + +/*********************************************************************************************************//** + * @brief Monitor CAN BusOff status. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval None + ***********************************************************************************************************/ +void CAN_BusOffRecovery(HT_CAN_TypeDef *CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + /* Get BusOff Flag */ + if (CANx->SR & CAN_FLAG_BOFF) + { + _CAN_LeaveInitMode(CANx); + } + return; } /**********************************************************************************************************//** * @brief Switch the CAN into test mode. - * @param CANx: The pointer to CAN module base address. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. * @param u8TestMask Specifies the configuration in test modes - * @arg CAN_TEST_BASIC_Msk : Enable basic mode of test mode - * @arg CAN_TEST_SILENT_Msk : Enable silent mode of test mode - * @arg CAN_TEST_LBACK_Msk : Enable Loop Back Mode of test mode - * @arg CAN_TEST_TX0_Msk/CAN_TEST_TX1_Msk: Control CAN_TX pin bit field + * @arg CAN_MODE_BASIC : Enable basic mode of test mode + * @arg CAN_MODE_SILENT : Enable silent mode of test mode + * @arg CAN_MODE_LBACK : Enable Loop Back Mode of test mode + * @arg CAN_MODE_MONITORER : Sample Point can be monitored at CAN_TX pin. + * @arg CAN_MODE_TX_DOMINANT : CAN_TX pin drives a dominant ('0') value + * @arg CAN_MODE_TX_RECESSIVE : CAN_TX pin drives a recessive ('1') value * @retval None ***********************************************************************************************************/ void CAN_EnterTestMode(HT_CAN_TypeDef *CANx, u32 u8TestMask) { - CANx->CR |= CAN_CR_TEST_Msk; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + CANx->CR |= CAN_CR_TEST; CANx->TR = u8TestMask; } /*********************************************************************************************************//** * @brief Leave the test mode - * @param CANx: The pointer to CAN module base address. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. * @retval None ***********************************************************************************************************/ void CAN_LeaveTestMode(HT_CAN_TypeDef *CANx) { - CANx->CR |= CAN_CR_TEST_Msk; - CANx->TR &= ~(CAN_TEST_LBACK_Msk | CAN_TEST_SILENT_Msk | CAN_TEST_BASIC_Msk); - CANx->CR &= (~CAN_CR_TEST_Msk); -} + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); -/*********************************************************************************************************//** - * @brief Get the waiting status of a received message. - * @param CANx: The pointer to CAN module base address. - * @param MsgObj: Specifies the Message object number, from 0 to 31. 0 No message object has new data. - ***********************************************************************************************************/ -u32 CAN_IsNewDataReceived(HT_CAN_TypeDef *CANx, u32 MsgObj) -{ - MsgObj--; - return (MsgObj < 16 ? CANx->NDR0 & (1 << MsgObj) : CANx->NDR1 & (1 << (MsgObj - 16))); + CANx->CR |= CAN_CR_TEST; + CANx->TR &= ~(CAN_MODE_LBACK | CAN_MODE_SILENT | CAN_MODE_BASIC | CAN_MODE_TX_RECESSIVE); + CANx->CR &= (~CAN_CR_TEST); } /*********************************************************************************************************//** * @brief The function is used to Send CAN message in BASIC mode of test mode. Before call the API, * the user should be call CAN_EnterTestMode(CAN_TEST_BASIC) and let CAN controller enter * basic mode of test mode. Please notice IF0 Registers used as Tx Buffer in basic mode. - * @param CANx: The pointer to CAN module base address. - * @param pCanMsg: Pointer to the message structure containing data to transmit. - * @retval TRUE: Transmission OK, FALSE: Check busy flag of interface 0 is timeout + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the data buffer to be transmitted. + * @param len: Length of the data to be transmitted. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -s32 CAN_BasicSendMsg(HT_CAN_TypeDef *CANx, STR_CANMSG_T_TypeDef* pCanMsg) +ErrStatus CAN_BasicSendMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len) { - u32 i = 0; - while(CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk); - - CANx->SR &= (~CAN_SR_TXOK_Msk); - - if(pCanMsg->IdType == CAN_STD_ID) + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + if (CANx->SR & CAN_FLAG_BOFF) { - /* standard ID*/ + return ERROR; + } + while (CANx->IF0.CREQ & CAN_FLAG_IF_BUSY) + { + } + + CANx->SR &= (~CAN_FLAG_TXOK); + + if (pCanMsg->IdType == CAN_STD_ID) + { + /* standard ID */ CANx->IF0.ARB0 = 0; - CANx->IF0.ARB1 = (((pCanMsg->Id) & 0x7FF) << 2) ; + CANx->IF0.ARB1 = (((pCanMsg->Id) & CAN_STD_FRAME_Msk) << 2); } else { - /* extended ID*/ - CANx->IF0.ARB0 = (pCanMsg->Id) & 0xFFFF; - CANx->IF0.ARB1 = ((pCanMsg->Id) & 0x1FFF0000) >> 16 | CAN_IF_ARB1_XTD_Msk; + /* extended ID */ + CANx->IF0.ARB0 = (pCanMsg->Id) & CAN_EXT_FRAME_LSB_Msk; + CANx->IF0.ARB1 = (((pCanMsg->Id) >> 16) & CAN_EXT_FRAME_MSB_Msk) | CAN_IF_ARB1_XTD; } - if(pCanMsg->FrameType) - CANx->IF0.ARB1 |= CAN_IF_ARB1_DIR_Msk; + if (pCanMsg->FrameType) + CANx->IF0.ARB1 |= CAN_IF_ARB1_DIR; else - CANx->IF0.ARB1 &= (~CAN_IF_ARB1_DIR_Msk); + CANx->IF0.ARB1 &= (~CAN_IF_ARB1_DIR); - CANx->IF0.MCR = (CANx->IF0.MCR & (~CAN_IF_MCR_DLC_Msk)) | pCanMsg->DLC; - CANx->IF0.DA0R = ((u16)pCanMsg->Data[1] << 8) | pCanMsg->Data[0]; - CANx->IF0.DA1R = ((u16)pCanMsg->Data[3] << 8) | pCanMsg->Data[2]; - CANx->IF0.DB0R = ((u16)pCanMsg->Data[5] << 8) | pCanMsg->Data[4]; - CANx->IF0.DB1R = ((u16)pCanMsg->Data[7] << 8) | pCanMsg->Data[6]; + CANx->IF0.MCR = (CANx->IF0.MCR & (~CAN_IF_MCR_DLC_Msk)) | len; + CANx->IF0.DA0R = ((u16)data[1] << 8) | data[0]; + CANx->IF0.DA1R = ((u16)data[3] << 8) | data[2]; + CANx->IF0.DB0R = ((u16)data[5] << 8) | data[4]; + CANx->IF0.DB1R = ((u16)data[7] << 8) | data[6]; - /* request transmission*/ - CANx->IF0.CREQ &= (~CAN_IF_CREQ_BUSY_Msk); - if(CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) + /* request transmission */ + CANx->IF0.CREQ &= (~CAN_FLAG_IF_BUSY); + if (CANx->IF0.CREQ & CAN_FLAG_IF_BUSY) { - return FALSE; + return ERROR; } - CANx->IF0.CREQ |= CAN_IF_CREQ_BUSY_Msk; /* Sending */ + CANx->IF0.CREQ |= CAN_FLAG_IF_BUSY; /* Sending */ - for(i = 0; i < 0xFFFFF; i++) - { - if((CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - break; - } - - if(i >= 0xFFFFFFF) - { - return FALSE; - } - return TRUE; + return SUCCESS; } /*********************************************************************************************************//** * @brief Get a message information in BASIC mode. - * @param CANx: The pointer to CAN module base address. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval FALSE: No any message received, TRUE: Receive a message success. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the buffer where received data will be stored. + * @param len: Pointer to a variable that will store the length of the received data. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -s32 CAN_BasicReceiveMsg(HT_CAN_TypeDef *CANx, STR_CANMSG_T_TypeDef* pCanMsg) +ErrStatus CAN_BasicReceiveMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8* len) { - if((CANx->IF1.MCR & CAN_IF_MCR_NEWDAT_Msk) == 0) /* In basic mode, receive data always save in IF1 */ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + if ((CANx->IF1.MCR & CAN_IF_MCR_NEWDAT) == 0) /* In basic mode, receive data always save in IF1 */ { - return FALSE; + return ERROR; } - CANx->SR &= (~CAN_SR_RXOK_Msk); + CANx->SR &= (~CAN_FLAG_RXOK); - CANx->IF1.CMASK = CAN_IF_CMASK_ARB_Msk - | CAN_IF_CMASK_CONTROL_Msk - | CAN_IF_CMASK_DATAA_Msk - | CAN_IF_CMASK_DATAB_Msk; + CANx->IF1.CMASK = CAN_IF_CMASK_ARB + | CAN_IF_CMASK_CONTROL + | CAN_IF_CMASK_DATAA + | CAN_IF_CMASK_DATAB; - if((CANx->IF1.MASK1 & CAN_IF_ARB1_XTD_Msk) == 0) + if ((CANx->IF1.MASK1 & CAN_IF_ARB1_XTD) == 0) { - /* standard ID*/ + /* standard ID */ pCanMsg->IdType = CAN_STD_ID; - pCanMsg->Id = (CANx->IF1.MASK1 >> 2) & 0x07FF; + pCanMsg->Id = (CANx->IF1.MASK1 >> 2) & CAN_STD_FRAME_Msk; } else { - /* extended ID*/ + /* extended ID */ pCanMsg->IdType = CAN_EXT_ID; - pCanMsg->Id = (CANx->IF1.ARB1 & 0x1FFF) << 16; - pCanMsg->Id |= (u32)CANx->IF1.ARB0; + pCanMsg->Id = (CANx->IF1.ARB1 & CAN_EXT_FRAME_MSB_Msk) << 16; + pCanMsg->Id |= (u32)CANx->IF1.ARB0; } - pCanMsg->FrameType = !((CANx->IF1.ARB1 & CAN_IF_ARB1_DIR_Msk) >> CAN_IF_ARB1_DIR_Pos); - - pCanMsg->DLC = CANx->IF1.MCR & CAN_IF_MCR_DLC_Msk; - pCanMsg->Data[0] = CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA0_Msk; - pCanMsg->Data[1] = (CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; - pCanMsg->Data[2] = CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA2_Msk; - pCanMsg->Data[3] = (CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; - pCanMsg->Data[4] = CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA4_Msk; - pCanMsg->Data[5] = (CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; - pCanMsg->Data[6] = CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA6_Msk; - pCanMsg->Data[7] = (CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; - - return TRUE; -} - -/*********************************************************************************************************//** - * @brief Set Rx message object - * @param CANx: The pointer to CAN module base address. - * @param MsgObj: Specifies the Message object number, from 0 to 31. - * @arg CAN_STD_ID (standard ID, 11-bit) - * @arg CAN_EXT_ID (extended ID, 29-bit) - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval TRUE: SUCCESS, FALSE: No useful interface. - ***********************************************************************************************************/ -s32 CAN_SetRxMsgObj(HT_CAN_TypeDef *CANx, u32 MsgObj, STR_CANMSG_R_TypeDef* pCanMsg) -{ - u32 u8MsgIfNum = 0; - - if((u8MsgIfNum = GetFreeIF(CANx)) == 2) /* Check Free Interface for configure */ - { - return FALSE; - } - - if (u8MsgIfNum == 1) - { - /* Command Setting */ - CANx->IF1.CMASK = CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_MASK_Msk | CAN_IF_CMASK_ARB_Msk | - CAN_IF_CMASK_CONTROL_Msk | CAN_IF_CMASK_DATAA_Msk | CAN_IF_CMASK_DATAB_Msk; - - if(pCanMsg->IdType == CAN_STD_ID) /* According STD/EXT ID format,Configure Mask and Arbitration register */ - { - CANx->IF1.ARB0 = 0; - CANx->IF1.ARB1 = CAN_IF_ARB1_MSGVAL_Msk | (pCanMsg->Id & 0x7FF) << 2; - CANx->IF1.MASK0 = pCanMsg->MASK0; - CANx->IF1.MASK1 = pCanMsg->MASK1; - } - else - { - CANx->IF1.ARB0 = pCanMsg->Id & 0xFFFF; - CANx->IF1.ARB1 = CAN_IF_ARB1_MSGVAL_Msk | CAN_IF_ARB1_XTD_Msk | (pCanMsg->Id & 0x1FFF0000) >> 16; - } - - CANx->IF1.MCR |= CAN_IF_MCR_RXIE_Msk | pCanMsg->MCR ; - - if(pCanMsg->UMASK) - { - CANx->IF1.MCR |= CAN_IF_MCR_UMASK_Msk; - CANx->IF1.MASK0 = pCanMsg->MASK0; - CANx->IF1.MASK1 = pCanMsg->MASK1; - } - - if(pCanMsg->RMTEN) - CANx->IF1.MCR |= CAN_IF_MCR_RMTEN_Msk; - else - CANx->IF1.MCR &= (~CAN_IF_MCR_RMTEN_Msk); - - if(pCanMsg->EOB) - CANx->IF1.MCR |= CAN_IF_MCR_EOB_Msk; - else - CANx->IF1.MCR &= (~CAN_IF_MCR_EOB_Msk); - - CANx->IF1.MCR &= (~CAN_IF_MCR_INTPND_Msk); - CANx->IF1.MCR &= (~CAN_IF_MCR_NEWDAT_Msk); - CANx->IF1.DA0R = 0; - CANx->IF1.DA1R = 0; - CANx->IF1.DB0R = 0; - CANx->IF1.DB1R = 0; - CANx->IF1.CREQ = MsgObj+1; - } - else - { - /* Command Setting */ - CANx->IF0.CMASK = CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_MASK_Msk | CAN_IF_CMASK_ARB_Msk | - CAN_IF_CMASK_CONTROL_Msk | CAN_IF_CMASK_DATAA_Msk | CAN_IF_CMASK_DATAB_Msk; - - if(pCanMsg->IdType == CAN_STD_ID) /* According STD/EXT ID format,Configure Mask and Arbitration register */ - { - CANx->IF0.ARB0 = 0; - CANx->IF0.ARB1 = CAN_IF_ARB1_MSGVAL_Msk | (pCanMsg->Id & 0x7FF) << 2; - CANx->IF0.MASK0 = pCanMsg->MASK0; - CANx->IF0.MASK1 = pCanMsg->MASK1; - } - else - { - CANx->IF0.ARB0 = pCanMsg->Id & 0xFFFF; - CANx->IF0.ARB1 = CAN_IF_ARB1_MSGVAL_Msk | CAN_IF_ARB1_XTD_Msk | (pCanMsg->Id & 0x1FFF0000) >> 16; - } - - CANx->IF0.MCR |= CAN_IF_MCR_RXIE_Msk | pCanMsg->MCR ; - - if(pCanMsg->UMASK) - { - CANx->IF0.MCR |= CAN_IF_MCR_UMASK_Msk; - CANx->IF0.MASK0 = pCanMsg->MASK0; - CANx->IF0.MASK1 = pCanMsg->MASK1; - } - - if(pCanMsg->RMTEN) - CANx->IF0.MCR |= CAN_IF_MCR_RMTEN_Msk; - else - CANx->IF0.MCR &= (~CAN_IF_MCR_RMTEN_Msk); - - if(pCanMsg->EOB) - CANx->IF0.MCR |= CAN_IF_MCR_EOB_Msk; - else - CANx->IF0.MCR &= (~CAN_IF_MCR_EOB_Msk); - - CANx->IF0.MCR &= (~CAN_IF_MCR_INTPND_Msk); - CANx->IF0.MCR &= (~CAN_IF_MCR_NEWDAT_Msk); - CANx->IF0.DA0R = 0; - CANx->IF0.DA1R = 0; - CANx->IF0.DB0R = 0; - CANx->IF0.DB1R = 0; - CANx->IF0.CREQ = MsgObj+1; - } - return TRUE; -} - -/*********************************************************************************************************//** - * @brief Gets the message - * @param CANx: The pointer to CAN module base address. - * @param MsgObj: Specifies the Message object number, from 0 to 31. - * @param Release: Specifies the message release indicator. - * @arg TRUE : the message object is released when getting the data. - * @arg FALSE: the message object is not released. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval TRUE Success, FALSE No any message received - ***********************************************************************************************************/ -s32 CAN_ReadMsgObj(HT_CAN_TypeDef *CANx, u32 MsgObj, u32 Release, STR_CANMSG_T_TypeDef* pCanMsg) -{ - u32 u8MsgIfNum = 0; - - if(!CAN_IsNewDataReceived(CANx, MsgObj)) - { - return FALSE; - } - - if((u8MsgIfNum = GetFreeIF(CANx)) == 2) /* Check Free Interface for configure */ - { - return FALSE; - } - - CANx->SR &= (~CAN_SR_RXOK_Msk); - - if (u8MsgIfNum == 1) - { - /* read the message contents*/ - CANx->IF1.CMASK = CAN_IF_CMASK_MASK_Msk - | CAN_IF_CMASK_ARB_Msk - | CAN_IF_CMASK_CONTROL_Msk - | CAN_IF_CMASK_CLRINTPND_Msk - | (Release ? CAN_IF_CMASK_TXRQSTNEWDAT_Msk : 0) - | CAN_IF_CMASK_DATAA_Msk - | CAN_IF_CMASK_DATAB_Msk; - - CANx->IF1.CREQ = MsgObj; - - while(CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) - { - /*Wait*/ - } - - if((CANx->IF1.ARB1 & CAN_IF_ARB1_XTD_Msk) == 0) - { - /* standard ID*/ - pCanMsg->IdType = CAN_STD_ID; - pCanMsg->Id = (CANx->IF1.ARB1 & CAN_IF_ARB1_ID_Msk) >> 2; - } - else - { - /* extended ID*/ - pCanMsg->IdType = CAN_EXT_ID; - pCanMsg->Id = (CANx->IF1.ARB1 & 0x1FFF) << 16 ; - pCanMsg->Id |= CANx->IF1.ARB0; - } - pCanMsg->MCR = CANx->IF1.MCR; - pCanMsg->DLC = CANx->IF1.MCR & CAN_IF_MCR_DLC_Msk; - pCanMsg->EOB = CANx->IF1.MCR & CAN_IF_MCR_EOB_Msk; - pCanMsg->Data[0] = CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA0_Msk; - pCanMsg->Data[1] = (CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; - pCanMsg->Data[2] = CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA2_Msk; - pCanMsg->Data[3] = (CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; - pCanMsg->Data[4] = CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA4_Msk; - pCanMsg->Data[5] = (CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; - pCanMsg->Data[6] = CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA6_Msk; - pCanMsg->Data[7] = (CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; - } - else - { - /* read the message contents*/ - CANx->IF0.CMASK = CAN_IF_CMASK_MASK_Msk - | CAN_IF_CMASK_ARB_Msk - | CAN_IF_CMASK_CONTROL_Msk - | CAN_IF_CMASK_CLRINTPND_Msk - | (Release ? CAN_IF_CMASK_TXRQSTNEWDAT_Msk : 0) - | CAN_IF_CMASK_DATAA_Msk - | CAN_IF_CMASK_DATAB_Msk; - - CANx->IF0.CREQ = MsgObj; - - while(CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) - { - /*Wait*/ - } - - if((CANx->IF0.ARB1 & CAN_IF_ARB1_XTD_Msk) == 0) - { - /* standard ID*/ - pCanMsg->IdType = CAN_STD_ID; - pCanMsg->Id = (CANx->IF0.ARB1 & CAN_IF_ARB1_ID_Msk) >> 2; - } - else - { - /* extended ID*/ - pCanMsg->IdType = CAN_EXT_ID; - pCanMsg->Id = (CANx->IF0.ARB1 & 0x1FFF) << 16; - pCanMsg->Id |= CANx->IF0.ARB0; - } - - pCanMsg->MCR = CANx->IF0.MCR; - pCanMsg->DLC = CANx->IF0.MCR & CAN_IF_MCR_DLC_Msk; - pCanMsg->EOB = CANx->IF0.MCR & CAN_IF_MCR_EOB_Msk; - pCanMsg->Data[0] = CANx->IF0.DA0R & CAN_IF_DAT_A0_DATA0_Msk; - pCanMsg->Data[1] = (CANx->IF0.DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; - pCanMsg->Data[2] = CANx->IF0.DA1R & CAN_IF_DAT_A1_DATA2_Msk; - pCanMsg->Data[3] = (CANx->IF0.DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; - pCanMsg->Data[4] = CANx->IF0.DB0R & CAN_IF_DAT_B0_DATA4_Msk; - pCanMsg->Data[5] = (CANx->IF0.DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; - pCanMsg->Data[6] = CANx->IF0.DB1R & CAN_IF_DAT_B1_DATA6_Msk; - pCanMsg->Data[7] = (CANx->IF0.DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; - } - return TRUE; -} - -/*********************************************************************************************************//** - * @brief Set bus baud-rate. - * @param CANx: The pointer to CAN module base address. - * @param wBaudRate: The target CAN baud-rate. The range of u32BaudRate is 1~1000KHz. - * @retval CurrentBitRate: Real baud-rate value. - ***********************************************************************************************************/ -u32 CAN_SetBaudRate(HT_CAN_TypeDef *CANx, u32 wBaudRate) -{ - u32 wTseg0, wTseg1; - u32 wBrp; - u32 wValue; - - CAN_EnterInitMode(CANx); - - SystemCoreClockUpdate(); - - wTseg0 = 2; - wTseg1 = 1; - - wValue = SystemCoreClock / wBaudRate; - - while(1) - { - if(((wValue % (wTseg0 + wTseg1 + 3)) == 0)) - break; - if(wTseg1 < 7) - wTseg1++; - - if((wValue % (wTseg0 + wTseg1 + 3)) == 0) - break; - if(wTseg0 < 15) - wTseg0++; - else - { - wTseg0 = 2; - wTseg1 = 1; - break; - } - } - - wBrp = SystemCoreClock / (wBaudRate) / (wTseg0 + wTseg1 + 3) - 1; - - wValue = ((u32)wTseg1 << CAN_BTR_TSEG1_Pos) | ((u32)wTseg0 << CAN_BTR_TSEG0_Pos) | - (wBrp & CAN_BTR_BRP_Msk) | (CANx->BTR & CAN_BTR_SJW_Msk); - CANx->BTR = wValue; - CANx->BRPER = (wBrp >> 6) & 0x0F; - - CAN_LeaveInitMode(CANx); - - return (CAN_GetCANBitRate(CANx)); -} - -/*********************************************************************************************************//** - * @brief The function is used to disable all CAN interrupt. - * @param CANx: The pointer to CAN module base address. - * @retval None - ***********************************************************************************************************/ -void CAN_Close(HT_CAN_TypeDef *CANx) -{ - CAN_DisableInt(CANx, (CAN_CR_IE_Msk | CAN_CR_SIE_Msk | CAN_CR_EIE_Msk)); -} - -/*********************************************************************************************************//** - * @brief Set CAN operation mode and target baud-rate. - * @param CANx: The pointer to CAN module base address. - * @param wBaudRate The target CAN baud-rate. The range of u32BaudRate is 1~1000KHz. - * @param wMode The CAN operation mode. - * @arg CAN_NORMAL_MODE : Normal operation. - * @arg CAN_BASIC_MODE : Basic operation. - * @arg CAN_SILENT_MODE : Silent operation. - * @arg CAN_LBACK_MODE : Loop Back operation. - * @arg CAN_LBS_MODE : Loop Back combined with Silent operation. - * @retval u32CurrentBitRate Real baud-rate value. - ***********************************************************************************************************/ -u32 CAN_Open(HT_CAN_TypeDef *CANx, u32 wBaudRate, u32 wMode) -{ - u32 CurrentBitRate; - - CurrentBitRate = CAN_SetBaudRate(CANx, wBaudRate); - - if(wMode) - CAN_EnterTestMode(CANx, wMode); - - return CurrentBitRate; -} - -/*********************************************************************************************************//** - * @brief The function is used to configure a transmit object. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval FALSE No useful interface, TRUE Config message object success. - ***********************************************************************************************************/ -s32 CAN_SetTxMsg(HT_CAN_TypeDef *CANx, u32 MsgNum , STR_CANMSG_T_TypeDef* pCanMsg) -{ - u32 MsgIfNum = 0; - u32 i = 0; - - while((MsgIfNum = GetFreeIF(CANx)) == 2) - { - i++; - if(i > 0x10000000) - return FALSE; - } - - /* update the contents needed for transmission*/ - if(MsgIfNum ==0) - { - CANx->IF0.CMASK = 0xF3; /* CAN_CMASK_WRRD_Msk | CAN_CMASK_MASK_Msk | CAN_CMASK_ARB_Msk - | CAN_CMASK_CONTROL_Msk | CAN_CMASK_DATAA_Msk | CAN_CMASK_DATAB_Msk ; */ - - if(pCanMsg->IdType == CAN_STD_ID) - { - /* standard ID*/ - CANx->IF0.ARB0 = 0; - CANx->IF0.ARB1 = (((pCanMsg->Id) & 0x7FF) << 2) | CAN_IF_ARB1_DIR_Msk | CAN_IF_ARB1_MSGVAL_Msk; - } - else - { - /* extended ID*/ - CANx->IF0.ARB0 = (pCanMsg->Id) & 0xFFFF; - CANx->IF0.ARB1 = ((pCanMsg->Id) & 0x1FFF0000) >> 16 | CAN_IF_ARB1_DIR_Msk - | CAN_IF_ARB1_XTD_Msk | CAN_IF_ARB1_MSGVAL_Msk; - } - - if(pCanMsg->FrameType) - CANx->IF0.ARB1 |= CAN_IF_ARB1_DIR_Msk; - else - CANx->IF0.ARB1 &= (~CAN_IF_ARB1_DIR_Msk); - - CANx->IF0.DA0R = ((u16)pCanMsg->Data[1] << 8) | pCanMsg->Data[0]; - CANx->IF0.DA1R = ((u16)pCanMsg->Data[3] << 8) | pCanMsg->Data[2]; - CANx->IF0.DB0R = ((u16)pCanMsg->Data[5] << 8) | pCanMsg->Data[4]; - CANx->IF0.DB1R = ((u16)pCanMsg->Data[7] << 8) | pCanMsg->Data[6]; - CANx->IF0.MCR = 0; - if(pCanMsg->RMTEN) - CANx->IF0.MCR |= CAN_IF_MCR_RMTEN_Msk; - else - CANx->IF0.MCR &= (~CAN_IF_MCR_RMTEN_Msk); - if(pCanMsg->EOB) - CANx->IF0.MCR |= CAN_IF_MCR_EOB_Msk; - else - CANx->IF0.MCR &= (~CAN_IF_MCR_EOB_Msk); - - CANx->IF0.MCR |= CAN_IF_MCR_NEWDAT_Msk | pCanMsg->DLC | CAN_IF_MCR_TXIE_Msk ; - CANx->IF0.CREQ = MsgNum +1; - } - else - { - CANx->IF1.CMASK = 0xF3; /* CAN_CMASK_WRRD_Msk | CAN_CMASK_MASK_Msk | CAN_CMASK_ARB_Msk - | CAN_CMASK_CONTROL_Msk | CAN_CMASK_DATAA_Msk | CAN_CMASK_DATAB_Msk ; */ - - if(pCanMsg->IdType == CAN_STD_ID) - { - /* standard ID*/ - CANx->IF1.ARB0 = 0; - CANx->IF1.ARB1 = (((pCanMsg->Id) & 0x7FF) << 2) | CAN_IF_ARB1_DIR_Msk | CAN_IF_ARB1_MSGVAL_Msk; - } - else - { - /* extended ID*/ - CANx->IF1.ARB0 = (pCanMsg->Id) & 0xFFFF; - CANx->IF1.ARB1 = ((pCanMsg->Id) & 0x1FFF0000) >> 16 | CAN_IF_ARB1_DIR_Msk - | CAN_IF_ARB1_XTD_Msk | CAN_IF_ARB1_MSGVAL_Msk; - } - - if(pCanMsg->FrameType) - CANx->IF1.ARB1 |= CAN_IF_ARB1_DIR_Msk; - else - CANx->IF1.ARB1 &= (~CAN_IF_ARB1_DIR_Msk); - - CANx->IF1.DA0R = ((u16)pCanMsg->Data[1] << 8) | pCanMsg->Data[0]; - CANx->IF1.DA1R = ((u16)pCanMsg->Data[3] << 8) | pCanMsg->Data[2]; - CANx->IF1.DB0R = ((u16)pCanMsg->Data[5] << 8) | pCanMsg->Data[4]; - CANx->IF1.DB1R = ((u16)pCanMsg->Data[7] << 8) | pCanMsg->Data[6]; - - CANx->IF1.MCR = 0; - - if(pCanMsg->RMTEN) - CANx->IF1.MCR |= CAN_IF_MCR_RMTEN_Msk; - else - CANx->IF1.MCR &= (~CAN_IF_MCR_RMTEN_Msk); - - if(pCanMsg->EOB) - CANx->IF1.MCR |= CAN_IF_MCR_EOB_Msk; - else - CANx->IF1.MCR &= (~CAN_IF_MCR_EOB_Msk); - - CANx->IF1.MCR |= CAN_IF_MCR_NEWDAT_Msk | pCanMsg->DLC | CAN_IF_MCR_TXIE_Msk ; - CANx->IF1.CREQ = MsgNum +1; - } - return TRUE; -} - -/*********************************************************************************************************//** - * @brief Set transmit request bit. - * If a transmission is requested by programming bit TxRqst/NewDat (IFn_CMASK[2]), the TxRqst - * (IFn_MCON[8]) will be ignored. - * @param CANx: The pointer to CAN module base address. - * @param u32MsgNum: Specifies the Message object number, from 0 to 31. - * @retval TRUE: Start transmit message. - ***********************************************************************************************************/ -s32 CAN_TriggerTxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum) -{ - CANx->SR &= (~CAN_SR_TXOK_Msk); - - /* read the message contents*/ - CANx->IF1.CMASK = CAN_IF_CMASK_CLRINTPND_Msk - | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - - CANx->IF1.CREQ = u32MsgNum+1; - - while(CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) - { - /*Wait*/ - } - CANx->IF0.CMASK = CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - CANx->IF0.CREQ = u32MsgNum+1; - - return TRUE; -} - -/*********************************************************************************************************//** - * @brief Enable CAN interrupt. - * The application software has two possibilities to follow the source of a message interrupt. - * First, it can follow the IntId in the Interrupt Register and second it can poll the Interrupt Pending Register. - * @param CANx: The pointer to CAN module base address. - * @param u32Mask: Interrupt Mask. - * @arg CAN_CR_IE_Msk : Module interrupt enable. - * @arg CAN_CR_SIE_Msk: Status change interrupt enable. - * @arg CAN_CR_EIE_Msk: Error interrupt enable. - * @retval None - ***********************************************************************************************************/ -void CAN_EnableInt(HT_CAN_TypeDef *CANx, u32 u32Mask) -{ - CAN_EnterInitMode(CANx); - - CANx->CR = (CANx->CR & 0xF1) | ((u32Mask & CAN_CR_IE_Msk) ? CAN_CR_IE_Msk : 0) - | ((u32Mask & CAN_CR_SIE_Msk) ? CAN_CR_SIE_Msk : 0) - | ((u32Mask & CAN_CR_EIE_Msk) ? CAN_CR_EIE_Msk : 0); - - - CAN_LeaveInitMode(CANx); -} - -/*********************************************************************************************************//** - * @brief Disable CAN interrupt. - * @param CANx: The pointer to CAN module base address. - * @param Mask: Interrupt Mask. (CAN_CR_IE_Msk / CAN_CR_SIE_Msk / CAN_CR_EIE_Msk). - * @retval None - ***********************************************************************************************************/ -void CAN_DisableInt(HT_CAN_TypeDef *CANx, u32 Mask) -{ - CAN_EnterInitMode(CANx); - - CANx->CR = CANx->CR & ~(CAN_CR_IE_Msk | ((Mask & CAN_CR_SIE_Msk) ? CAN_CR_SIE_Msk : 0) - | ((Mask & CAN_CR_EIE_Msk) ? CAN_CR_EIE_Msk : 0)); - - CAN_LeaveInitMode(CANx); -} - - -/*********************************************************************************************************//** - * @brief The function is used to configure a receive message object. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @arg CAN_STD_ID: The 11-bit identifier. - * @arg CAN_EXT_ID: The 29-bit identifier. - * @retval FALSE No useful interface, TRUE Configure a receive message object success. - ***********************************************************************************************************/ -s32 CAN_SetRxMsg(HT_CAN_TypeDef *CANx, u32 MsgNum , STR_CANMSG_R_TypeDef* pCanMsg) -{ - u32 TimeOutCount = 0; - - while(CAN_SetRxMsgObj(CANx, MsgNum, pCanMsg) == FALSE) - { - TimeOutCount++; - - if(TimeOutCount >= 0x10000000) return FALSE; - } - - return TRUE; -} - -/*********************************************************************************************************//** - * @brief The function is used to configure several receive message objects. - * The Interface Registers avoid conflict between the CPU accesses to the Message RAM and CAN message - * reception and transmission by buffering the data to be transferred. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: The starting MSG RAM number(0 ~ 31). - * @param MsgCount: the number of MSG RAM of the FIFO. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @arg CAN_STD_ID: The 11-bit identifier. - * @arg CAN_EXT_ID: The 29-bit identifier. - * @retval FALSE No useful interface, TRUE Configure receive message objects success. - ***********************************************************************************************************/ -s32 CAN_SetMultiRxMsg(HT_CAN_TypeDef *CANx, u32 MsgNum , u32 MsgCount, STR_CANMSG_R_TypeDef* pCanMsg) -{ - u32 i = 0; - u32 TimeOutCount; - - for(i = 1; i < MsgCount+1; i++) - { - TimeOutCount = 0; - pCanMsg->EOB = 0; - - if(i == MsgCount) - pCanMsg->EOB=1; - - while(CAN_SetRxMsgObj(CANx, MsgNum, pCanMsg) == FALSE) - { - TimeOutCount++; - - if(TimeOutCount >= 0x10000000) - return FALSE; - } - MsgNum ++; - } - - return TRUE; + *len = CANx->IF1.MCR & CAN_IF_MCR_DLC_Msk; + data[0] = CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA0_Msk; + data[1] = (CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; + data[2] = CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA2_Msk; + data[3] = (CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; + data[4] = CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA4_Msk; + data[5] = (CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; + data[6] = CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA6_Msk; + data[7] = (CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; + + return SUCCESS; } /*********************************************************************************************************//** * @brief Send CAN message. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval FALSE: 1. When operation in basic mode: Transmit message time out. - * 2. When operation in normal mode: No useful interface. - * TRUE: Transmit Message success. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the data buffer to be transmitted. + * @param len: Length of the data to be transmitted. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -s32 CAN_Transmit(HT_CAN_TypeDef *CANx, u32 MsgNum , STR_CANMSG_T_TypeDef* pCanMsg) +ErrStatus CAN_Transmit(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len) { - if((CANx->CR & CAN_CR_TEST_Msk) && (CANx->TR & CAN_TEST_BASIC_Msk)) + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + if (_CAN_SetTxMsg(CANx, pCanMsg, data, len) == ERROR) { - return (CAN_BasicSendMsg(CANx, pCanMsg)); + return ERROR; } - else - { - if(CAN_SetTxMsg(CANx, MsgNum, pCanMsg) == FALSE) - return FALSE; - - CANx->SR &= (~CAN_SR_TXOK_Msk); - - /* read the message contents*/ - CANx->IF1.CMASK = CAN_IF_CMASK_CLRINTPND_Msk - | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - - CANx->IF1.CREQ = MsgNum+1; - - while(CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) - { - /*Wait*/ - } - CANx->IF0.CMASK = CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - CANx->IF0.CREQ = MsgNum+1; - } - - return TRUE; + return (CAN_TriggerTxMsg(CANx, pCanMsg)); } /*********************************************************************************************************//** * @brief Gets the message, if received. * The Interface Registers avoid conflict between the CPU accesses to the Message RAM and CAN message * reception and transmission by buffering the data to be transferred. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval FALSE: No any message received, TRUE: Receive Message success. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the buffer where received data will be stored. + * @param len: Pointer to a variable that will store the length of the received data. + * @retval RxStatus_TypeDef: Returns the status of the message reception. Possible values are: + * - MSG_OBJ_NOT_SET + * - MSG_NOT_RECEIVED + * - MSG_OVER_RUN ***********************************************************************************************************/ -s32 CAN_Receive(HT_CAN_TypeDef *CANx, u32 MsgNum , STR_CANMSG_T_TypeDef* pCanMsg) +CAN_RxStatus_TypeDef CAN_Receive(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u32* len) { - if((CANx->CR & CAN_CR_TEST_Msk) && (CANx->TR & CAN_TEST_BASIC_Msk)) + u32 _MsgNum = pCanMsg->MsgNum; + CAN_RxStatus_TypeDef status = MSG_OBJ_NOT_SET; + bool firstMsg = TRUE; + *len = 0; + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) != FALSE) { - return (CAN_BasicReceiveMsg(CANx, pCanMsg)); + while (1) + { + s32 ReadMsgStatus; + if (_CAN_GetNewData(CANx, _MsgNum) == FALSE) + { + if (firstMsg == TRUE) + status = MSG_NOT_RECEIVED; + else + status = MSG_RX_FINISH; + break; + } + firstMsg = FALSE; + ReadMsgStatus = _CAN_ReadMsgObj(CANx, _MsgNum, TRUE, pCanMsg, &data[*len], len); + if (ReadMsgStatus != 0) + { + if (ReadMsgStatus == 2) + { + status = MSG_OVER_RUN; + break; + } + status = MSG_RX_FINISH; + break; + } + _MsgNum++; + } + } + return status; +} + +/*********************************************************************************************************//** + * @brief Cancels a transmit request. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_CancelTransmit(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg) +{ + HT_CANIF_TypeDef *IFx = NULL; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return ERROR; + } + + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + if ((IFx->CREQ & CAN_FLAG_IF_BUSY) == 0) + { + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_CLRINTPND; + IFx->MCR = 0; + IFx->CREQ = pCanMsg->MsgNum; + } + + return SUCCESS; +} + +/*********************************************************************************************************//** + * @brief Discard the specified FIFO. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_DiscardRxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return ERROR; + } + while (1) + { + HT_CANIF_TypeDef *IFx = NULL; + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + IFx->CMASK = CAN_IF_CMASK_TXRQSTNEWDAT | CAN_IF_CMASK_CONTROL; + IFx->CREQ = pCanMsg->MsgNum; + if (IFx->MCR & CAN_IF_MCR_EOB) + { + break; + } + } + return SUCCESS; +} + +/*********************************************************************************************************//** + * @brief The function is used to configure several receive message objects. + * The Interface Registers avoid conflict between the CPU accesses to the Message RAM and CAN message + * reception and transmission by buffering the data to be transferred. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param FifoDepth: the number of MSG RAM of the FIFO. + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_SetRxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u32 FifoDepth) +{ + s32 i = 0; + u32 _MsgNum; + + u32 eob; + if (pCanMsg->MsgNum == 0) + { + _MsgNum = _CAN_GetValidMsg(CANx); } else { - return CAN_ReadMsgObj(CANx, MsgNum, TRUE, pCanMsg); + _MsgNum = pCanMsg->MsgNum; } + if ((_MsgNum + FifoDepth) > MSG_OBJ_TOTAL_NUM) + { + return ERROR; + } + pCanMsg->MsgNum = _MsgNum; + eob = 0; + for (i = _MsgNum; i < FifoDepth + _MsgNum + 1; i++) + { + if (i == FifoDepth + _MsgNum) + { + eob = 1; + } + _CAN_SetRxMsgObj(CANx, i, pCanMsg, eob); + } + return SUCCESS; +} + +/*********************************************************************************************************//** + * @brief Get the waiting status of a received message. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval TRUE: The corresponding message object has a new data bit is set, FALSE otherwise. + ***********************************************************************************************************/ +bool CAN_NewDataReceived(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg) +{ + + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return FALSE; + } + return _CAN_GetNewData(CANx, pCanMsg->MsgNum); +} + +/*********************************************************************************************************//** + * @brief Get the interrupt pending status of a message object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval TRUE: The corresponding message object has a interrupt pending bit is set, FALSE otherwise. + ***********************************************************************************************************/ +bool CAN_GetMsgPending(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg) +{ + u32 Pending = CANx->IPR0; + Pending |= CANx->IPR1 << 16; + + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return FALSE; + } + + if ((Pending & 1 << (pCanMsg->MsgNum - 1)) == 0) + { + return FALSE; + } + return TRUE; } /*********************************************************************************************************//** * @brief Clear interrupt pending bit. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @retval None + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -void CAN_CLR_INT_PENDING_BIT(HT_CAN_TypeDef *CANx, u32 MsgNum) +ErrStatus CAN_ClearMsgPendingFlag(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg) { - u32 u32IFBusyCount = 0; - - while(u32IFBusyCount < 0x10000000) + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) { - if((CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - { - CANx->IF0.CMASK = CAN_IF_CMASK_CLRINTPND_Msk | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - CANx->IF0.CREQ = MsgNum+1; - break; - } - else if((CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - { - CANx->IF1.CMASK = CAN_IF_CMASK_CLRINTPND_Msk | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - CANx->IF1.CREQ = MsgNum+1; - break; - } - - u32IFBusyCount++; + return ERROR; } + _CAN_ClearMsgPendingFlag(CANx, pCanMsg->MsgNum); + + return SUCCESS; } /*********************************************************************************************************//** - * @brief The function is used to configure Mask as the message object. - * @param CANx: The pointer to CAN module base address. - * @param MsgObj: Specifies the Message object number, from 0 to 31. - * @param MaskMsg: Pointer to the message structure where received data is copied. - * @arg CAN_STD_ID: The 11-bit identifier. - * @arg CAN_EXT_ID: The 29-bit identifier. - * @retval FALSE No useful interface, TRUE Configure a receive message object success. + * @brief Checks the transmission of a message object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval 0: Transmitting, 1: Transmission successful, -1: Transmission failed. ***********************************************************************************************************/ -s32 CAN_MsgObjMaskConfig(HT_CAN_TypeDef *CANx, u32 MsgObj, STR_CANMSG_R_TypeDef* MaskMsg) +s32 CAN_TransmitStatus(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg) { - if(MaskMsg->IdType == CAN_STD_ID) - { - /* standard ID*/ - CANx->IF0.ARB0 = 0; - CANx->IF0.ARB1 = (((MaskMsg->Id) & 0x7FF) << 2) | CAN_IF_ARB1_MSGVAL_Msk ; + s32 TxStatus = 0; + u32 u32Reg; + s32 MsgNum = pCanMsg->MsgNum -1; - /* Set the Mask Standard ID(11-bit) for IFn Mask Register is used for acceptance filtering*/ - CANx->IF0.MASK0 = 0; - CANx->IF0.MASK1 = ((MaskMsg->Id & 0x7FF) << 2) ; - } - else + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) { - /* extended ID*/ - CANx->IF0.ARB0 = (MaskMsg->Id) & 0xFFFF; - CANx->IF0.ARB1 = ((MaskMsg->Id) & 0x1FFF0000) >> 16 | CAN_IF_ARB1_DIR_Msk - | CAN_IF_ARB1_XTD_Msk | CAN_IF_ARB1_MSGVAL_Msk; - /* Set the Mask Extended ID(29-bit) for IFn Mask Register is used for acceptance filtering*/ - CANx->IF0.MASK0 = (MaskMsg->Id) & 0xFFFF; - CANx->IF0.MASK1 = ((MaskMsg->Id) & 0x1FFF0000) >> 16 ; + return -1; } - if(MaskMsg->u8Xtd) - CANx->IF0.MASK1 |= CAN_IF_MASK1_MXTD_Msk; /* The extended identifier bit (IDE) is used for acceptance filtering */ - else - CANx->IF0.MASK1 &= (~CAN_IF_MASK1_MXTD_Msk); /* The extended identifier bit (IDE) has no effect on the acceptance filtering */ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); - if(MaskMsg->u8Dir) - CANx->IF0.MASK1 |= CAN_IF_MASK1_MDIR_Msk; /* The message direction bit (Dir) is used for acceptance filtering */ - else - CANx->IF0.MASK1 &= (~CAN_IF_MASK1_MDIR_Msk); /* The message direction bit (Dir) has no effect on the acceptance filtering */ + u32Reg = CANx->TRR0; + u32Reg |= (CANx->TRR1 << 16); + MsgNum = 1 << (MsgNum); + if ((u32Reg & (MsgNum)) == 0) + { + TxStatus = 1; + } - CANx->IF0.MCR |= CAN_IF_MCR_UMASK_Msk; /* Use Mask (Msk28-0, MXtd, and MDir) for acceptance filtering */ - - /* Update the contents needed for transmission*/ - CANx->IF0.CMASK = CAN_IF_CMASK_WRRD_Msk /* Transfer data from the selected Message Buffer Registers to the Message Object addressed */ - | CAN_IF_CMASK_MASK_Msk; /* Transfer Identifier Mask + MDir + MXtd to Message Object */ - - CANx->IF0.DA0R = 0; - CANx->IF0.DA1R = 0; - CANx->IF0.DB0R = 0; - CANx->IF0.DB1R = 0; - - /* Set the Message Object in the Message RAM is selected for data transfer */ - CANx->IF0.CREQ = 1 + MsgObj; - - return TRUE; + u32Reg = CANx->NDR0; + u32Reg |= (CANx->NDR1 << 16); + if ((u32Reg & (MsgNum)) > 0) + { + TxStatus = -1; + } + return TxStatus; } -/* Private functions ----------------------------------------------------------------------------------------*/ +/*********************************************************************************************************//** + * @brief Updates the data of a specified CAN message object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the data array. + * @param len: Length of the data to be sent, in bytes (maximum 8 bytes). + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_UpdateTxMsgData(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len) +{ + HT_CANIF_TypeDef *IFx = NULL; + + len &= CAN_IF_MCR_DLC_Msk; + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return ERROR; + } + + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_DATAA | CAN_IF_CMASK_DATAB | CAN_IF_CMASK_CONTROL; + + IFx->MCR &= (~CAN_IF_MCR_DLC_Msk); + IFx->MCR |= (len & CAN_IF_MCR_DLC_Msk); + IFx->DA0R = ((u16)(data[1] << 8) | data[0]); + IFx->DA1R = ((u16)(data[3] << 8) | data[2]); + IFx->DB0R = ((u16)(data[5] << 8) | data[4]); + IFx->DB1R = ((u16)(data[7] << 8) | data[6]); + + IFx->CREQ = pCanMsg->MsgNum; + + return SUCCESS; +} + +/*********************************************************************************************************//** + * @brief Set transmit request bit. + * If a transmission is requested by programming bit TxRqst/NewDat, the TxRqst will be ignored. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_TriggerTxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg) +{ + HT_CANIF_TypeDef *IFx = NULL; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + if (CANx->SR & CAN_FLAG_BOFF) + { + return ERROR; + } + + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return ERROR; + } + + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_CONTROL; + IFx->MCR |= CAN_IF_MCR_NEWDAT | CAN_IF_MCR_TXRQST; + IFx->CREQ = pCanMsg->MsgNum; + + return SUCCESS; +} + +/*********************************************************************************************************//** + * @brief Clears all pending message flags. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval None + ***********************************************************************************************************/ +void CAN_ClearAllMsgPendingFlag(HT_CAN_TypeDef *CANx) +{ + int i; + u32 Pending = CANx->IPR0; + Pending |= CANx->IPR1 << 16; + for (i = 0 ; i < MSG_OBJ_TOTAL_NUM ; i++) + { + if ((Pending & 1) == 1) + { + _CAN_ClearMsgPendingFlag(CANx, i + 1); + } + + Pending = Pending >> 1; + if (Pending == 0) + { + break; + } + } +} +/** + * @} + */ + +/* Private functions ---------------------------------------------------------------------------------------*/ /** @defgroup CAN_Private_Functions CAN private functions * @{ */ /*********************************************************************************************************//** - * @brief Check if SmartCard slot is presented. - * @param CANx: The pointer to CAN module base address. -* @retval Free IF number. IF0_NUM or IF1_NUM or IF_TOTAL_NUM (No IF is free) + * @brief The function is used to configure a transmit object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the data buffer to be transmitted. + * @param len: Length of the data to be transmitted. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -static CANIF_NUMBER_Enum GetFreeIF(HT_CAN_TypeDef *CANx) +ErrStatus _CAN_SetTxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len) { - if((CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - return IF0_NUM; - else if((CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - return IF1_NUM; + HT_CANIF_TypeDef *IFx = NULL; + if (pCanMsg->MsgNum == 0) + { + pCanMsg->MsgNum = _CAN_GetValidMsg(CANx); + } + if (pCanMsg->MsgNum > MSG_OBJ_TOTAL_NUM) + { + return ERROR; + } + + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + + /* update the contents needed for transmission */ + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_MASK | CAN_IF_CMASK_ARB + | CAN_IF_CMASK_CONTROL | CAN_IF_CMASK_DATAA | CAN_IF_CMASK_DATAB; + + if (pCanMsg->IdType == CAN_STD_ID) + { + /* standard ID */ + IFx->ARB0 = 0; + IFx->ARB1 = (((pCanMsg->Id) & CAN_STD_FRAME_Msk) << 2) | CAN_IF_ARB1_DIR | CAN_IF_ARB1_MSGVAL; + } else - return IF_TOTAL_NUM; + { + /* extended ID */ + IFx->ARB0 = (pCanMsg->Id) & CAN_EXT_FRAME_LSB_Msk; + IFx->ARB1 = (((pCanMsg->Id) >> 16) & CAN_EXT_FRAME_MSB_Msk) + | CAN_IF_ARB1_DIR | CAN_IF_ARB1_XTD | CAN_IF_ARB1_MSGVAL; + } + + if (pCanMsg->FrameType) + IFx->ARB1 |= CAN_IF_ARB1_DIR; + else + IFx->ARB1 &= (~CAN_IF_ARB1_DIR); + + IFx->DA0R = ((u16)data[1] << 8) | data[0]; + IFx->DA1R = ((u16)data[3] << 8) | data[2]; + IFx->DB0R = ((u16)data[5] << 8) | data[4]; + IFx->DB1R = ((u16)data[7] << 8) | data[6]; + + IFx->MCR = 0; + + IFx->MCR &= (~CAN_IF_MCR_RMTEN); + + IFx->MCR |= CAN_IF_MCR_NEWDAT | len | CAN_IF_MCR_TXIE; + IFx->CREQ = pCanMsg->MsgNum; + return SUCCESS; +} + +/*********************************************************************************************************//** + * @brief Get the waiting status of a received message. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param MsgNum: Specifies the Message object number, from 1 to 32. + * @retval TRUE: The corresponding message object has a new data bit is set, FALSE otherwise. + ***********************************************************************************************************/ +bool _CAN_GetNewData(HT_CAN_TypeDef *CANx, u32 MsgNum) +{ + u32 NewData = CANx->NDR0; + NewData |= CANx->NDR1 << 16; + + if ((NewData & 1 << (MsgNum - 1)) == 0) + { + return FALSE; + } + return TRUE; +} + +/*********************************************************************************************************//** + * @brief Get free interface. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval Free IF pointer. NULL: No IF is free + ***********************************************************************************************************/ +static HT_CANIF_TypeDef *_GetFreeIF(HT_CAN_TypeDef *CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + if ((CANx->IF0.CREQ & CAN_FLAG_IF_BUSY) == 0) + { + return &CANx->IF0; + } + else if ((CANx->IF1.CREQ & CAN_FLAG_IF_BUSY) == 0) + { + return &CANx->IF1; + } + else + { + return NULL; + } +} + +/*********************************************************************************************************//** + * @brief This function is used to set CAN to enter initialization mode and enable access bit timing + * register.After bit timing configuration ready, user must call CAN_LeaveInitMode() to leave + * initialization mode and lock bit timing register to let new configuration take effect. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval None + ***********************************************************************************************************/ +static void _CAN_EnterInitMode(HT_CAN_TypeDef *CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + CANx->CR |= CAN_CR_INIT; + CANx->CR |= CAN_CR_CCE; +} + +/*********************************************************************************************************//** + * @brief Leave initialization mode + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval None + ***********************************************************************************************************/ +static void _CAN_LeaveInitMode(HT_CAN_TypeDef *CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + CANx->CR &= (~(CAN_CR_INIT | CAN_CR_CCE)); + + while (CANx->CR & CAN_CR_INIT); /* Check INIT bit is released */ +} + +/*********************************************************************************************************//** + * @brief Set Rx message object + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param MsgNum: Specifies the Message object number, from 1 to 32. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param uSingleOrFifoLast: Specifies the end-of-buffer indicator. + * @retval None + ***********************************************************************************************************/ +static void _CAN_SetRxMsgObj(HT_CAN_TypeDef *CANx, u32 MsgNum, CAN_MSG_TypeDef* pCanMsg, u32 uSingleOrFifoLast) +{ + HT_CANIF_TypeDef *IFx = NULL; + + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + /* Command Setting */ + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_MASK | CAN_IF_CMASK_ARB | + CAN_IF_CMASK_CONTROL | CAN_IF_CMASK_DATAA | CAN_IF_CMASK_DATAB; + + if (pCanMsg->IdType == CAN_STD_ID) /* According STD/EXT ID format, Configure Mask and Arbitration register */ + { + /* Standard Mask.(bit28..bit18). */ + IFx->ARB0 = 0; + IFx->ARB1 = CAN_IF_ARB1_MSGVAL | (pCanMsg->Id & CAN_STD_FRAME_Msk) << 2; + IFx->MASK0 = 0; + IFx->MASK1 = CAN_IF_MASK1_MDIR | (pCanMsg->IdMask & CAN_STD_FRAME_Msk) << 2; + } + else + { + IFx->ARB0 = pCanMsg->Id & CAN_EXT_FRAME_LSB_Msk; + IFx->ARB1 = CAN_IF_ARB1_MSGVAL | CAN_IF_ARB1_XTD | ((pCanMsg->Id >> 16) & CAN_EXT_FRAME_MSB_Msk); + IFx->MASK0 = pCanMsg->IdMask & CAN_EXT_FRAME_LSB_Msk; + IFx->MASK1 = CAN_IF_MASK1_MXTD | CAN_IF_MASK1_MDIR | ((pCanMsg->IdMask>> 16) & CAN_EXT_FRAME_MSB_Msk); + } + + IFx->MCR = CAN_IF_MCR_RXIE | CAN_IF_MCR_UMASK; + + if (pCanMsg->FrameType == CAN_REMOTE_FRAME) + { + + IFx->ARB1 |= CAN_IF_ARB1_DIR; + IFx->MCR |= CAN_IF_MCR_RMTEN; + } + + if (uSingleOrFifoLast) + IFx->MCR |= CAN_IF_MCR_EOB; + + IFx->MCR &= (~CAN_IF_MCR_INTPND); + IFx->MCR &= (~CAN_IF_MCR_NEWDAT); + IFx->CREQ = MsgNum; +} + +/*********************************************************************************************************//** + * @brief Gets the message + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param MsgNum: Specifies the Message object number, from 1 to 32. + * @param Release: Specifies the message release indicator. + * @arg TRUE : the message object is released when getting the data. + * @arg FALSE: the message object is not released. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the buffer where received data will be stored. + * @param len: Pointer to a variable that will store the length of the received data. +* @retval 0: Data not empty, 1: Finish, 2: data over run + ***********************************************************************************************************/ +static s32 _CAN_ReadMsgObj(HT_CAN_TypeDef *CANx, u32 MsgNum, u32 Release, CAN_MSG_TypeDef* pCanMsg, u8* data, u32* len) +{ + HT_CANIF_TypeDef *IFx = NULL; + + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + + /* read the message contents */ + IFx->CMASK = CAN_IF_CMASK_MASK + | CAN_IF_CMASK_ARB + | CAN_IF_CMASK_CONTROL + | CAN_IF_CMASK_CLRINTPND + | (Release ? CAN_IF_CMASK_TXRQSTNEWDAT : 0) + | CAN_IF_CMASK_DATAA + | CAN_IF_CMASK_DATAB; + + IFx->CREQ = MsgNum; + + while (IFx->CREQ & CAN_FLAG_IF_BUSY) + { + /*Wait */ + } + + if ((IFx->ARB1 & CAN_IF_ARB1_XTD) == 0) + { + /* standard ID */ + pCanMsg->Id = (IFx->ARB1 & CAN_IF_ARB1_ID_Msk) >> 2; + } + else + { + /* extended ID */ + pCanMsg->Id = (IFx->ARB1 & CAN_EXT_FRAME_MSB_Msk) << 16; + pCanMsg->Id |= IFx->ARB0; + } + if ((IFx->MCR & CAN_IF_MCR_RMTEN) == 0) + { + pCanMsg->FrameType = CAN_DATA_FRAME; + } + else + { + pCanMsg->FrameType = CAN_REMOTE_FRAME; + } + + *len += IFx->MCR & CAN_IF_MCR_DLC_Msk; + data[0] = IFx->DA0R & CAN_IF_DAT_A0_DATA0_Msk; + data[1] = (IFx->DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; + data[2] = IFx->DA1R & CAN_IF_DAT_A1_DATA2_Msk; + data[3] = (IFx->DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; + data[4] = IFx->DB0R & CAN_IF_DAT_B0_DATA4_Msk; + data[5] = (IFx->DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; + data[6] = IFx->DB1R & CAN_IF_DAT_B1_DATA6_Msk; + data[7] = (IFx->DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; + if ((IFx->MCR & CAN_IF_MCR_MSGLST) > 0) + { + IFx->CMASK =CAN_IF_CMASK_WRRD | CAN_IF_CMASK_CONTROL; + IFx->MCR &= ~CAN_IF_MCR_MSGLST; + IFx->CREQ = MsgNum; + IFx->CMASK = CAN_IF_CMASK_TXRQSTNEWDAT; + IFx->CREQ = MsgNum; + return 2; + } + if ((IFx->MCR & CAN_IF_MCR_EOB) > 0) + { + return 1; + } + else + { + return 0; + } +} + +/*********************************************************************************************************//** + * @brief Gets the first valid message object number from the CAN message valid registers (MVR0 and MVR1). + * This function scans through the message object table to find the first valid message object that is + * not set (i.e., where the corresponding bit in the message valid register is 0). + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval The index of the first valid message object that is not set. + ***********************************************************************************************************/ +static int _CAN_GetValidMsg(HT_CAN_TypeDef *CANx) +{ + s32 _MsgNum; + u32 msgNumTable = CANx->MVR0; + msgNumTable |= CANx->MVR1 << 16; + for (_MsgNum = 0 ; _MsgNum < MSG_OBJ_TOTAL_NUM ; _MsgNum++) + { + if ((msgNumTable & 1) == 0) + { + break; + } + msgNumTable = msgNumTable >> 1; + } + return _MsgNum + 1; +} + +/*********************************************************************************************************//** + * @brief Checks if the specified message number is valid. + * @param CANx: Pointer to the CAN peripheral. + * @param MsgNum: The message number. + * @retval TRUE if the message number is valid, FALSE otherwise. + ***********************************************************************************************************/ +static bool _CAN_CheckMsgIsValid(HT_CAN_TypeDef *CANx, u32 MsgNum) +{ + if ((MsgNum == 0) || (MsgNum > MSG_OBJ_TOTAL_NUM)) + { + return FALSE; + } + return TRUE; +} + +/*********************************************************************************************************//** + * @brief Clears the pending flag for a specific CAN message object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param MsgNum: The message number. + * @retval None. + ***********************************************************************************************************/ +static void _CAN_ClearMsgPendingFlag(HT_CAN_TypeDef *CANx, u32 MsgNum) +{ + HT_CANIF_TypeDef *IFx = NULL; + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + IFx->CMASK = CAN_IF_CMASK_CLRINTPND; + IFx->CREQ = MsgNum; } /** * @} @@ -1023,7 +1139,3 @@ static CANIF_NUMBER_Enum GetFreeIF(HT_CAN_TypeDef *CANx) /** * @} */ - -/** - * @} - */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c index 9238830a04..8cfac0313b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_ckcu.c - * @version $Rev:: 7322 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the Clock Control Unit firmware functions. ************************************************************************************************************* * @attention @@ -90,7 +90,7 @@ #define CKCU_MASK_POTD ((u32)0x3 << CKCU_POS_POTD) #define CKCU_POS_PFBD 23 -#define CKCU_MASK_PFBD ((u32)0x0F << CKCU_POS_PFBD) +#define CKCU_MASK_PFBD ((u32)0x1F << CKCU_POS_PFBD) /* PLLCR bit field definition */ #define CKCU_POS_PLLBYPASS 31 @@ -139,8 +139,10 @@ #define CKCU_MASK_CKSWST ((u32)0x7 << CKCU_POS_CKSWST) /* LPCR bit field definition */ +#if (!LIBCFG_CKCU_NO_LPCR) #define CKCU_POS_BKISO 0 #define CKCU_MASK_BKISO ((u32)0x1 << CKCU_POS_BKISO) +#endif /* HSICR bit field definition */ #define CKCU_POS_TRIMEN (0) @@ -152,6 +154,7 @@ #define CKCU_POS_REFCLKSEL (5) #define CKCU_MASK_REFCLKSEL ((u32)0x3 << CKCU_POS_REFCLKSEL) + /** * @} */ @@ -521,12 +524,12 @@ void CKCU_SetLCDPrescaler(CKCU_LCDPRE_TypeDef LCDPRE) /*********************************************************************************************************//** * @brief Configure the CK_MIDI prescaler. * @param MIDIPRE: specify the value of divider. - * This parameter can be: - * @arg CKCU_MIDIPRE_DIV8 : CK_MIDI = HCLK / 8 - * @arg CKCU_MIDIPRE_DIV9 : CK_MIDI = HCLK / 9 - * @arg CKCU_MIDIPRE_DIV11 : CK_MIDI = HCLK / 11 - * @arg CKCU_MIDIPRE_DIV13 : CK_MIDI = HCLK / 13 - * @arg CKCU_MIDIPRE_DIV16 : CK_MIDI = HCLK / 16 + * This parameter can be: + * @arg CKCU_MIDIPRE_DIV8 : CK_MIDI = HCLK / 8 + * @arg CKCU_MIDIPRE_DIV9 : CK_MIDI = HCLK / 9 + * @arg CKCU_MIDIPRE_DIV11 : CK_MIDI = HCLK / 11 + * @arg CKCU_MIDIPRE_DIV13 : CK_MIDI = HCLK / 13 + * @arg CKCU_MIDIPRE_DIV16 : CK_MIDI = HCLK / 16 * @retval None ************************************************************************************************************/ void CKCU_SetMIDIPrescaler(CKCU_MIDIPRE_TypeDef MIDIPRE) @@ -637,31 +640,31 @@ u32 CKCU_GetPLLFrequency(void) /*********************************************************************************************************//** * @brief Configure the APB peripheral prescaler. * @param Perip: specify the APB peripheral. - * This parameter can be: - * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, CKCU_PCLK_I2C2, - * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, - * CKCU_PCLK_CAN0, - * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, - * CKCU_PCLK_MCTM0, - * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, - * CKCU_PCLK_USART0, CKCU_PCLK_USART1, - * CKCU_PCLK_UART0, CKCU_PCLK_UART1, CKCU_PCLK_UART2, CKCU_PCLK_UART3 - * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, CKCU_PCLK_OPA - * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, - * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, - * CKCU_PCLK_I2S, - * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, CKCU_PCLK_SCTM2, CKCU_PCLK_SCTM3 - * CKCU_PCLK_PWM0, CKCU_PCLK_PWM1 - * CKCU_PCLK_AFE, CKCU_PCLK_DAC0, CKCU_PCLK_DAC1, CKCU_PCLK_MIDI - * CKCU_PCLK_LEDC, CKCU_PCLK_TKEY + * This parameter can be: + * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, CKCU_PCLK_I2C2, + * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, + * CKCU_PCLK_CAN0, + * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, + * CKCU_PCLK_MCTM0, + * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, + * CKCU_PCLK_USART0, CKCU_PCLK_USART1, + * CKCU_PCLK_UART0, CKCU_PCLK_UART1, CKCU_PCLK_UART2, CKCU_PCLK_UART3 + * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, CKCU_PCLK_OPA, CKCU_PCLK_PGA + * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, + * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, + * CKCU_PCLK_I2S, + * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, CKCU_PCLK_SCTM2, CKCU_PCLK_SCTM3 + * CKCU_PCLK_PWM0, CKCU_PCLK_PWM1 + * CKCU_PCLK_AFE, CKCU_PCLK_DAC0, CKCU_PCLK_DAC1, CKCU_PCLK_MIDI + * CKCU_PCLK_LEDC, CKCU_PCLK_TKEY * @param PCLKPrescaler: specify the value of prescaler. - * This parameter can be: - * @arg CKCU_APBCLKPRE_DIV1: specific peripheral clock = PCLK / 1 (inapplicable to BKPRCLK) - * @arg CKCU_APBCLKPRE_DIV2: specific peripheral clock = PCLK / 2 (inapplicable to BKPRCLK) - * @arg CKCU_APBCLKPRE_DIV4: specific peripheral clock = PCLK / 4 - * @arg CKCU_APBCLKPRE_DIV8: specific peripheral clock = PCLK / 8 - * @arg CKCU_APBCLKPRE_DIV16: specific peripheral clock = PCLK / 16 (BKPRCLK only) - * @arg CKCU_APBCLKPRE_DIV32: specific peripheral clock = PCLK / 32 (BKPRCLK only) + * This parameter can be: + * @arg CKCU_APBCLKPRE_DIV1: specific peripheral clock = PCLK / 1 (inapplicable to BKPRCLK) + * @arg CKCU_APBCLKPRE_DIV2: specific peripheral clock = PCLK / 2 (inapplicable to BKPRCLK) + * @arg CKCU_APBCLKPRE_DIV4: specific peripheral clock = PCLK / 4 + * @arg CKCU_APBCLKPRE_DIV8: specific peripheral clock = PCLK / 8 + * @arg CKCU_APBCLKPRE_DIV16: specific peripheral clock = PCLK / 16 (BKPRCLK only) + * @arg CKCU_APBCLKPRE_DIV32: specific peripheral clock = PCLK / 32 (BKPRCLK only) * @retval None ************************************************************************************************************/ void CKCU_SetPeripPrescaler(CKCU_PeripPrescaler_TypeDef Perip, CKCU_APBCLKPRE_TypeDef PCLKPrescaler) @@ -673,29 +676,29 @@ void CKCU_SetPeripPrescaler(CKCU_PeripPrescaler_TypeDef Perip, CKCU_APBCLKPRE_Ty Prescaler -= 2; } Perip &= 0x0000001F; - CKCU_BF_WRITE(*PCSR, (3UL << Perip), Perip, Prescaler); + CKCU_BF_WRITE(*PCSR, (3UL << Perip), Perip, (Prescaler & 0x3)); } #endif /*********************************************************************************************************//** * @brief Return the operating frequency of the specific APB peripheral. * @param Perip: specify the APB peripheral. - * This parameter can be: - * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, CKCU_PCLK_I2C2, - * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, - * CKCU_PCLK_CAN0, - * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, - * CKCU_PCLK_MCTM0, - * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, - * CKCU_PCLK_USART0, CKCU_PCLK_USART1, - * CKCU_PCLK_UART0, CKCU_PCLK_UART1, CKCU_PCLK_UART2, CKCU_PCLK_UART3 - * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC0, CKCU_PCLK_ADC1, CKCU_PCLK_CMP, CKCU_PCLK_OPA - * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, - * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, - * CKCU_PCLK_I2S, - * CKCU_PCLK_PWM0, CKCU_PCLK_PWM1 - * CKCU_PCLK_AFE, CKCU_PCLK_DAC0, CKCU_PCLK_DAC1, CKCU_PCLK_MIDI - * CKCU_PCLK_LEDC, CKCU_PCLK_TKEY + * This parameter can be: + * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, CKCU_PCLK_I2C2, + * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, + * CKCU_PCLK_CAN0, + * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, + * CKCU_PCLK_MCTM0, + * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, + * CKCU_PCLK_USART0, CKCU_PCLK_USART1, + * CKCU_PCLK_UART0, CKCU_PCLK_UART1, CKCU_PCLK_UART2, CKCU_PCLK_UART3 + * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC0, CKCU_PCLK_ADC1, CKCU_PCLK_CMP, CKCU_PCLK_OPA, CKCU_PCLK_PGA + * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, + * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, + * CKCU_PCLK_I2S, + * CKCU_PCLK_PWM0, CKCU_PCLK_PWM1 + * CKCU_PCLK_AFE, CKCU_PCLK_DAC0, CKCU_PCLK_DAC1, CKCU_PCLK_MIDI + * CKCU_PCLK_LEDC, CKCU_PCLK_TKEY * @retval Frequency in Hz ************************************************************************************************************/ u32 CKCU_GetPeripFrequency(CKCU_PeripPrescaler_TypeDef Perip) @@ -993,14 +996,14 @@ void CKCU_PeripClockConfig(CKCU_PeripClockConfig_TypeDef Clock, ControlStatus Cm HT_CKCU->APBCCR1 = uAPBCCR1; } -#if (((LIBCFG_LSE) || (LIBCFG_USBD)) && (!LIBCFG_CKCU_NO_AUTO_TRIM)) +#if (((LIBCFG_LSE) || (LIBCFG_USBD) || (LIBCFG_CKCU_REFCLK_EXT_PIN)) && (!LIBCFG_CKCU_NO_AUTO_TRIM)) /*********************************************************************************************************//** * @brief Configure the reference clock of HSI auto-trim function. * @param CLKSRC: specify the clock source. - * This parameter can be: - * @arg CKCU_ATC_LSE: LSE is selected as reference clock - * @arg CKCU_ATC_USB: USB is selected as reference clock - * @arg CKCU_ATC_CKIN: External pin (CKIN) is selected as reference clock + * This parameter can be: + * @arg CKCU_ATC_LSE: LSE is selected as reference clock + * @arg CKCU_ATC_USB: USB is selected as reference clock + * @arg CKCU_ATC_CKIN: External pin (CKIN) is selected as reference clock * @retval None ************************************************************************************************************/ void CKCU_HSIAutoTrimClkConfig(CKCU_ATC_TypeDef CLKSRC) @@ -1083,7 +1086,7 @@ bool CKCU_HSIAutoTrimIsReady(void) * @param Value: 0x0~0x1F. * @retval None ************************************************************************************************************/ -void CKCU_Set_HSIReadyCounter(u8 Value) +void CKCU_SetHSIReadyCounter(u8 Value) { /* Check the parameters */ Assert_Param(IS_COUNTER_VALUE(Value)); @@ -1091,6 +1094,23 @@ void CKCU_Set_HSIReadyCounter(u8 Value) HT_CKCU->HSIRDYCR = ((HT_CKCU->HSIRDYCR) & (~(0x1F))) | Value; } #endif + +/*********************************************************************************************************//** + * @brief Set HSE Gain Mode. + * @param GanMode: Specify the gain mode of HSE. + * This parameter can be: + * @arg CKCU_HSE_LOW_GAIN_MODE : HSE low gain mode + * @arg CKCU_HSE_HIGH_GAIN_MODE : HSE high gain mode + * @retval None + ************************************************************************************************************/ +void CKCU_SetHSEGainMode(u32 GanMode) +{ + /* Check the parameters */ + Assert_Param(IS_GAINMODE(GanMode)); + + HT_CKCU->GCCR = (HT_CKCU->GCCR & ~(0x100)) | GanMode; +} + /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c index 10f4b9dded..fff32e0549 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_cmp.c - * @version $Rev:: 6932 $ - * @date $Date:: 2023-05-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the CMP firmware functions. ************************************************************************************************************* * @attention @@ -90,7 +90,7 @@ void CMP_Init(HT_CMP_TypeDef* HT_CMPn, CMP_InitTypeDef* CMP_InitStruct) Assert_Param(IS_CMP_ScalerEnable(CMP_InitStruct->CMP_ScalerEnable)); Assert_Param(IS_CMP_CoutSynchronized(CMP_InitStruct->CMP_CoutSync)); Assert_Param(IS_CMP_OutputPol_Set(CMP_InitStruct->CMP_OutputPol)); - #if (LIBCFG_CMP_65x_VER) + #if (LIBCFG_CMP_65x_66x_VER) Assert_Param(IS_CMP_InputSelection(CMP_InitStruct->CMP_InputSelection)); #endif Assert_Param(IS_CMP_InvInputSelection(CMP_InitStruct->CMP_InvInputSelection)); @@ -102,7 +102,7 @@ void CMP_Init(HT_CMP_TypeDef* HT_CMPn, CMP_InitTypeDef* CMP_InitStruct) CMP_InitStruct->CMP_OutputPol | CMP_InitStruct->CMP_InvInputSelection | CMP_InitStruct->CMP_Hysteresis | \ CMP_InitStruct->CMP_Speed; - #if (LIBCFG_CMP_65x_VER) + #if (LIBCFG_CMP_65x_66x_VER) HT_CMPn->CI = CMP_InitStruct->CMP_InputSelection; #endif } diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c index e209d4c1a0..97e58529f6 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_dac.c - * @version $Rev:: 7081 $ - * @date $Date:: 2023-08-01 #$ + * @version $Rev:: 7904 $ + * @date $Date:: 2024-07-26 #$ * @brief This file provides all the DAC firmware functions. ************************************************************************************************************* * @attention @@ -38,6 +38,15 @@ */ +/* Private constants ---------------------------------------------------------------------------------------*/ +/** @defgroup DAC_Private_Define DAC private definitions + * @{ + */ +#define DAC_ENABLE_BIT (0x00000001) +/** + * @} + */ + /* Global functions ----------------------------------------------------------------------------------------*/ /** @defgroup DAC_Exported_Functions DAC exported functions * @{ @@ -185,11 +194,11 @@ void DAC_Cmd(HT_DAC_TypeDef* HT_DACn, u8 DAC_Ch, ControlStatus NewState) if (NewState != DISABLE) { - SetBit_BB((u32)&DACnCH->CR, 0); + DACnCH->CR |= DAC_ENABLE_BIT; } else { - ResetBit_BB((u32)&DACnCH->CR, 0); + DACnCH->CR &= ~(DAC_ENABLE_BIT); } } diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c index 18e04c04fa..936ef0896d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_flash.c - * @version $Rev:: 6657 $ - * @date $Date:: 2023-01-16 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the FLASH firmware functions. ************************************************************************************************************* * @attention @@ -92,9 +92,16 @@ #define IS_WAIT_STATE2(x) (0) #endif +#if (LIBCFG_FMC_WAIT_STATE_3) +#define IS_WAIT_STATE3(x) (x == FLASH_WAITSTATE_3) +#else +#define IS_WAIT_STATE3(x) (0) +#endif + #define IS_FLASH_WAITSTATE(WAIT) ((WAIT == FLASH_WAITSTATE_0) || \ (WAIT == FLASH_WAITSTATE_1) || \ - (IS_WAIT_STATE2(WAIT))) + (IS_WAIT_STATE2(WAIT)) || \ + (IS_WAIT_STATE3(WAIT))) #endif /** * @brief Check parameter of the FLASH vector mapping. @@ -137,6 +144,7 @@ * @arg \ref FLASH_WAITSTATE_0 : zero wait state * @arg \ref FLASH_WAITSTATE_1 : one wait state * @arg \ref FLASH_WAITSTATE_2 : two wait state + * @arg \ref FLASH_WAITSTATE_3 : three wait state * @retval None ************************************************************************************************************/ void FLASH_SetWaitState(u32 FLASH_WAITSTATE_n) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c index 4f778467de..ed29369ffb 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_gpio.c - * @version $Rev:: 6398 $ - * @date $Date:: 2022-10-27 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the GPIO and AFIO firmware functions. ************************************************************************************************************* * @attention @@ -293,7 +293,7 @@ void GPIO_OpenDrainConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, Contr GPIO_CK_OFF(); } -#if LIBCFG_GPIO_SINK_CURRENT_ENHANCED +#if (LIBCFG_GPIO_SINK_CURRENT_ENHANCED) /*********************************************************************************************************//** * @brief Select the sink current of specified GPIO pins. * @param HT_GPIOx: where HT_GPIOx is the selected GPIO from the GPIO peripherals. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c index 0ab83cf919..d659df0830 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_pwrcu.c - * @version $Rev:: 6386 $ - * @date $Date:: 2022-10-27 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the Power Control Unit firmware functions. ************************************************************************************************************* * @attention @@ -68,9 +68,11 @@ #define Reset_V15RDYSC ResetBit_BB((u32)&HT_PWRCU->CR, 12) #endif +#if (!LIBCFG_PWRCU_NO_DS2_MODE) #define Set_DMOSSTS SetBit_BB((u32)&HT_PWRCU->CR, 15) #define Reset_DMOSSTS ResetBit_BB((u32)&HT_PWRCU->CR, 15) #define Get_DMOSSTS GetBit_BB((u32)&HT_PWRCU->CR, 15) +#endif #define Set_BODEN SetBit_BB((u32)&HT_PWRCU->LVDCSR, 0) #define Reset_BODEN ResetBit_BB((u32)&HT_PWRCU->LVDCSR, 0) @@ -105,7 +107,6 @@ #define LVDS_MASK 0xFFB9FFFF #define VREG_V_MASK 0xF3FFFFFF #define VREG_M_MASK 0xFCFFFFFF -#define PWRRST_SET 0x1 /** * @} */ @@ -266,6 +267,7 @@ void PWRCU_DeepSleep1(PWRCU_SLEEP_ENTRY_Enum SleepEntry) SCB->SCR &= ~(u32)SLEEPDEEP_SET; } +#if (!LIBCFG_PWRCU_NO_DS2_MODE) /*********************************************************************************************************//** * @brief Enter DEEP-SLEEP Mode 2. * @param SleepEntry : Enters sleep mode instruction that is used to WFI or WFE. @@ -385,6 +387,7 @@ void PWRCU_DeepSleep2Ex(PWRCU_SLEEP_ENTRY_Enum SleepEntry) } } #endif +#endif #if (!LIBCFG_PWRCU_NO_PD_MODE) /*********************************************************************************************************//** @@ -561,6 +564,7 @@ FlagStatus PWRCU_GetBODFlagStatus(void) return (FlagStatus)Get_BODF; } +#if (!LIBCFG_PWRCU_NO_DS2_MODE) /*********************************************************************************************************//** * @brief Return the DMOS status. * @retval This function will return one of the following values: @@ -610,6 +614,7 @@ void PWRCU_DMOSCmd(ControlStatus NewState) Reset_DMOSON; } } +#endif /*********************************************************************************************************//** * @brief Configure the LDO operation mode. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c index 5515859641..ffc160adf9 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_spi.c - * @version $Rev:: 7322 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 7674 $ + * @date $Date:: 2024-03-28 #$ * @brief This file provides all the SPI firmware functions. ************************************************************************************************************* * @attention @@ -364,6 +364,11 @@ void SPI_SoftwareSELCmd(HT_SPI_TypeDef* SPIx, u32 SPI_SoftwareSEL) } else { + /* Inactive SEL pin needs to ensure the transmission has ended. If the program flow cannot guarantee */ + /* SPI transmission completion, you can enable the procedure below. */ + #if 0 + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + #endif SPIx->CR0 &= SPI_SEL_INACTIVE; } } @@ -602,6 +607,8 @@ void SPI_DUALCmd(HT_SPI_TypeDef* SPIx, ControlStatus NewState) Assert_Param(IS_SPI(SPIx)); Assert_Param(IS_CONTROL_STATUS(NewState)); + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + (NewState == ENABLE)?(SPIx->CR0 |= CR0_DUALEN_SET):(SPIx->CR0 &= CR0_DUALEN_RESET); } #endif @@ -619,6 +626,8 @@ void QSPI_QuadCmd(HT_SPI_TypeDef* SPIx, ControlStatus NewState) Assert_Param(IS_QSPI(SPIx)); Assert_Param(IS_CONTROL_STATUS(NewState)); + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + if (NewState == DISABLE) { QSPI_DirectionConfig(SPIx, SIO_DIR_IN); @@ -645,6 +654,8 @@ void QSPI_DirectionConfig(HT_SPI_TypeDef* SPIx, SIO_DIR_Enum SIO_DIR_INorOUT) Assert_Param(IS_QSPI(SPIx)); Assert_Param(IS_SIO_DIR(SIO_DIR_INorOUT)); + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + if (SIO_DIR_INorOUT != SIO_DIR_IN) SPIx->CR0 |= CR0_QDIODIR_OUT; else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c index 1e4a2fe15d..dbc66535b2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_tm.c - * @version $Rev:: 7059 $ - * @date $Date:: 2023-07-27 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the TM firmware functions. ************************************************************************************************************* * @attention @@ -67,7 +67,8 @@ #define CTR_CHCCDS 0x00010000ul #define CH0ICFR_CH0SRC 0x80000000ul -#define CHICFR_CHF_MASK ~0x000000FFul +#define CHICFR_CHF_MASK ~0x000000FFul /* CHF Mask for CHICFR, varies by model. + Using ~0x000000FFul for all model. */ #define CHICFR_CHCCS_MASK ~0x00030000ul #define CHICFR_CHPSC_MASK ~0x000C0000ul @@ -335,12 +336,12 @@ void TM_CaptureInit(HT_TM_TypeDef* TMx, TM_CaptureInitTypeDef* CapInit) Assert_Param(IS_TM_CHP(CapInit->Polarity)); Assert_Param(IS_TM_CHCCS(CapInit->Selection)); Assert_Param(IS_TM_CHPSC(CapInit->Prescaler)); - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) #else Assert_Param(IS_TM_FILTER(CapInit->Filter)); #endif - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) Filter = FILTER_PROCESS(CapInit); #else Filter = CapInit->Filter; @@ -373,7 +374,7 @@ void TM_PwmInputInit(HT_TM_TypeDef* TMx, TM_CaptureInitTypeDef* CapInit) Assert_Param(IS_TM_CHP(CapInit->Polarity)); Assert_Param(IS_TM_CHCCS(CapInit->Selection)); Assert_Param(IS_TM_CHPSC(CapInit->Prescaler)); - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) #else Assert_Param(IS_TM_FILTER(CapInit->Filter)); #endif @@ -409,7 +410,7 @@ void TM_PwmInputInit(HT_TM_TypeDef* TMx, TM_CaptureInitTypeDef* CapInit) OppositeChannel = TM_CH_0; } - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) Filter = FILTER_PROCESS(CapInit); #else Filter = CapInit->Filter; @@ -479,7 +480,7 @@ void TM_CaptureStructInit(TM_CaptureInitTypeDef* CapInit) CapInit->Polarity = TM_CHP_NONINVERTED; CapInit->Selection = TM_CHCCS_DIRECT; CapInit->Prescaler = TM_CHPSC_OFF; - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) CapInit->Fsampling = TM_CHFDIV_1; CapInit->Event = TM_CHFEV_OFF; #else @@ -559,7 +560,7 @@ void TM_ChExternalClockConfig(HT_TM_TypeDef* TMx, TM_TRSEL_Enum Sel, TM_CHP_Enum Assert_Param(IS_TM(TMx)); Assert_Param(IS_TM_TRSEL_CH(Sel)); Assert_Param(IS_TM_CHP(Pol)); - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) #else Assert_Param(IS_TM_FILTER(Filter)); #endif @@ -903,6 +904,7 @@ void TM_CHCCRPreloadConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus } } +#if 0 /*********************************************************************************************************//** * @brief Clear or Safeguard the CHxOREF signal when ETI is active. * @param TMx: where TMx is the selected TM from the TM peripheral. @@ -934,6 +936,7 @@ void TM_ClearOREFConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus Ne *pOcfr &= ~CHOCFR_REFCE; } } +#endif /*********************************************************************************************************//** * @brief Configure polarity of the TMx channel N. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c index c0dd366f36..b5ec97acf6 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_usart.c - * @version $Rev:: 7054 $ - * @date $Date:: 2023-07-24 #$ + * @version $Rev:: 7698 $ + * @date $Date:: 2024-04-15 #$ * @brief This file provides all the USART firmware functions. ************************************************************************************************************* * @attention @@ -366,7 +366,7 @@ void USART_ClearFlag(HT_USART_TypeDef* USARTx, u32 USART_Flag) * @arg USART_INT_RSADD : * @arg USART_INT_TOUT : * @arg USART_INT_CTS : -* @arg USART_INT_LBD : + * @arg USART_INT_LBD : * @param NewState: This parameter can be ENABLE or DISABLE. * @retval None ************************************************************************************************************/ @@ -871,11 +871,10 @@ void USART_LIN_SendBreak(HT_USART_TypeDef* USARTx) USARTx->CR |= USART_LINSENDBREAK; } - /*********************************************************************************************************//** * @brief Configure the break detection length in LIN mode. * @param USARTx: where USARTx is the selected USART/UART from the USART/UART peripherals. - * @param length: data length in byte. + * @param USART_LIN_Length: data length in byte. * This parameter can be one of the following values: * @arg USART_LINLENGTH_11BIT * @arg USART_LINLENGTH_10BIT diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c index b90f5b1fac..13d5064e60 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_wdt.c - * @version $Rev:: 2772 $ - * @date $Date:: 2018-05-15 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the WDT firmware functions. ************************************************************************************************************* * @attention @@ -55,8 +55,8 @@ #define MODE0_WDTFIEN_RESET ((u32)0xFFFFEFFF) /* WDT WDTRSTEN mask */ -#define MODE0_WDTRETEN_SET ((u32)0x00002000) -#define MODE0_WDTRETEN_RESET ((u32)0xFFFFDFFF) +#define MODE0_WDTRSTEN_SET ((u32)0x00002000) +#define MODE0_WDTRSTEN_RESET ((u32)0xFFFFDFFF) /* WDT WDTEN mask */ #define MODE0_WDTEN_SET ((u32)0x00010000) @@ -109,9 +109,9 @@ void WDT_Cmd(ControlStatus NewState) * @brief Configure the WDT to run or halt in sleep and deep sleep1 mode. * @param WDT_Mode: * This parameter can be one of the following values: - * @arg MODE0_WDTSHLT_BOTH : WDT runs in sleep and deep sleep1 mode - * @arg MODE0_WDTSHLT_SLEEP : WDT runs in sleep mode - * @arg MODE0_WDTSHLT_HALT : WDT halts in sleep and deep sleep1 mode + * @arg WDT_SLEEP_HALT_NONE : WDT no halt + * @arg WDT_SLEEP_HALT_DEEPSLEEP : WDT halts in deep sleep1 mode + * @arg WDT_SLEEP_HALT_ALL : WDT halts in sleep and deep sleep1 mode * @retval None ************************************************************************************************************/ void WDT_HaltConfig(u32 WDT_Mode) @@ -134,11 +134,11 @@ void WDT_ResetCmd(ControlStatus NewState) if (NewState != DISABLE) { - HT_WDT->MR0 |= MODE0_WDTRETEN_SET; + HT_WDT->MR0 |= MODE0_WDTRSTEN_SET; } else { - HT_WDT->MR0 &= MODE0_WDTRETEN_RESET; + HT_WDT->MR0 &= MODE0_WDTRSTEN_RESET; } } diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_adc.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_adc.c index 88c5d8aced..c624ee0289 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_adc.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_adc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_adc.c - * @version $Rev:: 7367 $ - * @date $Date:: 2023-12-06 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the ADC firmware functions. ************************************************************************************************************* * @attention @@ -43,7 +43,11 @@ * @{ */ #define ADC_ENABLE_BIT (0x00000080) + +#if (LIBCFG_ADC1) #define DUAL_MODE_MASK (0x00000003) +#endif + #define ADC_SOFTWARE_RESET (0x00000001) #define LST_SEQ_SET (0x0000001F) #define TCR_SC_SET (0x00000001) @@ -51,9 +55,15 @@ #define HLST_SEQ_SET (0x0000001F) #define HTCR_SC_SET (0x00000001) +#if (!LIBCFG_ADC_NO_OFFSET_REG) #define OFR_ADOF_MASK (0x00000FFF) #define OFR_ADAL (1 << 14) #define OFR_ADOFE (1 << 15) +#endif + +#if (LIBCFG_ADC_MVDDA) +#define ADC_VREF_MVDDAEN (0x00000100) +#endif /** * @} */ @@ -162,8 +172,8 @@ void ADC_DualModeConfig(HT_ADC_TypeDef* HT_ADCn, u32 DUAL_X, u8 HDelayTime, u8 D * @arg ONE_SHOT_MODE : * @arg CONTINUOUS_MODE : * @arg DISCONTINUOUS_MODE : - * @param Length: must between 1 ~ 16 - * @param SubLength: must between 1 ~ 16, only valid for DISCONTINUOUS_MODE. + * @param Length: must between 1 ~ 8 + * @param SubLength: must between 1 ~ 8, only valid for DISCONTINUOUS_MODE. * @retval None ************************************************************************************************************/ void ADC_RegularGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 SubLength) @@ -189,8 +199,8 @@ void ADC_RegularGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 * @arg ONE_SHOT_MODE : * @arg CONTINUOUS_MODE : * @arg DISCONTINUOUS_MODE : - * @param Length: must between 1 ~ 4 - * @param SubLength: must between 1 ~ 4 + * @param Length: must between 1 ~ 8 (5 ~ 8 only for specific model) + * @param SubLength: must between 1 ~ 8 (5 ~ 8 only for specific model) * @retval None ************************************************************************************************************/ void ADC_HPGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 SubLength) @@ -211,8 +221,16 @@ void ADC_HPGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 SubLe * @param ADC_CH_n: the ADC channel to configure * This parameter can be one of the following values: * @arg ADC_CH_n : ADC Channel x selected, x must between 0 ~ 7 + * @arg ADC_CH_OPA0 : ADC OPA0O selected + * @arg ADC_CH_OPA1 : ADC OPA1O selected + * @arg ADC_CH_PGA0O : ADC PGA0O selected + * @arg ADC_CH_PGA1O : ADC PGA1O selected + * @arg ADC_CH_PGA2O : ADC PGA2O selected + * @arg ADC_CH_PGA3O : ADC PGA3O selected * @arg ADC_CH_GND_VREF : ADC GND VREF selected * @arg ADC_CH_VDD_VREF : ADC VDD VREF selected + * @arg ADC_CH_BANDGAP : ADC BANDGAP selected + * @arg ADC_CH_MVDDA : ADC MVDDA selected * @param Rank: The rank in the regular group sequencer. * This parameter must be between 0 to 7. * @param SampleClock: Number of sampling clocks. @@ -230,7 +248,18 @@ void ADC_RegularChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 Assert_Param(IS_ADC_INPUT_SAMPLING_TIME(SampleClock)); /* config sampling clock of correspond ADC input channel */ + #if (LIBCFG_ADC_STR_16_17) + if (ADC_CH_n < 16) + { + HT_ADCn->STR[ADC_CH_n] = SampleClock; + } + else + { + HT_ADCn->STR16[ADC_CH_n - 16] = SampleClock; + } + #else HT_ADCn->STR[ADC_CH_n] = SampleClock; + #endif /* Get the old register value */ tmpreg1 = HT_ADCn->LST[Rank >> 2]; @@ -252,10 +281,18 @@ void ADC_RegularChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 * @param ADC_CH_n: the ADC channel to configure * This parameter can be one of the following values: * @arg ADC_CH_n : ADC Channel x selected, x must between 0 ~ 7 + * @arg ADC_CH_OPA0 : ADC OPA0O selected + * @arg ADC_CH_OPA1 : ADC OPA1O selected + * @arg ADC_CH_PGA0O : ADC PGA0O selected + * @arg ADC_CH_PGA1O : ADC PGA1O selected + * @arg ADC_CH_PGA2O : ADC PGA2O selected + * @arg ADC_CH_PGA3O : ADC PGA3O selected * @arg ADC_CH_GND_VREF : ADC GND VREF selected * @arg ADC_CH_VDD_VREF : ADC VDD VREF selected + * @arg ADC_CH_BANDGAP : ADC BANDGAP selected + * @arg ADC_CH_MVDDA : ADC MVDDA selected * @param Rank: The rank in the high priority group sequencer. - * This parameter must be between 0 to 3. + * This parameter must be between 0 to 11. (4 ~ 11 only for specific model) * @param SampleClock: Number of sampling clocks. * This parameter must be between 0x00 to 0xFF. * @retval None @@ -271,10 +308,25 @@ void ADC_HPChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 Sampl Assert_Param(IS_ADC_INPUT_SAMPLING_TIME(SampleClock)); /* config sampling clock of correspond ADC input channel */ + #if (LIBCFG_ADC_STR_16_17) + if (ADC_CH_n < 16) + { + HT_ADCn->STR[ADC_CH_n] = SampleClock; + } + else + { + HT_ADCn->STR16[ADC_CH_n - 16] = SampleClock; + } + #else HT_ADCn->STR[ADC_CH_n] = SampleClock; + #endif /* Get the old register value */ + #if (LIBCFG_ADC_HLST_0_2) + tmpreg1 = HT_ADCn->HLST[Rank >> 2]; + #else tmpreg1 = HT_ADCn->HLST; + #endif /* Calculate the mask to clear */ tmpreg2 = HLST_SEQ_SET << (8 * (Rank & 0x3)); /* Clear the old SEQx bits for the selected rank */ @@ -284,7 +336,11 @@ void ADC_HPChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 Sampl /* Set the SEQx bits for the selected rank */ tmpreg1 |= tmpreg2; /* Store the new register value */ + #if (LIBCFG_ADC_HLST_0_2) + HT_ADCn->HLST[Rank >> 2] = tmpreg1; + #else HT_ADCn->HLST = tmpreg1; + #endif } /*********************************************************************************************************//** @@ -537,7 +593,7 @@ u16 ADC_GetConversionData(HT_ADC_TypeDef* HT_ADCn, u8 ADC_REGULAR_DATAn) /*********************************************************************************************************//** * @brief Return the result of ADC high priority channel conversion. * @param HT_ADCn: where HT_ADCn is the selected ADC from the ADC peripherals. - * @param ADC_HP_DATAn: where x can be 0 ~ 3 + * @param ADC_HP_DATAn: where x can be 0 ~ 11, (4 ~ 11 only for specific model) * @retval The Value of data conversion. ************************************************************************************************************/ u16 ADC_GetHPConversionData(HT_ADC_TypeDef* HT_ADCn, u8 ADC_HP_DATAn) @@ -546,7 +602,18 @@ u16 ADC_GetHPConversionData(HT_ADC_TypeDef* HT_ADCn, u8 ADC_HP_DATAn) Assert_Param(IS_ADC(HT_ADCn)); Assert_Param(IS_ADC_HP_DATA(ADC_HP_DATAn)); + #if (LIBCFG_ADC_HDR_4_11) + if (ADC_HP_DATAn < 4) + { + return ((u16)HT_ADCn->HDR[ADC_HP_DATAn]); + } + else + { + return ((u16)HT_ADCn->HDR4[ADC_HP_DATAn - 4]); + } + #else return ((u16)HT_ADCn->HDR[ADC_HP_DATAn]); + #endif } /*********************************************************************************************************//** @@ -770,6 +837,54 @@ void ADC_PDMAConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_PDMA_x, ControlStatus NewSt HT_ADCn->PDMAR &= ~ADC_PDMA_x; } } + +#if (LIBCFG_ADC_IVREF) +/*********************************************************************************************************//** + * @brief Enable or Disable the VREF. + * @param HT_ADCn: where HT_ADCn is the selected ADC from the ADC peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void ADC_VREFCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_ADC(HT_ADCn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_ADCn->VREFCR |= 0x00000001; + } + else + { + HT_ADCn->VREFCR &= ~(0x00000001); + } +} +#endif + +#if (LIBCFG_ADC_MVDDA) +/*********************************************************************************************************//** + * @brief Enable or Disable the power of MVDDA (VDDA/2) + * @param HT_ADCn: where HT_ADCn is the selected ADC from the ADC peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void ADC_MVDDACmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_ADC(HT_ADCn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_ADCn->VREFCR |= ADC_VREF_MVDDAEN; + } + else + { + HT_ADCn->VREFCR &= ~(ADC_VREF_MVDDAEN); + } +} +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_opa.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_opa.c index 6df13c0c01..69a13d106e 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_opa.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_opa.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_opa.c - * @version $Rev:: 6932 $ - * @date $Date:: 2023-05-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the OPA firmware functions. ************************************************************************************************************* * @attention @@ -113,7 +113,7 @@ void OPA_ProtectConfig(HT_OPA_TypeDef* HT_OPAn) /* Check the parameters */ Assert_Param(IS_OPA(HT_OPAn)); - /* Write any value to bit 16 ~ 31 (PROTECT) and keep the other control bir */ + /* Write any value to bit 16 ~ 31 (PROTECT) and keep the other control bit */ HT_OPAn->CR = HT_OPAn->CR; } @@ -153,28 +153,9 @@ void OPA_Init(HT_OPA_TypeDef* HT_OPAn, OPA_InitTypeDef* OPA_InitStruct) Assert_Param(IS_OPA(HT_OPAn)); Assert_Param(IS_OPA_ScalerEnable(OPA_InitStruct->OPA_ScalerEnable)); Assert_Param(IS_OPA_ExtPinEnable(OPA_InitStruct->OPA_ExternalPinEnable)); - #if (LIBCFG_OPA_PGA) - Assert_Param(IS_OPA_PGAEnable(OPA_InitStruct->OPA_PGAEnable)); - Assert_Param(IS_OPA_UnitGainEnable(OPA_InitStruct->OPA_UnitGainEnable)); - Assert_Param(IS_OPA_PGA_SEL(OPA_InitStruct->OPA_PGAGain)); - #endif - #if (LIBCFG_OPA_PGA) - /* avoid both PGA and unit gain active at the same time */ - if (OPA_InitStruct->OPA_UnitGainEnable == OPA_UNITGAIN_ENABLE) - { - OPA_InitStruct->OPA_PGAEnable = OPA_PGA_DISABLE; - } - #endif - - #if (LIBCFG_OPA_PGA) - HT_OPAn->CR = OPA_InitStruct->OPA_ScalerEnable | OPA_InitStruct->OPA_PGAGain | \ - OPA_InitStruct->OPA_ExternalPinEnable | OPA_InitStruct->OPA_PGAEnable | \ - OPA_InitStruct->OPA_UnitGainEnable; - #else HT_OPAn->CR = OPA_InitStruct->OPA_ScalerEnable | \ OPA_InitStruct->OPA_ExternalPinEnable; - #endif } /*********************************************************************************************************//** @@ -187,11 +168,6 @@ void OPA_StructInit(OPA_InitTypeDef* OPA_InitStruct) /* OPA_InitStruct members default value */ OPA_InitStruct->OPA_ScalerEnable = OPA_SCALER_DISABLE; OPA_InitStruct->OPA_ExternalPinEnable = OPA_ExternalPin_DISABLE; - #if (LIBCFG_OPA_PGA) - OPA_InitStruct->OPA_PGAEnable = OPA_PGA_DISABLE; - OPA_InitStruct->OPA_UnitGainEnable = OPA_UNITGAIN_DISABLE; - OPA_InitStruct->OPA_PGAGain = PGA_GAIN_6; - #endif } /*********************************************************************************************************//** @@ -220,98 +196,6 @@ void OPA_ExternalInputCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState) } } -#if (LIBCFG_OPA_PGA) -/*********************************************************************************************************//** - * @brief Enable or Disable the Unit Gain. - * @param HT_OPAn: where HT_OPAn is the selected OPA from the OPA peripherals. - * @param NewState: This parameter can be ENABLE or DISABLE. - * @retval None - ************************************************************************************************************/ -void OPA_UnitGainCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState) -{ - u32 OPA_CR = (u32)(&HT_OPAn->CR); - u32 CRValue; - - /* Check the parameters */ - Assert_Param(IS_OPA(HT_OPAn)); - Assert_Param(IS_CONTROL_STATUS(NewState)); - - CRValue = HT_OPAn->CR & (~(0x06UL)); // reset unit gain & PGA - - if (NewState == ENABLE) - { - CRValue |= 0x2; - } - - HT_OPAn->CR = gOPAUnProtectKey; - HT_OPAn->CR = CRValue; -} - -/*********************************************************************************************************//** - * @brief Enable or Disable the PGA. - * @param HT_OPAn: where HT_OPAn is the selected OPA from the OPA peripherals. - * @param NewState: This parameter can be ENABLE or DISABLE. - * @retval None - ************************************************************************************************************/ -void OPA_PGACmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState) -{ - u32 OPA_CR = (u32)(&HT_OPAn->CR); - u32 CRValue; - - /* Check the parameters */ - Assert_Param(IS_OPA(HT_OPAn)); - Assert_Param(IS_CONTROL_STATUS(NewState)); - - CRValue = HT_OPAn->CR & (~(0x06UL)); // reset unit gain & PGA - - if (NewState == ENABLE) - { - CRValue |= 0x4; // set PGA - } - - HT_OPAn->CR = gOPAUnProtectKey; - HT_OPAn->CR = CRValue; -} - -/*********************************************************************************************************//** - * @brief Configure the Gain Selection for the PGA. - * @param HT_OPAn: where HT_OPAn is the selected OPA from the OPA peripherals. - * @param GAIN_SEL : - * This parameter can be one of the following value: - * @arg PGA_GAIN_6 : - * @arg PGA_GAIN_8 : - * @arg PGA_GAIN_12 : - * @arg PGA_GAIN_16 : - * @arg PGA_GAIN_24 : - * @arg PGA_GAIN_32 : - * @arg PGA_GAIN_48 : - * @arg PGA_GAIN_64 : - * @arg PGA_GAIN_5 : - * @arg PGA_GAIN_7 : - * @arg PGA_GAIN_11 : - * @arg PGA_GAIN_15 : - * @arg PGA_GAIN_23 : - * @arg PGA_GAIN_31 : - * @arg PGA_GAIN_47 : - * @arg PGA_GAIN_63 : - * @retval None - ************************************************************************************************************/ -void OPA_PGAGain(HT_OPA_TypeDef* HT_OPAn, u8 bGAIN_SEL) -{ - u32 CRValue; - - /* Check the parameters */ - Assert_Param(IS_OPA(HT_OPAn)); - Assert_Param(IS_OPA_PGA_SEL(bGAIN_SEL)); - - CRValue = HT_OPAn->CR & (~0x70UL); - CRValue |= (u32)bGAIN_SEL << 4; - - HT_OPAn->CR = gOPAUnProtectKey; - HT_OPAn->CR = CRValue; -} -#endif - /*********************************************************************************************************//** * @brief Enable or Disable the 10bit Scaler. * @param HT_OPAn: where HT_OPAn is the selected OPA from the OPA peripherals. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_pga.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_pga.c index 6dacca7f49..41b1b509e7 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_pga.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_pga.c @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_pga.c - * @version $Rev:: 6914 $ - * @date $Date:: 2023-05-10 #$ - * @brief This file provides all the PGA firmware functions. (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief This file provides all the PGA firmware functions. ************************************************************************************************************* * @attention * @@ -37,8 +37,654 @@ * @{ */ +/* Private constants ---------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Private_Define PGA private definitions + * @{ + */ +#define PGA_ENABLE (0x00000001ul) +#define CR_REF_POS 10 +#define CR_HVDDA_POS 8 +#define CR_OUTPUT_HIGH (1) +#define CR_OUTPUT_POS 7 + +#define CR_GAIN_POS 4 +#define CR_GAIN_MASK (0x7ul << CR_GAIN_POS) + +#define CR_NE_POS 3 + +#define CR_PGA_POS 2 + +#define CR_NUG_POS 1 + +#define VOS_OFM_CALIBRATION_MODE (1) +#define VOS_OFM_POS 7 + +#define VOS_RSP_POS 6 + +#define VOS_OF_DEFAULT_VALUE (0x10) +#define VOS_OF_POS 0 +#define VOS_OF_MASK (0x1Ful << VOS_OF_POS) + +#define VR_VFEN_SET ((u32)0x00000001) +#define VR_VFEN_RESET ((u32)0xFFFFFFFE) + +#define PGA0_OF_WITH_CALIBRATION 0x1 +#define PGA1_OF_WITH_CALIBRATION 0x2 +#define PGA2_OF_WITH_CALIBRATION 0x4 +#define PGA3_OF_WITH_CALIBRATION 0x8 +/** + * @} + */ +/* Private macro -------------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Private_Macro PGA private macros + * @{ + */ +#define IS_PGA0(x) (x == HT_PGA0) +#if (LIBCFG_PGA1) +#define IS_PGA1(x) (x == HT_PGA1) +#else +#define IS_PGA1(x) (0) +#endif +#if (LIBCFG_PGA2) +#define IS_PGA2(x) (x == HT_PGA2) +#else +#define IS_PGA2(x) (0) +#endif +#if (LIBCFG_PGA3) +#define IS_PGA3(x) (x == HT_PGA3) +#else +#define IS_PGA3(x) (0) +#endif +#define IS_PGA(x) (IS_PGA0(x) || \ + IS_PGA1(x) || \ + IS_PGA2(x) || \ + IS_PGA3(x)) + +#define IS_PGA_HVDDA_OPTION(x) ((x == PGA_HVDDA_DISABLE) || \ + (x == PGA_HVDDA_RESISTOR) || \ + (x == PGA_HVDDA_POS_INPUT)) + +#define IS_PGA_GAIN(x) ((x == PGA_GAIN_LEVEL_0) || \ + (x == PGA_GAIN_LEVEL_1) || \ + (x == PGA_GAIN_LEVEL_2) || \ + (x == PGA_GAIN_LEVEL_3) || \ + (x == PGA_GAIN_LEVEL_4) || \ + (x == PGA_GAIN_LEVEL_5)) + +#define IS_PGA_INPUT(x) ((x == PGA_INPUT_NEGATIVE) || \ + (x == PGA_INPUT_POSITIVE)) + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------------------------------------*/ +static u32 gPGAUnProtectKey = 0; +static vu32 gPGACaliValInit = 0; + +/* Global functions ----------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Exported_Functions PGA exported functions + * @{ + */ +/*********************************************************************************************************//** + * @brief Deinitialize the PGA peripheral registers to their default reset values. + * @retval None + ************************************************************************************************************/ +void PGA_DeInit(void) +{ + RSTCU_PeripReset_TypeDef RSTCUReset = {{0}}; + + RSTCUReset.Bit.PGA = 1; + RSTCU_PeripReset(RSTCUReset, ENABLE); + + gPGACaliValInit = 0; +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the specified PGA peripheral. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None +*************************************************************************************************************/ +void PGA_Cmd(HT_PGA0_X_TypeDef* HT_PGAn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + HT_PGAn->CR = gPGAUnProtectKey; + + if (NewState != DISABLE) + { + /* Enable the selected HT_PGAn peripheral */ + HT_PGAn->CR |= PGA_ENABLE; + } + else + { + /* Disable the selected HT_PGAn peripheral */ + HT_PGAn->CR &= ~(u32)PGA_ENABLE; + } +} + +/*********************************************************************************************************//** + * @brief Set the unprotect key. + * @param uUnProtectKey: protect key, shall be PGA_UNPROTECT_KEY + * @retval None + ************************************************************************************************************/ +void PGA_SetUnProtectKey(u32 uUnProtectKey) +{ + gPGAUnProtectKey = uUnProtectKey << 16; +} + +/*********************************************************************************************************//** + * @brief Protect the selected PGA before setting the PGA Control Register. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None + ************************************************************************************************************/ +void PGA_ProtectConfig(HT_PGA0_X_TypeDef* HT_PGAn) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + /* Write any value to bit 16 ~ 31 (PROTECT) and keep the other control bit */ + HT_PGAn->CR = HT_PGAn->CR; +} + +/*********************************************************************************************************//** + * @brief Unprotect the selected PGA before setting the PGA Control Register. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None + ************************************************************************************************************/ +void PGA_UnprotectConfig(HT_PGA0_X_TypeDef* HT_PGAn) +{ + u32 CRValue; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + /* Set the unlock code corresponding to selected PGA */ + CRValue = HT_PGAn->CR & 0x0000FFFF; + HT_PGAn->CR = gPGAUnProtectKey | CRValue; +} + +/*********************************************************************************************************//** + * @brief Initialize the PGA peripheral according to the specified parameters in the PGA_InitStruct. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_InitStruct: pointer to a PGA_InitTypeDef structure. + * @retval None + ************************************************************************************************************/ +void PGA_Init(HT_PGA0_X_TypeDef* HT_PGAn, PGA_InitTypeDef* PGA_InitStruct) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_HVDDA_OPTION(PGA_InitStruct->PGA_HVDDA)); + + /* According to the HT_PGAn calibration value flag, initialize the calibration value to 0x10 if needed. */ + if((HT_PGAn == HT_PGA0) && !(gPGACaliValInit & PGA0_OF_WITH_CALIBRATION)) + { + HT_PGA0->VOS = 0x00000090; + HT_PGA0->VOS &= 0xFFFFFF7F; + } + #if (LIBCFG_PGA1) + else if((HT_PGAn == HT_PGA1) && !(gPGACaliValInit & PGA1_OF_WITH_CALIBRATION)) + { + HT_PGA1->VOS = 0x00000090; + HT_PGA1->VOS &= 0xFFFFFF7F; + } + #endif + #if (LIBCFG_PGA2) + else if((HT_PGAn == HT_PGA2) && !(gPGACaliValInit & PGA2_OF_WITH_CALIBRATION)) + { + HT_PGA2->VOS = 0x00000090; + HT_PGA2->VOS &= 0xFFFFFF7F; + } + #endif + #if (LIBCFG_PGA3) + else if((HT_PGAn == HT_PGA3) && !(gPGACaliValInit & PGA3_OF_WITH_CALIBRATION)) + { + HT_PGA3->VOS = 0x00000090; + HT_PGA3->VOS &= 0xFFFFFF7F; + } + #endif + + HT_PGAn->CR = gPGAUnProtectKey; + + HT_PGAn->CR = (u32)PGA_InitStruct->PGA_REF << CR_REF_POS | \ + (u32)PGA_InitStruct->PGA_NUG << CR_NUG_POS | \ + (u32)PGA_InitStruct->PGA_NE << CR_NE_POS | \ + (u32)PGA_InitStruct->PGA_PGA << CR_PGA_POS | \ + (u32)PGA_InitStruct->PGA_HVDDA << CR_HVDDA_POS; +} + +/*********************************************************************************************************//** + * @brief Fill each PGA_InitStruct member with its default value. + * @param PGA_InitStruct: pointer to an PGA_InitTypeDef structure. + * @retval None + ************************************************************************************************************/ +void PGA_StructInit(PGA_InitTypeDef* PGA_InitStruct) +{ + /* PGA_InitStruct members default value */ + PGA_InitStruct->PGA_REF = DISABLE; + PGA_InitStruct->PGA_NUG = DISABLE; + PGA_InitStruct->PGA_NE = DISABLE; + PGA_InitStruct->PGA_PGA = DISABLE; + PGA_InitStruct->PGA_HVDDA = PGA_HVDDA_DISABLE; +} + +/*********************************************************************************************************//** + * @brief Configure the Gain for the selected PGA Control Register. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_LEVEL_x: Where PGA_GAIN_LEVEL_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_LEVEL_0 + * @arg PGA_GAIN_LEVEL_1 + * @arg PGA_GAIN_LEVEL_2 + * @arg PGA_GAIN_LEVEL_3 + * @arg PGA_GAIN_LEVEL_4 + * @arg PGA_GAIN_LEVEL_5 + * @retval None + ************************************************************************************************************/ +void PGA_GainConfig(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x) +{ + u32 CRValue; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_LEVEL_x)); + + CRValue = HT_PGAn->CR & 0x0000FFFF; + CRValue &= ~CR_GAIN_MASK; + + HT_PGAn->CR = gPGAUnProtectKey; + HT_PGAn->CR = ((u32)PGA_GAIN_LEVEL_x << CR_GAIN_POS) | CRValue; +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the PGAHVDDA Voltage Follower. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None +*************************************************************************************************************/ +void PGA_HVDDACmd(ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if(NewState != DISABLE) + { + /* Enable the selected HT_PGAn peripheral */ + HT_PGA->VR |= (u32)VR_VFEN_SET; + } + else + { + /* Disable the selected HT_PGAn peripheral */ + HT_PGA->VR &= (u32)VR_VFEN_RESET; + } +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the Calibration mode. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None +*************************************************************************************************************/ +void PGA_CalibrationCmd(HT_PGA0_X_TypeDef* HT_PGAn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if(NewState != DISABLE) + { + HT_PGAn->VOS |= (u32)VOS_OFM_CALIBRATION_MODE << VOS_OFM_POS; + /* + Set the HT_PGAn calibration value flag to true to ensure that the calibration value does not change + after executing calibration. + */ + if(HT_PGAn == HT_PGA0) + { + gPGACaliValInit |= PGA0_OF_WITH_CALIBRATION; + } + #if (LIBCFG_PGA1) + else if(HT_PGAn == HT_PGA1) + { + gPGACaliValInit |= PGA1_OF_WITH_CALIBRATION; + } + #endif + #if (LIBCFG_PGA2) + else if(HT_PGAn == HT_PGA2) + { + gPGACaliValInit |= PGA2_OF_WITH_CALIBRATION; + } + #endif + #if (LIBCFG_PGA3) + else if(HT_PGAn == HT_PGA3) + { + gPGACaliValInit |= PGA3_OF_WITH_CALIBRATION; + } + #endif + } + else + { + HT_PGAn->VOS &= ~((u32)VOS_OFM_CALIBRATION_MODE << VOS_OFM_POS); + } +} + +/*********************************************************************************************************//** + * @brief Configure the direction of Calibration reference pins. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_INPUT_x: where PGA_INPUT_x is the calibration reference. + * This parameter can be one of the following values: + * @arg PGA_INPUT_NEGATIVE + * @arg PGA_INPUT_POSITIVE + * @retval None +*************************************************************************************************************/ +void PGA_SetCalibrationInput(HT_PGA0_X_TypeDef* HT_PGAn, PGA_CALIBRATION_INPUT_Enum PGA_INPUT_x) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_INPUT(PGA_INPUT_x)); + + if(PGA_INPUT_x == PGA_CALIBRATION_INPUT_NEGATIVE) + { + PGA_UnprotectConfig(HT_PGAn); + HT_PGAn->CR |= (u32)ENABLE << CR_NE_POS; + HT_PGAn->VOS &= ~((u32)ENABLE << VOS_RSP_POS); + } + else + { + HT_PGAn->VOS |= (u32)ENABLE << VOS_RSP_POS; + } +} + +/*********************************************************************************************************//** + * @brief Configure the calibration value. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param Value: the calibration value. + * @retval None +*************************************************************************************************************/ +void PGA_SetCalibrationValue(HT_PGA0_X_TypeDef* HT_PGAn, u32 Value) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + HT_PGAn->VOS = (HT_PGAn->VOS & ~(u32)(VOS_OF_MASK)) | Value; +} + +/*********************************************************************************************************//** + * @brief Check whether the specified PID flag has been set. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None +*************************************************************************************************************/ +FlagStatus PGA_ReadOutputBit(HT_PGA0_X_TypeDef* HT_PGAn) +{ + FlagStatus Status; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + if ((HT_PGAn->CR & ((u32)CR_OUTPUT_HIGH << CR_OUTPUT_POS)) != RESET) + { + Status = SET; + } + else + { + Status = RESET; + } + + return Status; +} + +/*********************************************************************************************************//** + * @brief Set Inverting Amplifier Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_x: Where PGA_GAIN_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_6 + * @arg PGA_GAIN_8 + * @arg PGA_GAIN_12 + * @arg PGA_GAIN_16 + * @arg PGA_GAIN_24 + * @arg PGA_GAIN_32 + * @retval None + * @note Model configuration must follow the rules below: + * Inverting Amplifier Mode : The positive input must be grounded. + ************************************************************************************************************/ +void PGA_SetModeInverting(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_x)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_x); +} + +/*********************************************************************************************************//** + * @brief Set the Differentiator Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_LEVEL_x: Where PGA_GAIN_LEVEL_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_LEVEL_0 + * @arg PGA_GAIN_LEVEL_1 + * @arg PGA_GAIN_LEVEL_2 + * @arg PGA_GAIN_LEVEL_3 + * @arg PGA_GAIN_LEVEL_4 + * @arg PGA_GAIN_LEVEL_5 + * @retval None + * @note Model configuration must follow the rules below: + * Differentiator : The positive input must have an external capacitor and be grounded. + ************************************************************************************************************/ +void PGA_SetModeDifferentiator(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_LEVEL_x)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_LEVEL_x); +} + +/*********************************************************************************************************//** + * @brief Set the Non-Inverting Amplifier Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_x: Where PGA_GAIN_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_6 + * @arg PGA_GAIN_8 + * @arg PGA_GAIN_12 + * @arg PGA_GAIN_16 + * @arg PGA_GAIN_24 + * @arg PGA_GAIN_32 + * @retval None + ************************************************************************************************************/ +void PGA_SetModeNonInverting(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_x)); + + PGA_InitStruct.PGA_REF = DISABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_x); +} + +/*********************************************************************************************************//** + * @brief Set the Inverting Adder Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_LEVEL_x: Where PGA_GAIN_LEVEL_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_LEVEL_0 + * @arg PGA_GAIN_LEVEL_1 + * @arg PGA_GAIN_LEVEL_2 + * @arg PGA_GAIN_LEVEL_3 + * @arg PGA_GAIN_LEVEL_4 + * @arg PGA_GAIN_LEVEL_5 + * @retval None + * @note Model configuration must follow the rules below: + * Inverting Adder Mode : The positive input must be grounded. + * The negative input must be voltage divider. + ************************************************************************************************************/ +void PGA_SetModeInvertingAdder(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_LEVEL_x)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = ENABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_LEVEL_x); +} + +/*********************************************************************************************************//** + * @brief Set the Exponent Amplifier Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_LEVEL_x: Where PGA_GAIN_LEVEL_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_LEVEL_0 + * @arg PGA_GAIN_LEVEL_1 + * @arg PGA_GAIN_LEVEL_2 + * @arg PGA_GAIN_LEVEL_3 + * @arg PGA_GAIN_LEVEL_4 + * @arg PGA_GAIN_LEVEL_5 + * @retval None + * @note Model configuration must follow the rules below: + * Exponent Amplifier Mode : The positive input must be grounded. + * The negative input must have an external diode. + ************************************************************************************************************/ +void PGA_SetModeExponent(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_LEVEL_x)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = ENABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_LEVEL_x); +} + +/*********************************************************************************************************//** + * @brief Set the Manual Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None + * @note This mode prototype is a voltage follower, and the following modes can be used + * with external components: + * Peak Detector + * Active Filter + * R-2R D/A conversion circuit (+) + ************************************************************************************************************/ +void PGA_SetModeManual(HT_PGA0_X_TypeDef* HT_PGAn) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = ENABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = DISABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); +} + +/*********************************************************************************************************//** + * @brief Set the Non-Inverting Adder Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_x: Where PGA_GAIN_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_6 + * @arg PGA_GAIN_8 + * @arg PGA_GAIN_12 + * @arg PGA_GAIN_16 + * @arg PGA_GAIN_24 + * @arg PGA_GAIN_32 + * @retval None + * @note Model configuration must follow the rules below: + * Non-Inverting Adder : The positive input must be voltage divider. + * The negative input must be grounded. + ************************************************************************************************************/ +void PGA_SetModeNonInvertingAdder(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_x)); + + PGA_InitStruct.PGA_REF = DISABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_x); +} + +/*********************************************************************************************************//** + * @brief Set the Comparator Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None + ************************************************************************************************************/ +void PGA_SetModeComparator(HT_PGA0_X_TypeDef* HT_PGAn) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + PGA_InitStruct.PGA_REF = DISABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = ENABLE; + PGA_InitStruct.PGA_PGA = DISABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); +} + +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c index 724e166fbe..ab3b316067 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f66xxx_cordic.c - * @version $Rev:: 6914 $ - * @date $Date:: 2023-05-10 #$ - * @brief This file provides all the CORDIC firmware functions. (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief This file provides all the CORDIC firmware functions. ************************************************************************************************************* * @attention * @@ -38,7 +38,189 @@ */ +/* Private constants ---------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Private_Define CORDIC private definitions + * @{ + */ +#define IS_CORDIC_FUNCTION(__FUNCTION__) (((__FUNCTION__) == CORDIC_FUNCTION_COSINE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_SINE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_PHASE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_MODULUS) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_ARCTANGENT) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_HCOSINE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_HSINE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_HARCTANGENT) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_NATURALLOG) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_SQUAREROOT) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_ROTATIONMATRIX) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_INTEGERMODULUS) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_INTEGERSQUAREROOT)) +#define IS_CORDIC_PRECISION(__PRECISION__) (((__PRECISION__) == CORDIC_PRECISION_1CYCLE) || \ + ((__PRECISION__) == CORDIC_PRECISION_2CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_3CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_4CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_5CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_6CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_7CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_8CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_9CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_10CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_11CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_12CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_13CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_14CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_15CYCLES)) + + +#define IS_CORDIC_SCALE(__SCALE__) (((__SCALE__) == CORDIC_SCALE_0) || \ + ((__SCALE__) == CORDIC_SCALE_1) || \ + ((__SCALE__) == CORDIC_SCALE_2) || \ + ((__SCALE__) == CORDIC_SCALE_3) || \ + ((__SCALE__) == CORDIC_SCALE_4) || \ + ((__SCALE__) == CORDIC_SCALE_5) || \ + ((__SCALE__) == CORDIC_SCALE_6) || \ + ((__SCALE__) == CORDIC_SCALE_7)) + +#define IS_CORDIC_PDMA_REQ(REQ) (((REQ & 0xFFF9FFFF) == 0x0) && (REQ != 0x0)) + +#define IS_CORDIC_NBWRITE(__NBWRITE__) (((__NBWRITE__) == CORDIC_NBWRITE_1) || \ + ((__NBWRITE__) == CORDIC_NBWRITE_2) || \ + ((__NBWRITE__) == CORDIC_NBWRITE_3)) + +#define IS_CORDIC_NBREAD(__NBREAD__) (((__NBREAD__) == CORDIC_NBREAD_1) || \ + ((__NBREAD__) == CORDIC_NBREAD_2)) + +#define IS_CORDIC_INSIZE(__INSIZE__) (((__INSIZE__) == CORDIC_INSIZE_32BITS) || \ + ((__INSIZE__) == CORDIC_INSIZE_16BITS)) + +#define IS_CORDIC_OUTSIZE(__OUTSIZE__) (((__OUTSIZE__) == CORDIC_OUTSIZE_32BITS) || \ + ((__OUTSIZE__) == CORDIC_OUTSIZE_16BITS)) +/** + * @} + */ + +/* Global functions ----------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Exported_Functions CORDIC exported functions + * @{ + */ +/*********************************************************************************************************//** + * @brief Deinitialize the CORDIC peripheral registers to their default reset values. + * @retval None + ************************************************************************************************************/ +void CORDIC_DeInit(void) +{ + RSTCU_PeripReset_TypeDef RSTCUReset = {{0}}; + + RSTCUReset.Bit.CORDIC = 1; + RSTCU_PeripReset(RSTCUReset, ENABLE); +} + +/*********************************************************************************************************//** + * @brief Initialize the CORDIC peripheral according to the specified parameters in the CORDIC_InitStruct. + * @param CORDIC_InitStruct: pointer to a CORDIC_InitTypeDef structure. + * @retval None + ************************************************************************************************************/ +void CORDIC_Init(CORDIC_InitTypeDef *CORDIC_InitStruct) +{ + /* Check the parameters */ + Assert_Param(IS_CORDIC_FUNCTION(CORDIC_InitStruct->Function)); + Assert_Param(IS_CORDIC_PRECISION(CORDIC_InitStruct->Precision)); + Assert_Param(IS_CORDIC_SCALE(CORDIC_InitStruct->Scale)); + Assert_Param(IS_CORDIC_NBWRITE(CORDIC_InitStruct->NbWrite)); + Assert_Param(IS_CORDIC_NBREAD(CORDIC_InitStruct->NbRead)); + Assert_Param(IS_CORDIC_INSIZE(CORDIC_InitStruct->InSize)); + Assert_Param(IS_CORDIC_OUTSIZE(CORDIC_InitStruct->OutSize)); + + HT_CORDIC->CSR &= ~(CORDIC_CSR_FUNC_MASK | CORDIC_CSR_PRECISION_MASK | CORDIC_CSR_SCALE_MASK | \ + CORDIC_CSR_NRES_MASK | CORDIC_CSR_NARGS_MASK | CORDIC_CSR_RESSIZE_MASK | CORDIC_CSR_ARGSIZE_MASK); + + HT_CORDIC->CSR |= (CORDIC_InitStruct->Function | CORDIC_InitStruct->Precision | CORDIC_InitStruct->Scale | \ + CORDIC_InitStruct->NbWrite | CORDIC_InitStruct->NbRead | CORDIC_InitStruct->InSize | CORDIC_InitStruct->OutSize); +} + +/*********************************************************************************************************//** + * @brief Enable or Disable CORDIC result ready interrupt. (RRDY) + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void CORDIC_IntCmd(ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_CORDIC->CSR |= CORDIC_CSR_IEN; + } + else + { + HT_CORDIC->CSR &= ~CORDIC_CSR_IEN; + } +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the CORDIC PDMA interface. + * @param CORDIC_DMA: specify the CORDIC PDMA transfer request to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg CORDIC_DMA_REN: Read PDMA transfer request + * @arg CORDIC_DMA_WEN: Write PDMA transfer request + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void CORDIC_PDMACmd(u32 CORDIC_DMA, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_CORDIC_PDMA_REQ(CORDIC_DMA)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_CORDIC->CSR |= CORDIC_DMA; + } + else + { + HT_CORDIC->CSR &= ~CORDIC_DMA; + } +} + +/*********************************************************************************************************//** + * @brief Check CORDIC result ready flag state. (RRDY) + * @retval SET or RESET + ************************************************************************************************************/ +FlagStatus CORDIC_GetFlagStatus_RRDY(void) +{ + if ((HT_CORDIC->CSR & CORDIC_FLAG_RRDY) != (u32)RESET) + { + return (SET); + } + else + { + return (RESET); + } +} + +/*********************************************************************************************************//** + * @brief Write 32-bit input data for the CORDIC processing. + * @param InData: 32-bit value to be provided as input data for CORDIC processing. + * @retval None + ************************************************************************************************************/ +void CORDIC_WriteData(u32 InData) +{ + HT_CORDIC->WDATA = InData; +} + +/*********************************************************************************************************//** + * @brief Return 32-bit output data of CORDIC processing. + * @retval 32-bit output data of CORDIC processing. + ************************************************************************************************************/ +u32 CORDIC_ReadData(void) +{ + return (u32)HT_CORDIC->RDATA; +} +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_pid.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_pid.c index d956f5fcf9..ad68960888 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_pid.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_pid.c @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f66xxx_pid.c - * @version $Rev:: 6914 $ - * @date $Date:: 2023-05-10 #$ - * @brief This file provides all the PID firmware functions. (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief This file provides all the PID firmware functions. ************************************************************************************************************* * @attention * @@ -37,8 +37,301 @@ * @{ */ +/* Global functions ----------------------------------------------------------------------------------------*/ +/** @addtogroup PID_Exported_Functions PID exported functions + * @{ + */ +/*********************************************************************************************************//** + * @brief Deinitialize the HT_PIDn peripheral registers to their default reset values. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @retval None + ************************************************************************************************************/ +void PID_DeInit(HT_PID_TypeDef* HT_PIDn) +{ + RSTCU_PeripReset_TypeDef RSTCUReset = {{0}}; + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + if (HT_PIDn == HT_PID0) + { + RSTCUReset.Bit.PID0 = 1; + } + + RSTCU_PeripReset(RSTCUReset, ENABLE); +} + +/*********************************************************************************************************//** + * @brief Initialize the HT_PIDn PID_Mode peripheral according to the specified parameters in the PID_InitTypeDef. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_Mode: where PID_Mode is the selected PID mode. + * This parameter can be one of the following values: + * @arg PID_SPD_MODE + * @arg PID_IQ_MODE + * @arg PID_ID_MODE + * @arg PID_FWNK_MODE + * @arg PID_PLL_MODE + * @arg PID_USR_MODE + * @param PID_Para: where PID_Para is PID paramater structure. + * @retval None + ************************************************************************************************************/ +void PID_Init(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode, PID_InitTypeDef* PID_Para) +{ + HT_PIDPARA_TypeDef * gPID_ModePara = &(HT_PIDn->SPD); + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_MODE(PID_Mode)); + + (gPID_ModePara + PID_Mode)->KPIR = PID_Para->KP; + (gPID_ModePara + PID_Mode)->KIIR = PID_Para->KI; + (gPID_ModePara + PID_Mode)->KDIR = PID_Para->KD; + (gPID_ModePara + PID_Mode)->IFVMAXLR = PID_Para->UI_MAX; + (gPID_ModePara + PID_Mode)->IFVMINLR = PID_Para->UI_MIN; + (gPID_ModePara + PID_Mode)->PIDORLR = (u32)((PID_Para->OUT_MAX << 16) | ((u16)PID_Para->OUT_MIN)); + (gPID_ModePara + PID_Mode)->LEIR = PID_Para->ERRn_1; + (gPID_ModePara + PID_Mode)->LIFVR = PID_Para->UIn_1; +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the specified PID interrupts. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_INT_x: Specify the PID interrupt sources that is to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg PID_INT_CMP : + * @arg PID_INT_OVF : + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void PID_IntConfig(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_INT(PID_INT_x)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_PIDn->CR |= PID_INT_x; + } + else + { + HT_PIDn->CR &= ~PID_INT_x; + } +} + +/*********************************************************************************************************//** + * @brief Check whether the specified PID interrupt has occurred. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_INT_x: Specify the PID interrupt sources that is to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg PID_INT_CMP : + * @arg PID_INT_OVF : + * @retval SET or RESET + ************************************************************************************************************/ +FlagStatus PID_GetIntStatus(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x) +{ + FlagStatus Status; + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_INT(PID_INT_x)); + + if ((HT_PIDn->CR & (PID_INT_x << PID_INT_Status_Pos)) != RESET) + { + Status = SET; + } + else + { + Status = RESET; + } + + return Status; +} + +/*********************************************************************************************************//** + * @brief Clear the PID interrupt pending bits. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_INT_x: Specify the PID interrupt sources that is to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg PID_INT_CMP : + * @arg PID_INT_OVF : + * @retval None + ************************************************************************************************************/ +void PID_ClearIntPendingBit(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_INT(PID_INT_x)); + + HT_PIDn->CR |= (PID_INT_x << PID_INT_Clear_Pos); +} + +/*********************************************************************************************************//** + * @brief Set the PID ERR(n) value of the common parameters. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param ERRn: where ERRn is PID Controller Error Input Value. + * @retval None + ************************************************************************************************************/ +void PID_SetComPara_ERRn(HT_PID_TypeDef* HT_PIDn, s32 ERRn) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + + HT_PIDn->EIVR = ERRn; +} + +/*********************************************************************************************************//** + * @brief Set the PID UI_input(n) value of the common parameters. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param UI_Input: where UI_Input is PID Controller integrator accumulation selection. + * @retval None + ************************************************************************************************************/ +void PID_SetComPara_UI_Input(HT_PID_TypeDef* HT_PIDn, s32 UI_Input) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + + HT_PIDn->IFIVR = UI_Input; +} + +/*********************************************************************************************************//** + * @brief Enable compute the PID calculation. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_Mode: where PID_Mode is the selected PID mode. + * This parameter can be one of the following values: + * @arg PID_SPD_MODE + * @arg PID_IQ_MODE + * @arg PID_ID_MODE + * @arg PID_FWNK_MODE + * @arg PID_PLL_MODE + * @arg PID_USR_MODE + * @retval None + ************************************************************************************************************/ +void PID_Compute(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_MODE(PID_Mode)); + + HT_PIDn->CR &= ~(u32)PID_CR_MODSEL_Msk; + HT_PIDn->CR |= (PID_Mode << PID_CR_MODSEL_Pos) | (PID_CR_PIDEN); +} + +/*********************************************************************************************************//** + * @brief Return the PID ouput result value. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @retval The Value of PID result. + ************************************************************************************************************/ +s16 PID_GetOutResult(HT_PID_TypeDef* HT_PIDn) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + + return HT_PIDn->ORR; +} + +/*********************************************************************************************************//** + * @brief Check whether the specified PID flag has been set. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_FLAG_x: Specify the flag to check. + * This parameter can be any combination of the following values: + * @arg PID_FLAG_CMP : + * @arg PID_FLAG_OVF : + * @retval SET or RESET + ************************************************************************************************************/ +FlagStatus PID_GetFlagStatus(HT_PID_TypeDef* HT_PIDn, u32 PID_FLAG_x) +{ + FlagStatus Status; + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_FLAG(PID_FLAG_x)); + + if ((HT_PIDn->CR & PID_FLAG_x) != RESET) + { + Status = SET; + } + else + { + Status = RESET; + } + + return Status; +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the integrator accumulation value set by UI_input(n). + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void PID_UI_InputCmd(HT_PID_TypeDef* HT_PIDn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_PIDn->CR |= PID_CR_UIF; + } + else + { + HT_PIDn->CR &= ~(u32)PID_CR_UIF; + } +} + +/*********************************************************************************************************//** + * @brief Return the PID last error input value (ERRn_1) for the selected PID mode. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_Mode: where PID_Mode is the selected PID mode. + * This parameter can be one of the following values: + * @arg PID_SPD_MODE + * @arg PID_IQ_MODE + * @arg PID_ID_MODE + * @arg PID_FWNK_MODE + * @arg PID_PLL_MODE + * @arg PID_USR_MODE + * @retval The Value of ERRn_1 for the selected PID mode. + ************************************************************************************************************/ +s32 PID_GetERRn_1(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode) +{ + HT_PIDPARA_TypeDef * gPID_ModePara = &(HT_PIDn->SPD); + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_MODE(PID_Mode)); + + return (gPID_ModePara + PID_Mode)->LEIR; +} + +/*********************************************************************************************************//** + * @brief Return the PID last integral function value (UIn_1) for the selected PID mode. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_Mode: where PID_Mode is the selected PID mode. + * This parameter can be one of the following values: + * @arg PID_SPD_MODE + * @arg PID_IQ_MODE + * @arg PID_ID_MODE + * @arg PID_FWNK_MODE + * @arg PID_PLL_MODE + * @arg PID_USR_MODE + * @retval The Value of UIn_1 for the selected PID mode. + ************************************************************************************************************/ +s32 PID_GetUIn_1(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode) +{ + HT_PIDPARA_TypeDef * gPID_ModePara = &(HT_PIDn->SPD); + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_MODE(PID_Mode)); + return (gPID_ModePara + PID_Mode)->LIFVR; +} + +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/ht32_drivers/SConscript b/bsp/ht32/libraries/ht32_drivers/SConscript index f3c00c8aab..86ba719ad9 100644 --- a/bsp/ht32/libraries/ht32_drivers/SConscript +++ b/bsp/ht32/libraries/ht32_drivers/SConscript @@ -34,6 +34,15 @@ if GetDepend(['BSP_USING_ADC']): if GetDepend(['BSP_USING_WDT']): src += ['drv_wdt.c'] + +if GetDepend(['BSP_USING_CAN']): + src += ['drv_can.c'] + +if GetDepend(['BSP_USING_SDIO']): + src += ['drv_sdio.c'] + +if GetDepend(['BSP_USING_USBD']): + src += ['drv_usbd.c'] #创建一个列表,用于保存需要包含的H文件路径 path = [cwd] diff --git a/bsp/ht32/libraries/ht32_drivers/cpuport.h b/bsp/ht32/libraries/ht32_drivers/cpuport.h new file mode 100644 index 0000000000..05bb12cf2f --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/cpuport.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#ifndef CPUPORT_H__ +#define CPUPORT_H__ + +#ifdef RT_USING_SMP +typedef union { + unsigned long slock; + struct __arch_tickets { + unsigned short owner; + unsigned short next; + } tickets; +} rt_hw_spinlock_t; +#endif + +#endif /*CPUPORT_H__*/ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_can.c b/bsp/ht32/libraries/ht32_drivers/drv_can.c new file mode 100644 index 0000000000..2c6db98f73 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_can.c @@ -0,0 +1,673 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-08-22 QT-one first version + */ + +#include +#include "drv_can.h" +#include "ht32_can_config.h" + +#ifdef BSP_USING_CAN +#if !defined(BSP_USING_CAN) + #error "Please define at least one BSP_USING_CAN" +#endif + +#define CAN_UMASK_MODE 0 +#define CAN_MASK_MODE 1 + +struct ht32_can_msg_type +{ + CAN_MSG_TypeDef cfg_msg; + uint32_t data_len; + uint8_t data[8]; +}; + +/* Baud rate mapping structure */ +struct ht32_baud_rate +{ + enum CANBAUD rt_baud_rate; + uint32_t us_baus_rate; +}; +/* CAN Filter Table Configuration Structure */ +struct ht32_can_filter_config +{ + /* Each bit represents a message;1: the message is occupied;0: the message is not occupied */ + uint32_t filter_flag; + /* Filter table configuration information */ + CAN_MSG_TypeDef filter_mag[MSG_OBJ_TOTAL_NUM]; +}; +/* CAN Object Structures */ +struct ht32_can +{ + char *name; /* Equipment name */ + HT_CAN_TypeDef *can_x; /* peripheral base address */ + struct can_configure cfg; /* CAN Configuration Structure */ + struct rt_can_device device; /* Inherited device options */ + struct ht32_can_filter_config filter_cfg; /* Filter Table Configuration */ +}; +/* CAN Baud Rate Mapping Table */ +static const struct ht32_baud_rate can_baud_rate_tab[] = +{ + {CAN1MBaud, 1000000}, + {CAN800kBaud, 800000}, + {CAN500kBaud, 500000}, + {CAN250kBaud, 250000}, + {CAN125kBaud, 125000}, + {CAN100kBaud, 100000}, + {CAN50kBaud, 50000}, + {CAN20kBaud, 20000}, + {CAN10kBaud, 10000}, +}; +/* CAN Object Information */ +static struct ht32_can ht32_can_config = +{ + .name = BSP_USING_CAN_NAME, + .can_x = HT_CAN0, + .cfg = {0}, + .device = RT_NULL, + .filter_cfg = {0}, +}; +/** + * @brief Default Filter Table Configuration + * @param can_instance:CAN object + * @retval + */ +static rt_uint32_t cfg_can_default_filter(struct ht32_can *can_instance) +{ + uint8_t filter_num = BSP_USING_CAN_MSG_NUM; + can_instance->filter_cfg.filter_flag |= 1 << filter_num; + can_instance->filter_cfg.filter_mag[filter_num].MsgNum = filter_num + 1; + can_instance->filter_cfg.filter_mag[filter_num].IdType = (CAN_IdType_Enum)BSP_USING_CAN_ID_MODE; + can_instance->filter_cfg.filter_mag[filter_num].IdMask = BSP_USING_CAN_MASK; + can_instance->filter_cfg.filter_mag[filter_num].FrameType = (CAN_FrameType_Enum)BSP_USING_CAN_FRAME_MODE; + can_instance->filter_cfg.filter_mag[filter_num].Id = BSP_USING_CAN_ID; + CAN_SetRxMsg(can_instance->can_x, &can_instance->filter_cfg.filter_mag[filter_num], 1); + return RT_EOK; +} +/** + * @brief Get baud rate mapping parameters for CAN + * @info This function is mainly used to convert the baud rate of RTT format to HT32 format baud rate + * @param baud:CAN baud rate in RTT format + * @retval Returns the CAN baud rate in HT32 format. + */ +static rt_uint32_t get_can_baud_index(rt_uint32_t baud) +{ + rt_uint32_t len, index; + + len = sizeof(can_baud_rate_tab) / sizeof(can_baud_rate_tab[0]); + for (index = 0; index < len; index++) + { + if (can_baud_rate_tab[index].rt_baud_rate == baud) + return can_baud_rate_tab[index].us_baus_rate; + } + return 0; +} +/** + * @brief Configuring CAN Structures + * @info This function depends on the ht32_can_config.h file + * @param can_ck:System clock for CAN + * @param can_buad:CAN baud rate to be configured + * @param mode:Modes of CAN + * @param nart:enable or disable the no automatic retransmission + * @param CAN_InitStruct:Structures to be configured + * @retval 1:success;0:error + */ +static rt_uint32_t config_can_struct(uint32_t can_ck, + uint32_t can_buad, + uint8_t mode, + ControlStatus nart, + CAN_InitTypeDef* CAN_InitStruct) +{ + uint8_t cf0_nbt = 0; + uint32_t nominal_bit_time = 0; + + for (cf0_nbt = 25; cf0_nbt > 8; cf0_nbt--) + { + if ((can_ck / can_buad / cf0_nbt) > 0) + { + if (((can_ck / (can_ck / can_buad / cf0_nbt)) / cf0_nbt) <= can_buad) + { + nominal_bit_time = cf0_nbt; + break; + } + } + } + if (cf0_nbt < 8) + { + return 0; + } + CAN_InitStruct->CAN_BRPrescaler = (can_ck / (can_buad * nominal_bit_time)); + CAN_InitStruct->CAN_SJW = HTCFG_CAN_CF0_BIT_TIME_SJW; + CAN_InitStruct->CAN_TSEG1 = (nominal_bit_time - (nominal_bit_time * HTCFG_CAN_CF0_SAMPLE_POINT) / 100); + CAN_InitStruct->CAN_TSEG0 = (nominal_bit_time - 1 - CAN_InitStruct->CAN_TSEG1); + CAN_InitStruct->CAN_NART = nart; + CAN_InitStruct->CAN_Mode = mode; + return 1; +} +/** + * @brief CAN Configuration Functions + * @param + * @retval + */ +static rt_err_t ht32_can_configure(struct rt_can_device *can, struct can_configure *cfg) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + struct ht32_can *can_instance = RT_NULL; + rt_uint32_t can_baud = 0; + rt_uint8_t can_mode = 0; + CAN_InitTypeDef CAN_InitStruct = {0}; + + RT_ASSERT(can); + RT_ASSERT(cfg); + can_instance = (struct ht32_can *)can->parent.user_data; + RT_ASSERT(can_instance != RT_NULL); + + CKCUClock.Bit.AFIO = 1; + CKCUClock.Bit.CAN0 = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + ht32_can_gpio_init(can_instance->can_x); + + /* Get baud rate */ + can_baud = get_can_baud_index(cfg->baud_rate); + if (can_baud == 0) + { + return -RT_ERROR; + } + + can_instance->cfg.baud_rate = cfg->baud_rate; + can_instance->cfg.mode = cfg->mode; + + /* Configuring the operating mode of CAN */ + switch (cfg->mode) + { + case RT_CAN_MODE_NORMAL: + can_mode = CAN_MODE_NORMAL; + break; + case RT_CAN_MODE_LISTEN: + can_mode = CAN_MODE_SILENT; + break; + case RT_CAN_MODE_LOOPBACK: + can_mode = CAN_MODE_LBACK; + break; + case RT_CAN_MODE_LOOPBACKANLISTEN: + can_mode = CAN_MODE_SILENT | CAN_MODE_LBACK; + break; + default: + return -RT_ERROR; + } + + if (0 == (config_can_struct(_HTCFG_CF0_CK_CAN, can_baud, can_mode, DISABLE, &CAN_InitStruct))) + { + return -RT_ERROR; + } + /* Reset CAN */ + CAN_DeInit(can_instance->can_x); + /* Initialising CAN */ + CAN_Init(can_instance->can_x, &CAN_InitStruct); + + /* Configuring the Default Filter for CAN */ + cfg_can_default_filter(can_instance); + + return RT_EOK; +} +/** + * @brief CAN Control Functions + * @param + * @retval + */ +rt_err_t ht32_can_control(struct rt_can_device *can, int cmd, void *arg) +{ + rt_uint32_t argval; + struct ht32_can *can_instance; + struct rt_can_filter_config *filter_cfg; + + RT_ASSERT(can != RT_NULL); + can_instance = (struct ht32_can *)can->parent.user_data; + RT_ASSERT(can_instance != RT_NULL); + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT:/* Clear Interrupt */ + { + argval = (rt_uint32_t) arg; + if (argval == RT_DEVICE_FLAG_INT_RX) /* receive interruptions */ + { + if (CAN_GetFlagStatus(can_instance->can_x, CAN_FLAG_RXOK)) + { + /* Clear RXOK Flag */ + CAN_ClearFlag(can_instance->can_x, CAN_FLAG_RXOK); + } + } + else if (argval == RT_DEVICE_FLAG_INT_TX) /* Send Interrupt */ + { + if (CAN_GetFlagStatus(can_instance->can_x, CAN_FLAG_TXOK)) + { + /* Clear TXOK flag*/ + CAN_ClearFlag(can_instance->can_x, CAN_FLAG_TXOK); + } + } + else if (argval == RT_DEVICE_CAN_INT_ERR) /* false interruption */ + { + /* Error Process*/ + CAN_LastErrorCode_TypeDef lec = CAN_GetLastErrorCode(can_instance->can_x); + if (lec != NO_ERROR) + { + LOG_W("LEC: %d\r\n", lec); + } + if (CAN_GetFlagStatus(can_instance->can_x, CAN_FLAG_BOFF)) + { + /* Recover from Bus off state.*/ + CAN_BusOffRecovery(can_instance->can_x); + } + } + break; + } + case RT_DEVICE_CTRL_SET_INT:/* Setting Up Interruptions */ + { + argval = (rt_uint32_t) arg; + if (argval == RT_DEVICE_FLAG_INT_RX) /* interrupt receive mode */ + { + LOG_W("Configuring Receive Interrupts!\r\n"); + CAN_IntConfig(can_instance->can_x, CAN_INT_EIE | CAN_INT_SIE | CAN_INT_IE, ENABLE); + NVIC_EnableIRQ(CAN0_IRQn); + } + else if (argval == RT_DEVICE_FLAG_INT_TX) /* interrupt transmission mode */ + { + LOG_W("Configuring Transmit Interrupts!\r\n"); + } + else if (argval == RT_DEVICE_CAN_INT_ERR) /* false interruption */ + { + LOG_W("Configuration error interrupt!\r\n"); + } + break; + } + case RT_CAN_CMD_SET_FILTER:/* Configuring the Hardware Filter Table */ + { + int i = 0; + uint8_t filter_num = 0; + uint32_t idmask = 0; + if (RT_NULL == arg) + { + /* default filter config */ + cfg_can_default_filter(can_instance); + } + else + { + filter_cfg = (struct rt_can_filter_config *)arg; + if (filter_cfg->count > MSG_OBJ_TOTAL_NUM) + { + LOG_W("Filter list length exceeds the limit(max 32)!"); + return -RT_ERROR; + } + for (i = 0; i < filter_cfg->count; i++) + { + /* Specify the filter table number or no */ + if (filter_cfg->items[i].hdr_bank == -1) + { + filter_num = i; + } + else + { + if (filter_cfg->items[i].hdr_bank > MSG_OBJ_TOTAL_NUM) + { + LOG_W("Filter List Number Out of Limits(1-32)!"); + return -RT_ERROR; + } + else + { + filter_num = filter_cfg->items[i].hdr_bank; + } + } + if (can_instance->filter_cfg.filter_flag & (1 << filter_num)) + { + LOG_W("This filter channel will be changed(num:%d)!", filter_num); + rt_kprintf("This filter channel will be changed(num:%d)!", filter_num); + } + can_instance->filter_cfg.filter_flag |= 1 << filter_num; + can_instance->filter_cfg.filter_mag[filter_num].MsgNum = filter_num + 1; + + /* Standard or Extended Frames */ + if (filter_cfg->items[i].ide == RT_CAN_STDID) + { + can_instance->filter_cfg.filter_mag[filter_num].IdType = CAN_STD_ID; + idmask = 0x7FF; + } + else if (filter_cfg->items[i].ide == RT_CAN_EXTID) + { + can_instance->filter_cfg.filter_mag[filter_num].IdType = CAN_EXT_ID; + idmask = 0x1FFFFFFF; + } + else + { + LOG_W("Frame pattern error(CAN_STD_ID/CAN_EXT_ID)!"); + return -RT_ERROR; + } + /* Whether to use MASK mode */ + if (filter_cfg->items[i].mode == CAN_UMASK_MODE) + { + can_instance->filter_cfg.filter_mag[filter_num].IdMask = idmask; + } + else if (filter_cfg->items[i].mode == CAN_MASK_MODE) + { + can_instance->filter_cfg.filter_mag[filter_num].IdMask = filter_cfg->items[i].mask; + } + else + { + LOG_W("MASK mode error(CAN_UMASK_MODE/CAN_MASK_MODE)!"); + return -RT_ERROR; + } + + /* Remote frames or data frames */ + if (filter_cfg->items[i].rtr == RT_CAN_RTR) + { + can_instance->filter_cfg.filter_mag[filter_num].FrameType = CAN_REMOTE_FRAME; + } + else if (filter_cfg->items[i].rtr == RT_CAN_DTR) + { + can_instance->filter_cfg.filter_mag[filter_num].FrameType = CAN_DATA_FRAME; + } + /* Setting ID */ + can_instance->filter_cfg.filter_mag[filter_num].Id = filter_cfg->items[i].id; + /* Setting up the CAN filter table */ + CAN_SetRxMsg(can_instance->can_x, &can_instance->filter_cfg.filter_mag[filter_num], 1); + } + } + break; + } + case RT_CAN_CMD_SET_BAUD:/* Setting the baud rate */ + { + argval = (rt_uint32_t) arg; + if (argval != CAN1MBaud && + argval != CAN800kBaud && + argval != CAN500kBaud && + argval != CAN250kBaud && + argval != CAN125kBaud && + argval != CAN100kBaud && + argval != CAN50kBaud && + argval != CAN20kBaud && + argval != CAN10kBaud) + { + return -RT_ERROR; + } + if (argval != can_instance->cfg.baud_rate) + { + can_instance->cfg.baud_rate = argval; + return ht32_can_configure(&can_instance->device, &can_instance->cfg); + } + break; + } + case RT_CAN_CMD_SET_MODE:/* Setting the CAN Operating Mode */ + { + argval = (rt_uint32_t) arg; + if (argval != RT_CAN_MODE_NORMAL && + argval != RT_CAN_MODE_LISTEN && + argval != RT_CAN_MODE_LOOPBACK && + argval != RT_CAN_MODE_LOOPBACKANLISTEN) + { + return -RT_ERROR; + } + if (argval != can_instance->cfg.mode) + { + can_instance->cfg.mode = argval; + return ht32_can_configure(&can_instance->device, &can_instance->cfg); + } + break; + } + case RT_CAN_CMD_GET_STATUS:/* Get CAN device status */ + { + rt_uint32_t errtype; + + errtype = can_instance->can_x->ECR; + can_instance->device.status.rcverrcnt = ((errtype >> 8) & 0x7f); + can_instance->device.status.snderrcnt = (errtype & 0xff); + + errtype = can_instance->can_x->SR; + can_instance->device.status.lasterrtype = (errtype & 0x07); + can_instance->device.status.errcode = ((errtype >> 5) & 0x07); + + rt_memcpy(arg, &can_instance->device.status, sizeof(can_instance->device.status)); + break; + } + default: + return -RT_ERROR; + } + return RT_EOK; +} +/** + * @brief CAN sends data + * @param + * @retval + */ +rt_ssize_t ht32_can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno) +{ + struct ht32_can *can_instance = RT_NULL; + struct rt_can_msg *pmsg = (struct rt_can_msg *) buf; + struct ht32_can_msg_type tx_msg = {0}; + + RT_ASSERT(can != RT_NULL); + can_instance = (struct ht32_can *)can->parent.user_data; + RT_ASSERT(can_instance != RT_NULL); + + /* Standard and Extended Frames */ + if (CAN_STD_ID == pmsg->ide) + { + tx_msg.cfg_msg.IdType = CAN_STD_ID; + tx_msg.cfg_msg.Id = pmsg->id; + } + else if (CAN_EXT_ID == pmsg->ide) + { + tx_msg.cfg_msg.IdType = CAN_EXT_ID; + tx_msg.cfg_msg.Id = pmsg->id; + } + else + { + LOG_W("Frame pattern error(CAN_STD_ID/CAN_EXT_ID)!"); + return -RT_ERROR; + } + + /* Teleframes and data frames */ + if (RT_CAN_RTR == pmsg->rtr) + { + tx_msg.cfg_msg.FrameType = CAN_REMOTE_FRAME; + } + else if (RT_CAN_DTR == pmsg->rtr) + { + tx_msg.cfg_msg.FrameType = CAN_DATA_FRAME; + } + else + { + LOG_W("Remote frame setting error(CAN_REMOTE_FRAME/CAN_DATA_FRAME)!"); + return -RT_ERROR; + } + + /* Length of sent data */ + tx_msg.data_len = pmsg->len & 0x0FU; + /* data being sent */ + tx_msg.data[0] = pmsg->data[0]; + tx_msg.data[1] = pmsg->data[1]; + tx_msg.data[2] = pmsg->data[2]; + tx_msg.data[3] = pmsg->data[3]; + tx_msg.data[4] = pmsg->data[4]; + tx_msg.data[5] = pmsg->data[5]; + tx_msg.data[6] = pmsg->data[6]; + tx_msg.data[7] = pmsg->data[7]; + + /* Waiting tx Msg idle */ + while (CAN_TransmitStatus(can_instance->can_x, &tx_msg.cfg_msg) == 0); + /* Loopback data */ + CAN_Transmit(can_instance->can_x, &tx_msg.cfg_msg, tx_msg.data, tx_msg.data_len); + + return RT_EOK; +} +/** + * @brief CAN receive data + * @param + * @retval + */ +rt_ssize_t ht32_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno) +{ + uint8_t i = 0; + uint32_t msgnum = 0; + CAN_RxStatus_TypeDef rx_status; + struct ht32_can_msg_type rx_msg = {0}; + struct ht32_can *can_instance = RT_NULL; + struct rt_can_msg *pmsg = (struct rt_can_msg *) buf; + + RT_ASSERT(can != RT_NULL); + RT_ASSERT(pmsg != RT_NULL); + can_instance = (struct ht32_can *)can->parent.user_data; + RT_ASSERT(can_instance != RT_NULL); + + msgnum = can_instance->filter_cfg.filter_flag; + for (i = 0; i < MSG_OBJ_TOTAL_NUM; i++) + { + if ((msgnum & 1) == 1) + { + rx_status = CAN_Receive(can_instance->can_x, &can_instance->filter_cfg.filter_mag[i], rx_msg.data, &rx_msg.data_len); + if (rx_status == MSG_OVER_RUN) + { + LOG_W("ID[%X] rx message over run\r\n", can_instance->filter_cfg.filter_mag[i].Id); + } + else if (rx_status == MSG_OBJ_NOT_SET) + { + LOG_W("rx message not set \r\n"); + } + else if (rx_status == MSG_RX_FINISH) + { + LOG_W("rx ok \r\n"); + pmsg->data[0] = rx_msg.data[0]; + pmsg->data[1] = rx_msg.data[1]; + pmsg->data[2] = rx_msg.data[2]; + pmsg->data[3] = rx_msg.data[3]; + pmsg->data[4] = rx_msg.data[4]; + pmsg->data[5] = rx_msg.data[5]; + pmsg->data[6] = rx_msg.data[6]; + pmsg->data[7] = rx_msg.data[7]; + pmsg->len = rx_msg.data_len; + + if (can_instance->filter_cfg.filter_mag[i].IdType == CAN_EXT_ID) + { + pmsg->id = can_instance->filter_cfg.filter_mag[i].Id; + pmsg->ide = RT_CAN_EXTID; + } + else if (can_instance->filter_cfg.filter_mag[i].IdType == CAN_STD_ID) + { + pmsg->id = can_instance->filter_cfg.filter_mag[i].Id; + pmsg->ide = RT_CAN_EXTID; + } + + if (can_instance->filter_cfg.filter_mag[i].FrameType == CAN_DATA_FRAME) + { + pmsg->rtr = RT_CAN_DTR; + } + else if (can_instance->filter_cfg.filter_mag[i].FrameType == CAN_REMOTE_FRAME) + { + pmsg->rtr = RT_CAN_RTR; + } + return RT_EOK; + } + } + msgnum = msgnum >> 1; + if (msgnum == 0) + { + return -1; + } + } + return -1; +} +/* Mapping CAN interfaces */ +static const struct rt_can_ops ht32_can_ops = +{ + .configure = ht32_can_configure, /* CAN Configuration Functions */ + .control = ht32_can_control, /* CAN Control Functions */ + .sendmsg = ht32_can_sendmsg, /* CAN Transmit Data */ + .recvmsg = ht32_can_recvmsg, /* CAN Receive Data */ +}; + +int rt_hw_can_init(void) +{ + + struct can_configure config = CANDEFAULTCONFIG; + config.mode = BSP_USING_CAN_MODE; + config.baud_rate = BSP_USING_CAN_BAUD; + config.privmode = RT_CAN_MODE_NOPRIV; + config.ticks = 50; + +#ifdef RT_CAN_USING_HDR + config.maxhdr = 14; +#endif + ht32_can_config.device.config = config; + /* Registration of CAN devices */ + rt_hw_can_register(&ht32_can_config.device, + ht32_can_config.name, + &ht32_can_ops, + &ht32_can_config); + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_hw_can_init); + +void CAN0_IRQHandler(void) +{ + CAN_LastErrorCode_TypeDef lec; + rt_interrupt_enter(); + /* Recover from Bus off state. */ + if (CAN_GetFlagStatus(ht32_can_config.can_x, CAN_FLAG_BOFF)) + { + CAN_BusOffRecovery(ht32_can_config.can_x); + } + /* Transmit message finished */ + if (CAN_GetFlagStatus(ht32_can_config.can_x, CAN_FLAG_TXOK)) + { + rt_hw_can_isr(&ht32_can_config.device, RT_CAN_EVENT_TX_DONE); + CAN_ClearFlag(ht32_can_config.can_x, CAN_FLAG_TXOK); + } + /* Message received. */ + if (CAN_GetFlagStatus(ht32_can_config.can_x, CAN_FLAG_RXOK)) + { + /* Clear all message objects' interrupt pending flag */ + CAN_ClearAllMsgPendingFlag(ht32_can_config.can_x); + rt_hw_can_isr(&ht32_can_config.device, RT_CAN_EVENT_RX_IND); + CAN_ClearFlag(ht32_can_config.can_x, CAN_FLAG_RXOK); + } + lec = CAN_GetLastErrorCode(ht32_can_config.can_x); + if (lec != NO_ERROR) + { + switch (lec) + { + case NO_ERROR: + break; + case STUFF_ERROR: + ht32_can_config.device.status.bitpaderrcnt++; + break; + case FORM_ERROR: + ht32_can_config.device.status.formaterrcnt++; + break; + case ACK_ERROR: + ht32_can_config.device.status.ackerrcnt++; + break; + case BIT1_EROR: + case BIT0_ERROR: + ht32_can_config.device.status.biterrcnt++; + break; + case CRC_ERROR: + ht32_can_config.device.status.crcerrcnt++; + break; + case NO_CHANGE: + break; + } + ht32_can_config.device.status.lasterrtype = lec; + ht32_can_config.device.status.rcverrcnt = CAN_GetReceiveErrorCounter(ht32_can_config.can_x); + ht32_can_config.device.status.snderrcnt = CAN_GetLSBTransmitErrorCounter(ht32_can_config.can_x); + ht32_can_config.device.status.errcode = lec; + } + + rt_interrupt_leave(); +} + +#endif /* BSP_USING_CAN */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_can.h b/bsp/ht32/libraries/ht32_drivers/drv_can.h new file mode 100644 index 0000000000..4b5c63cecf --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_can.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-08-22 QT-one first version + */ + +#ifndef __DRV_CAN_H__ +#define __DRV_CAN_H__ + +#include +#include +#include "drv_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_CAN_H__ */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_common.c b/bsp/ht32/libraries/ht32_drivers/drv_common.c index 1bdb6a36e1..fe689d4728 100644 --- a/bsp/ht32/libraries/ht32_drivers/drv_common.c +++ b/bsp/ht32/libraries/ht32_drivers/drv_common.c @@ -27,7 +27,7 @@ MSH_CMD_EXPORT(reboot, Reboot System); void rt_hw_systick_init(void) { SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK); - SYSTICK_SetReloadValue(SystemCoreClock / 8 / RT_TICK_PER_SECOND); + SYSTICK_SetReloadValue(SystemCoreClock / 10 / RT_TICK_PER_SECOND); SYSTICK_IntConfig(ENABLE); SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR); SYSTICK_CounterCmd(SYSTICK_COUNTER_ENABLE); diff --git a/bsp/ht32/libraries/ht32_drivers/drv_sdio.c b/bsp/ht32/libraries/ht32_drivers/drv_sdio.c new file mode 100644 index 0000000000..d9ea9e6954 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_sdio.c @@ -0,0 +1,747 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-11-06 QT-one first version + */ + +#include +#include "drv_sdio.h" + +#ifdef BSP_USING_SDIO +#if !defined (BSP_USING_SDIO) + #error "Please define at least one SDIOx" +#endif + +#define RT_HW_SDIO_LOCK(_sdio) rt_mutex_take(&_sdio->mutex, RT_WAITING_FOREVER) +#define RT_HW_SDIO_UNLOCK(_sdio) rt_mutex_release(&_sdio->mutex); + +typedef rt_err_t (*dma_txconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size); +typedef rt_err_t (*dma_rxconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size); +typedef rt_uint32_t (*sdio_clk_get)(HT_SDIO_TypeDef *hw_sdio); + +struct ht32_sdio_config +{ + SDIO_InitTypeDef sdio_cfg; /* SDIO Configuration Structure */ + PDMACH_InitTypeDef dma_tx_cfg; /* TX DMA Configuration Structure */ + PDMACH_InitTypeDef dma_rx_cfg; /* RX DMA Configuration Structure */ +}; + +struct ht32_sdio_des +{ + HT_SDIO_TypeDef *hw_sdio; /* Pointer to sdio hardware structure */ + dma_txconfig txconfig; /* Pointer to the configuration function for the TX DMA */ + dma_rxconfig rxconfig; /* Pointer to the configuration function for the RX DMA */ + sdio_clk_get clk_get; /* Pointer to get sdio clock function */ +}; + +struct sdio_pkg +{ + struct rt_mmcsd_cmd *cmd; /* RTT-defined mmcsd command structure */ + void *buff; /* Pointer to hold data */ + SDIO_CmdInitTypeDef sdio_cmd_str; /* Send Command Configuration */ + SDIO_DataInitTypeDef sdio_dat_str; /* Send Data Configuration */ +}; + +struct rt_hw_sdio +{ + struct rt_mmcsd_host *host; /* mmcsd host structure */ + struct ht32_sdio_des sdio_des; /* Configuration information for sdio */ + struct rt_event dat_event; /* data event variable */ + struct rt_event cmd_event; /* command event variable */ + struct rt_mutex mutex; /* mutually exclusive variable */ + struct sdio_pkg *pkg; /* package structure */ +}; + +rt_align(SDIO_ALIGN_LEN) /* Ensure data alignment */ +static rt_uint8_t cache_buf[SDIO_BUFF_SIZE]; /* Buff caches allocated to SDIOs */ + +static struct rt_mmcsd_host *host; +static struct ht32_sdio_config sdio_cfg; + +static void sdio_delay(rt_uint32_t ms) +{ + while (ms > 0) + ms--; +} + +static rt_uint32_t ht32_sdio_clk_get(HT_SDIO_TypeDef *hw_sdio) +{ + return SDIO_CLOCK_FREQ; +} +/** + * @brief this function transfer data by dma. + * @param sdio rt_hw_sdio + * @param pkg sdio package + * @retval none + */ +static void rt_hw_sdio_transfer_by_dma(struct rt_hw_sdio *sdio, struct sdio_pkg *pkg) +{ + struct rt_mmcsd_data *data; + void *buff; + HT_SDIO_TypeDef *hw_sdio; + if ((RT_NULL == pkg) || (RT_NULL == sdio)) + { + LOG_E("rt_hw_sdio_transfer_by_dma invalid args"); + return; + } + + data = pkg->cmd->data; + if (RT_NULL == data) + { + LOG_E("rt_hw_sdio_transfer_by_dma invalid args"); + return; + } + + buff = pkg->buff; + if (RT_NULL == buff) + { + LOG_E("rt_hw_sdio_transfer_by_dma invalid args"); + return; + } + + hw_sdio = sdio->sdio_des.hw_sdio; + if (data->flags & DATA_DIR_WRITE) + { + LOG_D("SDIO write!"); + sdio->sdio_des.txconfig((rt_uint32_t *)buff, (rt_uint32_t *)&hw_sdio->DR, (data->blks * data->blksize)); + } + else if (data->flags & DATA_DIR_READ) + { + LOG_D("SDIO read!"); + sdio->sdio_des.rxconfig((rt_uint32_t *)&hw_sdio->DR, (rt_uint32_t *)buff, (data->blks * data->blksize)); + } +} +/** + * @brief this function send command. + * @param sdio rt_hw_sdio + * @param pkg sdio package + * @retval none + */ +static void rt_hw_sdio_send_command(struct rt_hw_sdio *sdio, struct sdio_pkg *pkg) +{ + rt_uint32_t status = 0; + struct rt_mmcsd_cmd *cmd = pkg->cmd; + struct rt_mmcsd_data *data = cmd->data; + HT_SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio; + + /* save pkg */ + sdio->pkg = pkg; + + LOG_D("CMD:%d ARG:0x%08x RES:%s%s%s%s%s%s%s%s%s rw:%c len:%d blksize:%d", + cmd->cmd_code, + cmd->arg, + resp_type(cmd) == RESP_NONE ? "NONE" : "", + resp_type(cmd) == RESP_R1 ? "R1" : "", + resp_type(cmd) == RESP_R1B ? "R1B" : "", + resp_type(cmd) == RESP_R2 ? "R2" : "", + resp_type(cmd) == RESP_R3 ? "R3" : "", + resp_type(cmd) == RESP_R4 ? "R4" : "", + resp_type(cmd) == RESP_R5 ? "R5" : "", + resp_type(cmd) == RESP_R6 ? "R6" : "", + resp_type(cmd) == RESP_R7 ? "R7" : "", + data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-', + data ? data->blks * data->blksize : 0, + data ? data->blksize : 0 + ); + + /* config cmd reg */ + pkg->sdio_cmd_str.SDIO_DatPresent = SDIO_Data_Present_No; + + /* config data reg */ + if (data != RT_NULL) + { + rt_uint32_t dir = 0; + dir = (data->flags & DATA_DIR_READ) ? SDIO_TransferDir_ToSDIO : SDIO_TransferDir_ToCard; + if (SDIO_TransferDir_ToSDIO == dir) /* read */ + SDIO_FlagConfig(SDIO_FLAG_BUF_OVERFLOW | SDIO_FLAG_DATA_CRCERR | SDIO_FLAG_DATA_TIMEOUT | SDIO_FLAG_TRANS_END, ENABLE); + else if (SDIO_TransferDir_ToCard == dir) /* write */ + SDIO_FlagConfig(SDIO_FLAG_BUF_UNDERFLOW | SDIO_FLAG_DATA_CRCERR | SDIO_FLAG_DATA_TIMEOUT | SDIO_FLAG_TRANS_END, ENABLE); + if (data->blksize > 2048) + LOG_E("Block length out of range!"); + pkg->sdio_dat_str.SDIO_DataBlockCount = data->blks; /* Specify the number of data blocks to be transferred 1~65535 */ + pkg->sdio_dat_str.SDIO_DataBlockSize = data->blksize; /* Specify the size of the data block to be transferred 1~2048 */ + pkg->sdio_dat_str.SDIO_DataTimeOut = HW_SDIO_DATATIMEOUT; /* Specify the data timeout period 0x1 ~ 0x00ffffff */ + pkg->sdio_dat_str.SDIO_TransferDir = dir; /* Specify the direction of data transmission r/w */ + if (data->blks > 1) + pkg->sdio_dat_str.SDIO_TransferMode = SDIO_MultiBlock_DMA_Transfer; /* multiblock transfer mode */ + else + pkg->sdio_dat_str.SDIO_TransferMode = SDIO_SingleBlock_DMA_Transfer; /* single-block transfer mode */ + SDIO_DataConfig(&pkg->sdio_dat_str); + + pkg->sdio_cmd_str.SDIO_DatPresent = SDIO_Data_Present_Yes; + + rt_hw_sdio_transfer_by_dma(sdio, pkg); + } + + /* Configuring Response Mode */ + if (resp_type(cmd) == RESP_NONE) + pkg->sdio_cmd_str.SDIO_Response = SDIO_Response_No; + else if (resp_type(cmd) == RESP_R2) + pkg->sdio_cmd_str.SDIO_Response = SDIO_Response_Long; + else + pkg->sdio_cmd_str.SDIO_Response = SDIO_Response_Short; + + if (resp_type(cmd) & (RESP_R1 | RESP_R6)) + pkg->sdio_cmd_str.SDIO_CmdIdxChk = SDIO_CmdIdxChk_Yes; + else + pkg->sdio_cmd_str.SDIO_CmdIdxChk = SDIO_Data_Present_No; + + if (resp_type(cmd) & (RESP_R3)) + pkg->sdio_cmd_str.SDIO_CmdCrcChk = SDIO_CmdCrcChk_No; + else + pkg->sdio_cmd_str.SDIO_CmdCrcChk = SDIO_CmdCrcChk_Yes; + /* send cmd */ + pkg->sdio_cmd_str.SDIO_Argument = cmd->arg; /* sdio Command Parameters */ + pkg->sdio_cmd_str.SDIO_CmdIndex = (cmd->cmd_code << 8); /* Index of sdio commands 0x01 ~ 0x40*/ + /* open irq */ + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, ENABLE); + SDIO_IntConfig(HW_SDIO_CMD_FLAG, ENABLE); + SDIO_SendCommand(&pkg->sdio_cmd_str); + /* wait completed */ + if (rt_event_recv(&sdio->cmd_event, 0xffffffff, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(5000), &status) != RT_EOK) + { + LOG_E("wait completed timeout"); + cmd->err = -RT_ETIMEOUT; + return; + } + SDIO_IntConfig(HW_SDIO_CMD_FLAG, DISABLE); + if (cmd->err != RT_EOK) + LOG_D("cmd err!"); + + /* waiting for data to be sent to completion */ + if (data != RT_NULL) + { + status = 0; + SDIO_IntConfig(SDIO_INT_BUF_OVERFLOW | SDIO_INT_DATA_CRCERR | SDIO_INT_DATA_TIMEOUT | SDIO_INT_TRANS_END, ENABLE); + if (rt_event_recv(&sdio->dat_event, 0xffffffff, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(5000), &status) != RT_EOK) + { + LOG_E("wait completed timeout"); + data->err = -RT_ETIMEOUT; + return; + } + SDIO_IntConfig(SDIO_INT_BUF_OVERFLOW | SDIO_INT_DATA_CRCERR | SDIO_INT_DATA_TIMEOUT | SDIO_INT_TRANS_END, DISABLE); + if (data->err != RT_EOK) + LOG_D("data err!"); + } + /* close irq, keep sdio irq */ + hw_sdio->IER = 0x00; + /* clear pkg */ + sdio->pkg = RT_NULL; +} +/** + * @brief this function send sdio request. + * @param sdio rt_hw_sdio + * @param req request + * @retval none + */ +static void rt_hw_sdio_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req) +{ + struct sdio_pkg pkg; + struct rt_hw_sdio *sdio = host->private_data; + struct rt_mmcsd_data *data; + + RT_HW_SDIO_LOCK(sdio); + /* Send commands and data */ + if (req->cmd != RT_NULL) + { + memset(&pkg, 0, sizeof(pkg)); + data = req->cmd->data; + pkg.cmd = req->cmd; + + if (data != RT_NULL) + { + rt_uint32_t size = data->blks * data->blksize; + RT_ASSERT(size <= SDIO_BUFF_SIZE); + pkg.buff = data->buf; + if ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1)) + { + pkg.buff = cache_buf; + if (data->flags & DATA_DIR_WRITE) + { + memcpy(cache_buf, data->buf, size); + } + } + } + rt_hw_sdio_send_command(sdio, &pkg); + if ((data != RT_NULL) && (data->flags & DATA_DIR_READ) && ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1))) + { + memcpy(data->buf, cache_buf, data->blksize * data->blks); + } + } + /* Send stop command */ + if (req->stop != RT_NULL) + { + memset(&pkg, 0, sizeof(pkg)); + pkg.cmd = req->stop; + rt_hw_sdio_send_command(sdio, &pkg); + } + RT_HW_SDIO_UNLOCK(sdio); + mmcsd_req_complete(sdio->host); +} +/** + * @brief this function config sdio. + * @param host rt_mmcsd_host + * @param io_cfg rt_mmcsd_io_cfg + * @retval none + */ +static void rt_hw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg) +{ + rt_uint32_t div, clk_src; + rt_uint32_t clk = io_cfg->clock; + struct rt_hw_sdio *sdio = host->private_data; + /* SDIO Clock Acquisition and Limiting */ + clk_src = sdio->sdio_des.clk_get(sdio->sdio_des.hw_sdio); + if (clk_src < 400 * 1000) + { + LOG_E("Chip clock frequency too low! fre:%d", clk_src); + return; + } + if (clk > host->freq_max) clk = host->freq_max; + if (clk > clk_src) + { + LOG_W("Setting rate is greater than clock source rate."); + clk = clk_src; + } + + LOG_D("clk:%d width:%s%s%s power:%s%s%s", + clk, + io_cfg->bus_width == MMCSD_BUS_WIDTH_8 ? "8" : "", + io_cfg->bus_width == MMCSD_BUS_WIDTH_4 ? "4" : "", + io_cfg->bus_width == MMCSD_BUS_WIDTH_1 ? "1" : "", + io_cfg->power_mode == MMCSD_POWER_OFF ? "OFF" : "", + io_cfg->power_mode == MMCSD_POWER_UP ? "UP" : "", + io_cfg->power_mode == MMCSD_POWER_ON ? "ON" : "" + ); + + RT_HW_SDIO_LOCK(sdio); + /* SDIO Clock Division Configuration */ + div = clk_src / clk; + if ((clk == 0) || (div == 0)) + { + div = 1; + } + else + { + if (div < 1) + { + div = 1; + } + else if (div > 0xff) + { + div = 0xff; + } + } + sdio_cfg.sdio_cfg.SDIO_ClockDiv = div; + if (div % 2) + sdio_cfg.sdio_cfg.SDIO_ClockPeriod = SDIO_Clock_LowPeriod_Longer; + else + sdio_cfg.sdio_cfg.SDIO_ClockPeriod = SDIO_Clock_LowPeriod_Shorter; + + /* Data bus mode configuration */ + if (io_cfg->bus_width == MMCSD_BUS_WIDTH_8) + { + LOG_E("8-bit data width not supported!"); + return; + } + else if (io_cfg->bus_width == MMCSD_BUS_WIDTH_4) + { + sdio_cfg.sdio_cfg.SDIO_BusWide = SDIO_BusWide_4b; + sdio_cfg.sdio_cfg.SDIO_BusMode = SDIO_BusMode_HighSpeed; + } + else + { + sdio_cfg.sdio_cfg.SDIO_BusWide = SDIO_BusWide_1b; + sdio_cfg.sdio_cfg.SDIO_BusMode = SDIO_BusMode_NormalSpeed; + } + /* Power Mode Configuration */ + switch (io_cfg->power_mode) + { + case MMCSD_POWER_OFF: + sdio_cfg.sdio_cfg.SDIO_ClockPowerSave = SDIO_Clock_PowerSave_Disable; + break; + case MMCSD_POWER_UP: + sdio_cfg.sdio_cfg.SDIO_ClockPowerSave = SDIO_Clock_PowerSave_StopHigh; + break; + case MMCSD_POWER_ON: + sdio_cfg.sdio_cfg.SDIO_ClockPowerSave = SDIO_Clock_PowerSave_StopLow; + break; + default: + LOG_W("unknown power_mode %d", io_cfg->power_mode); + break; + } + SDIO_Init(&sdio_cfg.sdio_cfg); + RT_HW_SDIO_UNLOCK(sdio); +} +/** + * @brief this function update sdio interrupt. + * @param host rt_mmcsd_host + * @param enable + * @retval none + */ +void rt_hw_sdio_irq_update(struct rt_mmcsd_host *host, rt_int32_t enable) +{ + if (enable) + { + LOG_D("enable sdio irq"); + NVIC_EnableIRQ(SDIO_IRQn); + } + else + { + LOG_D("disable sdio irq"); + NVIC_DisableIRQ(SDIO_IRQn); + } +} +/** + * @brief this function delect sdcard. + * @param host rt_mmcsd_host + * @retval 0x01 + */ +static rt_int32_t rt_hw_sd_delect(struct rt_mmcsd_host *host) +{ + LOG_D("try to detect device"); + return 0x01; +} +/** + * @brief this function interrupt process function. + * @param host rt_mmcsd_host + * @retval none + */ +void rt_hw_sdio_irq_process(struct rt_mmcsd_host *host) +{ + rt_uint8_t cmd_flag = 0; + rt_uint8_t data_flag = 0; + struct rt_hw_sdio *sdio = host->private_data; + HT_SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio; + rt_uint32_t intstatus = hw_sdio->SR; + struct rt_mmcsd_cmd *cmd = sdio->pkg->cmd; + struct rt_mmcsd_data *data = cmd->data; + if (sdio->pkg == NULL) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(HW_SDIO_CMD_FLAG); + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(HW_SDIO_DATA_FLAG); + return; + } + /* Command Response Processing */ + if (cmd != NULL) + { + if (intstatus != 0x00000001) + sdio_delay(10000); + cmd->resp[0] = hw_sdio->RESP0; + cmd->resp[1] = hw_sdio->RESP1; + cmd->resp[2] = hw_sdio->RESP2; + cmd->resp[3] = hw_sdio->RESP3; + cmd->err = RT_EOK; + if (SDIO_GetFlagStatus(SDIO_FLAG_CMD_SEND)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_SEND); + cmd_flag = 1; + } + if (SDIO_GetFlagStatus(SDIO_FLAG_CMD_TIMEOUT)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_TIMEOUT); + RESET_CPSM(); + cmd->err = -RT_ETIMEOUT; + cmd_flag = 1; + } + if ((SDIO_GetFlagStatus(SDIO_FLAG_CMD_CRCERR)) && (resp_type(cmd) & (RESP_R3 | RESP_R4))) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_CRCERR); + cmd->err = RT_EOK; + cmd_flag = 1; + } + else if (SDIO_GetFlagStatus(SDIO_FLAG_CMD_CRCERR)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_CRCERR); + cmd->err = -RT_ERROR; + cmd_flag = 1; + } + if ((SDIO_GetFlagStatus(SDIO_FLAG_CMD_IDXERR)) && (resp_type(cmd) & (RESP_R1 | RESP_R6)) && (cmd->err == RT_EOK)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_IDXERR); + cmd->err = RT_EOK; + cmd_flag = 1; + } + else if (SDIO_GetFlagStatus(SDIO_FLAG_CMD_IDXERR)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_IDXERR); + cmd->err = -RT_ERROR; + cmd_flag = 1; + } + if (cmd_flag) + { + rt_event_send(&sdio->cmd_event, intstatus); + } + } + /* Data response processing */ + if (data != NULL) + { + data->err = RT_EOK; + if (SDIO_GetFlagStatus(SDIO_FLAG_TRANS_END)) + { + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_TRANS_END); + data_flag = 1; + } + + if (SDIO_GetFlagStatus(SDIO_FLAG_DATA_TIMEOUT)) + { + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_DATA_TIMEOUT); + data->err = -RT_ETIMEOUT; + data_flag = 1; + } + if (SDIO_GetFlagStatus(SDIO_FLAG_DATA_CRCERR)) + { + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_DATA_CRCERR); + data->err = -RT_ERROR; + data_flag = 1; + } + if (SDIO_GetFlagStatus(SDIO_FLAG_BUF_OVERFLOW)) + { + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_BUF_OVERFLOW); + data->err = -RT_ERROR; + data_flag = 1; + } + /* 如果操作完成 */ + if (data_flag) + { + rt_event_send(&sdio->dat_event, intstatus); /* 发送事件,通知操作完成 */ + } + } + + +} +static const struct rt_mmcsd_host_ops ops = +{ + .request = rt_hw_sdio_request, + .set_iocfg = rt_hw_sdio_iocfg, + .get_card_status = rt_hw_sd_delect, + .enable_sdio_irq = rt_hw_sdio_irq_update, +}; +/** + * @brief this function create mmcsd host. + * @param sdio_des at32_sdio_des + * @retval rt_mmcsd_host + */ +struct rt_mmcsd_host *sdio_host_create(struct ht32_sdio_des *sdio_des) +{ + struct rt_mmcsd_host *host; + struct rt_hw_sdio *sdio = RT_NULL; + /* effective parameter */ + if ((sdio_des == RT_NULL) || (sdio_des->txconfig == RT_NULL) || (sdio_des->rxconfig == RT_NULL)) + { + LOG_E("L:%d F:%s %s %s %s", + (sdio_des == RT_NULL ? "sdio_des is NULL" : ""), + (sdio_des ? (sdio_des->txconfig ? "txconfig is NULL" : "") : ""), + (sdio_des ? (sdio_des->rxconfig ? "rxconfig is NULL" : "") : "") + ); + return RT_NULL; + } + + sdio = rt_malloc(sizeof(struct rt_hw_sdio)); + if (sdio == RT_NULL) + { + LOG_E("L:%d F:%s malloc rt_hw_sdio fail"); + return RT_NULL; + } + rt_memset(sdio, 0, sizeof(struct rt_hw_sdio)); + + host = mmcsd_alloc_host(); + if (host == RT_NULL) + { + LOG_E("L:%d F:%s mmcsd alloc host fail"); + rt_free(sdio); + return RT_NULL; + } + + rt_memcpy(&sdio->sdio_des, sdio_des, sizeof(struct ht32_sdio_des)); + sdio->sdio_des.hw_sdio = (sdio_des->hw_sdio == RT_NULL ? (HT_SDIO_TypeDef *)SDIO_BASE_ADDRESS : sdio_des->hw_sdio); + sdio->sdio_des.clk_get = (sdio_des->clk_get == RT_NULL ? ht32_sdio_clk_get : sdio_des->clk_get); + /* Initialising events and mutexes */ + rt_event_init(&sdio->dat_event, "sdio", RT_IPC_FLAG_FIFO); + rt_event_init(&sdio->cmd_event, "sdio_cmd", RT_IPC_FLAG_FIFO); + rt_mutex_init(&sdio->mutex, "sdio", RT_IPC_FLAG_PRIO); + + /* set host defautl attributes */ + host->ops = &ops; + host->freq_min = 400 * 1000; + host->freq_max = SDIO_MAX_FREQ; + host->valid_ocr = 0X00FFFF80; +#ifndef SDIO_USING_1_BIT + host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ; +#else + host->flags = MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ; +#endif + host->max_seg_size = SDIO_BUFF_SIZE; + host->max_dma_segs = 1; + host->max_blk_size = 512; + host->max_blk_count = 512; + + /* link up host and sdio */ + sdio->host = host; + host->private_data = sdio; + + rt_hw_sdio_irq_update(host, 1); + + /* ready to change */ + mmcsd_change(host); + + return host; +} + +/** + * @brief this function configures the dmatx. + * @param src: pointer to the source buffer + * @param dst: pointer to the destination buffer + * @param buffer_size: size of tx buffer + * @retval none + */ +void sd_lowlevel_dmatx_config(uint32_t *src, uint32_t *dst, uint32_t buffer_size) +{ + PDMACH_InitTypeDef PDMACH_InitStruct; + /* Configure */ + PDMACH_InitStruct.PDMACH_SrcAddr = (u32)src; + PDMACH_InitStruct.PDMACH_DstAddr = (u32)dst; + PDMACH_InitStruct.PDMACH_AdrMod = SRC_ADR_LIN_INC | DST_ADR_FIX; + PDMACH_InitStruct.PDMACH_BlkCnt = buffer_size; + PDMACH_InitStruct.PDMACH_BlkLen = 1; + PDMACH_InitStruct.PDMACH_DataSize = WIDTH_32BIT; + PDMACH_InitStruct.PDMACH_Priority = H_PRIO; + PDMA_Config(PDMA_SDIO_TX, &PDMACH_InitStruct); + PDMA_IntConfig(PDMA_SDIO_TX, (PDMA_INT_GE | PDMA_INT_TC | PDMA_INT_TE), ENABLE); + NVIC_EnableIRQ(PDMACH7_IRQn); + PDMA_EnaCmd(PDMA_SDIO_TX, ENABLE); +} + +/** + * @brief this function configures the dmarx. + * @param src: pointer to the source buffer + * @param dst: pointer to the destination buffer + * @param buffer_size: size of rx buffer + * @retval none + */ +void sd_lowlevel_dmarx_config(uint32_t *src, uint32_t *dst, uint32_t buffer_size) +{ + PDMACH_InitTypeDef PDMACH_InitStruct; + /* Configure */ + PDMACH_InitStruct.PDMACH_SrcAddr = (u32)src; + PDMACH_InitStruct.PDMACH_DstAddr = (u32)dst; + PDMACH_InitStruct.PDMACH_AdrMod = SRC_ADR_FIX | DST_ADR_LIN_INC; + PDMACH_InitStruct.PDMACH_BlkCnt = buffer_size; + PDMACH_InitStruct.PDMACH_BlkLen = 1; + PDMACH_InitStruct.PDMACH_DataSize = WIDTH_32BIT; + PDMACH_InitStruct.PDMACH_Priority = H_PRIO; + PDMA_Config(PDMA_SDIO_RX, &PDMACH_InitStruct); + PDMA_IntConfig(PDMA_SDIO_RX, (PDMA_INT_GE | PDMA_INT_TC | PDMA_INT_TE), ENABLE); + NVIC_EnableIRQ(PDMACH6_IRQn); + PDMA_EnaCmd(PDMA_SDIO_RX, ENABLE); +} + + +/** + * @brief this function get at32 sdio clock. + * @param hw_sdio: at32_sdio + * @retval ahb frequency + */ +static rt_uint32_t ht32_sdio_clock_get(HT_SDIO_TypeDef *hw_sdio) +{ + return SystemCoreClock; +} +static rt_err_t dma_tx_config(rt_uint32_t *src, rt_uint32_t *dst, int size) +{ + sd_lowlevel_dmatx_config((uint32_t *)src, (uint32_t *)dst, size / 4); + return RT_EOK; +} +static rt_err_t dma_rx_config(rt_uint32_t *src, rt_uint32_t *dst, int size) +{ + sd_lowlevel_dmarx_config((uint32_t *)src, (uint32_t *)dst, size / 4); + return RT_EOK; +} + +int rt_hw_sdio_init(void) +{ + struct ht32_sdio_des sdio_des; + + ht32_sdio_gpio_init((void *)(HT_SDIO)); + sdio_des.clk_get = ht32_sdio_clock_get; + sdio_des.hw_sdio = (HT_SDIO_TypeDef *)HT_SDIO; + sdio_des.rxconfig = dma_rx_config; + sdio_des.txconfig = dma_tx_config; + host = sdio_host_create(&sdio_des); + if (host == RT_NULL) + { + LOG_E("host create fail"); + return -1; + } + return 0; +} + +INIT_DEVICE_EXPORT(rt_hw_sdio_init); + +/*********************************************************************************************************//** + * @brief This function handles PDMA_CH6 interrupt. + * @retval None + ************************************************************************************************************/ +void PDMA_CH6_IRQHandler(void) +{ + if (HT_PDMA->ISR1 & (PDMA_FLAG_TE << ((PDMA_CH6 - 6) * 5))) + { + LOG_E(" TE6"); + while (1); + } + + HT_PDMA->ISCR1 = PDMA_FLAG_TC << ((PDMA_CH6 - 6) * 5); + PDMA_EnaCmd(PDMA_SDIO_RX, DISABLE); +} + +/*********************************************************************************************************//** + * @brief This function handles PDMA_CH7 interrupt. + * @retval None + ************************************************************************************************************/ +void PDMA_CH7_IRQHandler(void) +{ + if (HT_PDMA->ISR1 & (PDMA_FLAG_TE << ((PDMA_CH7 - 6) * 5))) + { + LOG_E(" TE7"); + while (1); + } + + HT_PDMA->ISCR1 = PDMA_FLAG_TC << ((PDMA_CH7 - 6) * 5); + PDMA_EnaCmd(PDMA_SDIO_TX, DISABLE); +} + +/*********************************************************************************************************//** + * @brief This function handles SDIO interrupt. + * @retval None + ************************************************************************************************************/ +void SDIO_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + rt_hw_sdio_irq_process(host); + /* leave interrupt */ + rt_interrupt_leave(); +} + +void ht32_mmcsd_change(void) +{ + mmcsd_change(host); +} + +#endif /* BSP_USING_SDIO */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_sdio.h b/bsp/ht32/libraries/ht32_drivers/drv_sdio.h new file mode 100644 index 0000000000..a66c96ef23 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_sdio.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-11-06 QT-one first version + */ + +#ifndef __DRV_SDIO_H__ +#define __DRV_SDIO_H__ + +#include +#include + +#include +#include "drv_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SDIO_BASE_ADDRESS +#define SDIO_BASE_ADDRESS HT_SDIO +#endif + +#ifndef SDIO_CLOCK_FREQ +#define SDIO_CLOCK_FREQ (48U * 1000 * 1000) +#endif + +#ifndef SDIO_BUFF_SIZE +#define SDIO_BUFF_SIZE (4096) +#endif + +#ifndef SDIO_ALIGN_LEN +#define SDIO_ALIGN_LEN (32) +#endif + +#ifndef SDIO_MAX_FREQ +#define SDIO_MAX_FREQ (24 * 1000 * 1000) +#endif + +#define HW_SDIO_CMD_FLAG \ + (SDIO_INT_CMD_SEND | SDIO_FLAG_CMD_TIMEOUT | SDIO_FLAG_CMD_CRCERR | SDIO_FLAG_CMD_IDXERR) + +#define HW_SDIO_DATA_FLAG \ + (SDIO_FLAG_BUF_OVERFLOW | SDIO_FLAG_BUF_UNDERFLOW | SDIO_FLAG_DATA_CRCERR | SDIO_FLAG_DATA_TIMEOUT | SDIO_FLAG_TRANS_END) + +#define HW_SDIO_DATATIMEOUT (0x000FFFFF) + +void ht32_mmcsd_change(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_SDIO_H__ */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_usart.c b/bsp/ht32/libraries/ht32_drivers/drv_usart.c index bc19b0409e..6616b5b860 100644 --- a/bsp/ht32/libraries/ht32_drivers/drv_usart.c +++ b/bsp/ht32/libraries/ht32_drivers/drv_usart.c @@ -261,11 +261,11 @@ static rt_ssize_t ht32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t static const struct rt_uart_ops ht32_usart_ops = { - .configure = ht32_configure, - .control = ht32_control, - .putc = ht32_putc, - .getc = ht32_getc, - .dma_transmit = ht32_dma_transmit, + .configure = ht32_configure, + .control = ht32_control, + .putc = ht32_putc, + .getc = ht32_getc, + .dma_transmit = ht32_dma_transmit, }; int rt_hw_usart_init(void) diff --git a/bsp/ht32/libraries/ht32_drivers/drv_usbd.c b/bsp/ht32/libraries/ht32_drivers/drv_usbd.c new file mode 100644 index 0000000000..ecae47c3e6 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_usbd.c @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-09 QT-one first version + */ + +#include "drv_usbd.h" + +#ifdef RT_USING_USB_DEVICE +#if !defined(BSP_USING_USBD) + #error "Please define at least one BSP_USING_USBD" +#endif + +#if defined(BSP_USING_USBD) + #include "usb_port.h" +#endif + +struct ht32_usbd +{ + char *name; + USBDCore_TypeDef *p_usbd_code; + IRQn_Type irq; +}; + +__ALIGN4 USBDCore_TypeDef p_usbd; +/* internal mount point */ +static struct ht32_usbd *p_usbd_instance = RT_NULL; + +/* Endpoint Function List */ +static struct ep_id endpoint_pool[] = +{ + {0x00, USB_EP_ATTR_CONTROL, USB_DIR_INOUT, 64, ID_ASSIGNED }, + {0x01, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, + {0x02, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, + {0x03, USB_EP_ATTR_INT, USB_DIR_IN, 64, ID_UNASSIGNED}, + {0x04, USB_EP_ATTR_INT, USB_DIR_OUT, 64, ID_UNASSIGNED}, + {0x05, USB_EP_ATTR_ISOC, USB_DIR_IN, 64, ID_UNASSIGNED}, + {0x06, USB_EP_ATTR_ISOC, USB_DIR_OUT, 64, ID_UNASSIGNED}, + {0x07, USB_EP_ATTR_TYPE_MASK, USB_DIR_MASK, 64, ID_UNASSIGNED}, +}; + +/* usbd Peripheral List */ +static struct ht32_usbd usbd_config[] = +{ +#ifdef BSP_USING_USBD + { + .name = BSP_USING_USBD_NAME, + .p_usbd_code = NULL, + .irq = USB_IRQn, + }, +#endif +}; + +/* Start of Frame (SOF) interrupt callbacks */ +void usbd_sof_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_sof_handler(udcd); +} +/* USB reset interrupt */ +void usbd_reset_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_reset_handler(udcd); +} + +/* USB Suspend (Disconnect) Interrupt */ +void usbd_suspend_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_disconnect_handler(udcd); +} + +/* USB recovery (reconnect) interrupt */ +void usbd_resume_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_connect_handler(udcd); +} + +/* USB endpoint 0 interrupt */ +void usbd_setup_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_setup_handler(udcd, (struct urequest *)&pCore->Device.Request); +} + +/* Endpoint 0 input interrupt£¨Can be classified as other endpoint input interrupt£© */ +void usbd_ep0_in_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_in_handler(udcd); +} + +/* Endpoint 0 output interrupt£¨Can be classified as other endpoint input interrupt£© */ +void usbd_ep0_out_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + pCore->Device.Transfer.sByteLength = pCore->Device.Request.wLength; + rt_usbd_ep0_out_handler(udcd, pCore->Device.Transfer.sByteLength); +} + +/* Other endpoint input interrupt */ +void usbd_ep_in_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + pCore->Device.Transfer.sByteLength = 0; + rt_usbd_ep_in_handler(udcd, EPTn | 0x80, pCore->Device.Transfer.sByteLength); +} + +/* Other Endpoint Output Interrupt */ +void usbd_ep_out_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep_out_handler(udcd, EPTn, pCore->ept_io->trans_len); +} + +/* Setting the address */ +static rt_err_t ht32_set_address(rt_uint8_t address) +{ + /* Setting the device address */ + p_usbd_instance->p_usbd_code->Info.CurrentStatus = USER_USB_STATE_ADDRESS; + API_USB_SET_ADDR(address); + return RT_EOK; +} +/* Configuration settings */ +static rt_err_t ht32_set_config(rt_uint8_t address) +{ + return RT_EOK; +} +/* endpoint pause */ +static rt_err_t ht32_ep_set_stall(rt_uint8_t address) +{ + if (0 == (address & 0x7f)) + API_USB_EPTn_SEND_STALL((USBD_EPTn_Enum)(address & 0x7f)); + else + API_USB_EPTn_SET_HALT((USBD_EPTn_Enum)(address & 0x7f)); + return RT_EOK; +} +/* Endpoint reboot*/ +static rt_err_t ht32_ep_clear_stall(rt_uint8_t address) +{ + if (0 != (address & 0x7f)) + { + API_USB_EPTn_CLR_HALT((USBD_EPTn_Enum)(address & 0x7f)); + API_USB_EPTn_CLR_DTG((USBD_EPTn_Enum)(address & 0x7f)); + } + return RT_EOK; +} +/* endpoint enable */ +static rt_err_t ht32_ep_enable(struct uendpoint *ep) +{ + /* Functions not found in the firmware library at the moment */ + RT_ASSERT(ep != RT_NULL); + RT_ASSERT(ep->ep_desc != RT_NULL); + usbd_ep_enable(p_usbd_instance->p_usbd_code, ep->ep_desc->bEndpointAddress); + return RT_EOK; +} +/* endpoint incapacity */ +static rt_err_t ht32_ep_disable(struct uendpoint *ep) +{ + /* Functions not found in the firmware library at the moment */ + RT_ASSERT(ep != RT_NULL); + RT_ASSERT(ep->ep_desc != RT_NULL); + usbd_ep_disable(p_usbd_instance->p_usbd_code, ep->ep_desc->bEndpointAddress); + return RT_EOK; +} +/* Endpoint Receive Data Preparation */ +static rt_ssize_t ht32_ep_read_prepare(rt_uint8_t address, void *buffer, rt_size_t size) +{ + USBDCore_EPTReadOUTData((USBD_EPTn_Enum)(address & 0x7f), (uint32_t *)buffer, size); + return size; +} +/* Endpoint reading data */ +static rt_ssize_t ht32_ep_read(rt_uint8_t address, void *buffer) +{ + /* Do not read data from this function */ + rt_size_t size = 0; + RT_ASSERT(buffer != RT_NULL); + return size; +} +/* Endpoint Write Data */ +static rt_ssize_t ht32_ep_write(rt_uint8_t address, void *buffer, rt_size_t size) +{ + /* Use this function to write data to a USB endpoint */ + return USBDCore_EPTWriteINData((USBD_EPTn_Enum)(address & 0x7f), (uint32_t *)buffer, size); +} +/* Endpoint 0 transmit status */ +static rt_err_t ht32_ep0_send_status(void) +{ + uint8_t Date = 0; + /* State of send endpoint 0 */ + API_USB_EPTn_WRITE_IN(USBD_EPT0, (u32*)&Date, 0); + return RT_EOK; +} +/* USB pause */ +static rt_err_t ht32_suspend(void) +{ + return RT_EOK; +} +/* USB awakens */ +static rt_err_t ht32_wakeup(void) +{ + return RT_EOK; +} + +/* USB device interface function */ +const static struct udcd_ops _udc_ops = +{ + .set_address = ht32_set_address, + .set_config = ht32_set_config, + .ep_set_stall = ht32_ep_set_stall, + .ep_clear_stall = ht32_ep_clear_stall, + .ep_enable = ht32_ep_enable, + .ep_disable = ht32_ep_disable, + .ep_read_prepare = ht32_ep_read_prepare, + .ep_read = ht32_ep_read, + .ep_write = ht32_ep_write, + .ep0_send_status = ht32_ep0_send_status, + .suspend = ht32_suspend, + .wakeup = ht32_wakeup, +}; + +static void usbd_mainroutine(void) +{ + USBDCore_MainRoutine(p_usbd_instance->p_usbd_code); +} +/* USB Device Initialisation Functions */ +static rt_err_t ht32_dcd_init(rt_device_t device) +{ + /* USB object and interface initialisation, and turning on USB interrupts */ + USB_Configuration(p_usbd_instance->p_usbd_code); + rt_thread_idle_sethook(usbd_mainroutine); + return RT_EOK; +} + +/* USB device registration function */ +int ht32_usbd_register(void) +{ + rt_size_t obj_num; + rt_err_t result = 0; + int index; + USBDCore_TypeDef *p_usbd_core = &p_usbd; + /* Calculate how many USB devices */ + obj_num = sizeof(usbd_config) / sizeof(struct ht32_usbd); + + for (index = 0; index < obj_num; index++) + { + /* Request a udcd object memory and clear it. */ + udcd_t udcd = (udcd_t)rt_malloc(sizeof(struct udcd)); + if (udcd == RT_NULL) + { + rt_kprintf("udcd malloc failed\r\n"); + return -RT_ERROR; + } + rt_memset((void *)udcd, 0, sizeof(struct udcd)); + + /* Assigning a value to the requested udcd object */ + udcd->parent.type = RT_Device_Class_USBDevice; + udcd->parent.init = ht32_dcd_init; + udcd->parent.user_data = p_usbd_core; + udcd->ops = &_udc_ops; + + p_usbd_core->pdata = udcd; + usbd_config[index].p_usbd_code = p_usbd_core; + + /* register endpoint infomation */ + udcd->ep_pool = endpoint_pool; + udcd->ep0.id = &endpoint_pool[0]; + + result = rt_device_register((rt_device_t)udcd, usbd_config[index].name, 0); + RT_ASSERT(result == RT_EOK); + + p_usbd_instance = &usbd_config[index]; + + result = rt_usb_device_init(); + RT_ASSERT(result == RT_EOK); + } + + return result; +} +INIT_DEVICE_EXPORT(ht32_usbd_register); + + +void USB_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + /* interrupt callback function */ + usbd_irq_handler(p_usbd_instance->p_usbd_code); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +#endif /* RT_USING_USB_DEVICE */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_usbd.h b/bsp/ht32/libraries/ht32_drivers/drv_usbd.h new file mode 100644 index 0000000000..9c2f652ba6 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_usbd.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-09 QT-one first version + */ + +#ifndef __DRV_USBD_H__ +#define __DRV_USBD_H__ + +#include +#include +#include "drv_common.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_USBD_H__ */ diff --git a/bsp/ht32/libraries/usbd_library/SConscript b/bsp/ht32/libraries/usbd_library/SConscript new file mode 100644 index 0000000000..7c3921200b --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/SConscript @@ -0,0 +1,22 @@ +import rtconfig +from building import * + +# get current directory +cwd = GetCurrentDir() + +# add the general drivers. +src = Split(""" +""") + +# The set of source files associated with this SConscript file. +if GetDepend(['BSP_USING_USBD']): +# src += ['src/ht32_usbd_core.c'] +# src += ['src/ht32_usbd_int.c'] + src += ['src/usbd_code.c'] + src += ['src/usb_port.c'] + +path = [cwd + '/inc'] + +group = DefineGroup('usbd_library', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/ht32/libraries/usbd_library/checkout.py b/bsp/ht32/libraries/usbd_library/checkout.py new file mode 100644 index 0000000000..19fc0ca9fc --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/checkout.py @@ -0,0 +1,39 @@ +# 假设我们有一个名为'example.txt'的文件,我们想要修改它 +header_file_path = 'inc/ht32_usbd_core.h' +source_file_path = 'src/ht32_usbd_core.c' + +def modification(file_path): + # 打开文件 + with open(file_path, 'r+') as file: # 'r+'模式允许读写 + # 读取文件内容 + content = file.read() + print("文件打开成功!") + + # 假设我们要将所有的'old_string'替换为'new_string' + # updated_content = content.replace('old_string', 'new_string') + content = content.replace('USB_STATE_UNCONNECTED', 'USER_USB_STATE_UNCONNECTED') + content = content.replace('USB_STATE_ATTACHED', 'USER_USB_STATE_ATTACHED') + content = content.replace('USB_STATE_POWERED', 'USER_USB_STATE_POWERED') + content = content.replace('USB_STATE_SUSPENDED', 'USER_USB_STATE_SUSPENDED') + content = content.replace('USB_STATE_DEFAULT', 'USER_USB_STATE_DEFAULT') + content = content.replace('USB_STATE_ADDRESS', 'USER_USB_STATE_ADDRESS') + content = content.replace('USB_STATE_CONFIGURED', 'USER_USB_STATE_CONFIGURED') + + # 移动文件指针到文件开头,准备写入 + file.seek(0) + + # 写入更新后的内容 + file.write(content) + + # 截断文件,删除旧内容(如果更新后的内容比原内容短) + file.truncate() + + +# 文件现在已经被关闭,并且更改被保存 +if __name__ == '__main__': + modification(header_file_path) + print('头文件已修改!\r\n') + modification(source_file_path) + print('源文件已修改!\r\n') + print('请输入退出:') + diff --git a/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_core.h b/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_core.h new file mode 100644 index 0000000000..1ba2309d4f --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_core.h @@ -0,0 +1,437 @@ +/*********************************************************************************************************//** + * @file ht32_usbd_core.h + * @version $Rev:: 2555 $ + * @date $Date:: 2022-03-15 #$ + * @brief The header file of standard protocol related function for HT32 USB Device Library. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +// <<< Use Configuration Wizard in Context Menu >>> + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32_USBD_CORE_H +#define __HT32_USBD_CORE_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------------------------------------*/ + +/** @addtogroup HT32_USBD_Library + * @{ + */ + +/** @addtogroup USBDCore + * @{ + */ + + +/* Settings ------------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Settings USB Device Core settings + * @{ + */ +/* USBD Debug mode */ +// Enable USB Debug mode +// Dump USB Debug data +#ifndef USBDCORE_DEBUG + #define USBDCORE_DEBUG (0) /*!< Enable USB Debug mode */ + #define USBDCORE_DEBUG_DATA (0) /*!< Dump USB Debug data */ +#endif +/** + * @} + */ + +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Type USB Device Core exported types + * @{ + */ +/** + * @brief USB Device Request. + */ +typedef __PACKED_H struct +{ + uc8 bmRequestType; + uc8 bRequest; + uc8 wValueL; + uc8 wValueH; + uc16 wIndex; + uc16 wLength; +} __PACKED_F USBDCore_Request_TypeDef; + +/** + * @brief USB Descriptor. + */ +typedef struct +{ + uc8 *pDeviceDesc; /*!< Device Descriptor */ + uc8 *pConfnDesc; /*!< Configuration Descriptor */ + uc8 **ppStringDesc; /*!< String Descriptor */ + u32 uStringDescNumber; /*!< Count of String Descriptor */ +} USBDCore_Desc_TypeDef; + +/** + * @brief STALL, control IN or control OUT. + */ +typedef enum +{ + USB_ACTION_STALL = 0, + USB_ACTION_DATAIN = 1, + USB_ACTION_DATAOUT = 2, +} USBDCore_Action_Enum; + +/** + * @brief Call back function. + */ +typedef struct +{ + void (*func) (u32 uPara); /*!< Call back function pointer */ + u32 uPara; /*!< Parameter of call back function */ +} USBDCore_CallBack_TypeDef; + +/** + * @brief Parameter for control IN/OUT Transfer. + */ +typedef struct +{ + u8 uBuffer[2]; /*!< Temporary buffer */ + uc8 *pData; /*!< Pointer of control IN/OUT Data */ + s32 sByteLength; /*!< Total length for control IN/OUT Transfer */ + USBDCore_Action_Enum Action; /*!< STALL, control IN or control OUT */ + USBDCore_CallBack_TypeDef CallBack_OUT; /*!< Call back function pointer for Control OUT */ +} USBDCore_Transfer_TypeDef; + +/** + * @brief USB Device. + */ +typedef struct +{ + USBDCore_Request_TypeDef Request; /*!< USB Device Request */ + USBDCore_Desc_TypeDef Desc; /*!< USB Descriptor */ + USBDCore_Transfer_TypeDef Transfer; /*!< Parameter for control IN/OUT Transfer */ +} USBDCore_Device_TypeDef; + +/** + * @brief Bit access for CurrentFeature. + */ +typedef __PACKED_H struct _FEATURE_TYPEBIT +{ + unsigned bSelfPowered :1; /*!< Remote Wakeup feature */ + unsigned bRemoteWakeup :1; /*!< Self Powered */ +} __PACKED_F USBDCore_Feature_TypeBit; + +/** + * @brief For Set/ClearFeature and GetStatus request. + */ +typedef __PACKED_H union _FEATURE_TYPEDEF +{ + u8 uByte; /*!< Byte access for CurrentFeature */ + USBDCore_Feature_TypeBit Bits; /*!< Bit access for CurrentFeature */ +} __PACKED_F USBDCore_Feature_TypeDef; + +/** + * @brief Device State. + */ +typedef enum +{ + USER_USER_USB_STATE_UNCONNECTED = 0, + USER_USER_USB_STATE_ATTACHED = 1, + USER_USER_USB_STATE_POWERED = 2, + USER_USER_USB_STATE_SUSPENDED = 3, + USER_USER_USB_STATE_DEFAULT = 4, + USER_USER_USB_STATE_ADDRESS = 5, + USER_USER_USB_STATE_CONFIGURED = 6, +} USBDCore_Status_Enum; + +/** + * @brief USB Device information. + */ +typedef struct +{ + u8 uCurrentConfiguration; /*!< For Set/GetConfiguration request */ + u8 uCurrentInterface; /*!< For Set/GetInterface request */ + volatile USBDCore_Status_Enum CurrentStatus; /*!< Device State */ + USBDCore_Status_Enum LastStatus; /*!< Device State before SUSPEND */ + USBDCore_Feature_TypeDef CurrentFeature; /*!< For Set/ClearFeature and GetStatus request */ + u32 uIsDiscardClearFeature; /*!< Discard ClearFeature flag for Mass Storage */ +} USBDCore_Info_TypeDef; + +typedef void (*USBDCore_CallBackClass_Typedef) (USBDCore_Device_TypeDef *pDev); +typedef void (*USBDCore_CallBackVendor_Typedef) (USBDCore_Device_TypeDef *pDev); +typedef void (*USBDCore_CallBackEPTn_Typedef) (USBD_EPTn_Enum EPTn); + +/** + * @brief USB Class call back function. + */ +typedef struct +{ + USBDCore_CallBack_TypeDef CallBack_MainRoutine; /*!< Class main routine call back function */ + USBDCore_CallBack_TypeDef CallBack_Reset; /*!< Class RESET call back function */ + USBDCore_CallBack_TypeDef CallBack_StartOfFrame; /*!< Class SOF call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassGetDescriptor; /*!< Class Get Descriptor call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassSetInterface; /*!< Set Interface call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassGetInterface; /*!< Get Interface call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassRequest; /*!< Class Request call back function */ + USBDCore_CallBackVendor_Typedef CallBack_VendorRequest; /*!< Vendor Request call back function */ + USBDCore_CallBackEPTn_Typedef CallBack_EPTn[MAX_EP_NUM]; /*!< Endpoint n call back function */ +} USBDCore_Class_TypeDef; + +/** + * @brief USB Device Power related call back function. + */ +typedef struct +{ + USBDCore_CallBack_TypeDef CallBack_Suspend; +} USBDCore_Power_TypeDef; + +/** + * @brief Major structure of USB Library. + */ +typedef struct +{ + USBDCore_Device_TypeDef Device; /*!< USB Device */ + USBDCore_Info_TypeDef Info; /*!< USB Device information */ + USBDCore_Class_TypeDef Class; /*!< USB Class call back function */ + u32 *pDriver; /*!< USB Device Driver initialization structure */ + USBDCore_Power_TypeDef Power; /*!< USB Device Power related call back function */ + + void *pdata; /*!< USB User private pointer */ +} USBDCore_TypeDef; + +/*----------------------------------------------------------------------------------------------------------*/ +/* Variable architecture of USB Library */ +/*----------------------------------------------------------------------------------------------------------*/ +/* USBCore - USBDCore_TypeDef Major structure of USB Library */ +/* USBCore.Device - USBDCore_Device_TypeDef USB Device */ +/* USBCore.Device.Request - USBDCore_Request_TypeDef USB Device Request */ +/* USBCore.Device.Request.bmRequestType */ +/* USBCore.Device.Request.bRequest */ +/* USBCore.Device.Request.wValueL */ +/* USBCore.Device.Request.wValueH */ +/* USBCore.Device.Request.wIndex */ +/* USBCore.Device.Request.wLength */ +/* USBCore.Device.Desc - USBDCore_Desc_TypeDef USB Descriptor */ +/* USBCore.Device.Desc.pDeviceDesc Device Descriptor */ +/* USBCore.Device.Desc.pConfnDesc Configuration Descriptor */ +/* USBCore.Device.Desc.pStringDesc[DESC_NUM_STRING] String Descriptor */ +/* USBCore.Device.Desc.uStringDescNumber Count of String Descriptor */ +/* USBCore.Device.Transfer - USBDCore_Transfer_TypeDef Parameter for control IN/OUT Transfer */ +/* USBCore.Device.Transfer.uBuffer[2] Temporary buffer */ +/* USBCore.Device.Transfer.pData Pointer of control IN/OUT Data */ +/* USBCore.Device.Transfer.sByteLength Total length for control IN/OUT Transfer */ +/* USBCore.Device.Transfer.Action - USBDCore_Action_Enum STALL, control IN or control OUT */ +/* USBCore.Device.Transfer.CallBack_OUT.func(uPara) Call back function pointer for Control OUT */ +/* USBCore.Device.Transfer.CallBack_OUT.uPara Parameter of Control OUT call back function */ +/* */ +/* USBCore.Info - USBDCore_Info_TypeDef USB Device information */ +/* USBCore.Info.uCurrentConfiguration For Set/GetConfiguration request */ +/* USBCore.Info.uCurrentInterface For Set/GetInterface request */ +/* USBCore.Info.CurrentStatus - USBDCore_Status_Enum Device State */ +/* USBCore.Info.LastStatus - USBDCore_Status_Enum Device State before SUSPEND */ +/* USBCore.Info.CurrentFeature - USBDCore_Feature_TypeDef For Set/ClearFeature and GetStatus request */ +/* USBCore.Info.CurrentFeature.uByte Byte access for CurrentFeature */ +/* USBCore.Info.CurrentFeature.Bits.bRemoteWakeup Remote Wakeup feature */ +/* USBCore.Info.CurrentFeature.Bits.bSelfPowered Self Powered */ +/* USBCore.Info.uIsDiscardClearFeature Discard ClearFeature flag for Mass Storage */ +/* */ +/* USBCore.Class - USBDCore_Class_TypeDef USB Class call back function */ +/* USBCore.Class.CallBack_MainRoutine.func(uPara) Class main routine call back function */ +/* USBCore.Class.CallBack_MainRoutine.uPara Parameter of class main routine */ +/* USBCore.Class.CallBack_Reset.func(uPara) Class RESET call back function */ +/* USBCore.Class.CallBack_Reset.uPara Parameter of RESET call back function */ +/* USBCore.Class.CallBack_StartOfFrame.func(uPara) Class SOF call back function */ +/* USBCore.Class.CallBack_StartOfFrame.uPara Parameter of SOF call back function */ +/* USBCore.Class.CallBack_ClassGetDescriptor(pDev) Class Get Descriptor call back function */ +/* USBCore.Class.CallBack_ClassSetInterface(pDev) Set Interface call back function */ +/* USBCore.Class.CallBack_ClassGetInterface(pDev) Get Interface call back function */ +/* USBCore.Class.CallBack_ClassRequest(pDev) Class Request call back function */ +/* USBCore.Class.CallBack_EPTn[MAX_EP_NUM](EPTn) Endpoint n call back function */ +/* */ +/* USBCore.pDriver USB Device Driver initialization structure */ +/* */ +/* USBCore.Power - USBDCore_Power_TypeDef USB Device Power related call back function */ +/* USBCore.Power.CallBack_Suspend.func(uPara) System low power function for SUSPEND */ +/* USBCore.Power.CallBack_Suspend.uPara Parameter of system low power function */ +/*----------------------------------------------------------------------------------------------------------*/ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Constant USB Device Core exported constants + * @{ + */ + +/** @defgroup USBDCore_Descriptor Definitions for USB descriptor + * @{ + */ +#define DESC_TYPE_01_DEV (0x1) +#define DESC_TYPE_02_CONFN (0x2) +#define DESC_TYPE_03_STR (0x3) +#define DESC_TYPE_04_INF (0x4) +#define DESC_TYPE_05_EPT (0x5) +#define DESC_TYPE_06_DEV_QLF (0x6) +#define DESC_TYPE_08_INF_PWR (0x8) + +#define DESC_CLASS_00_BY_INF (0x00) +#define DESC_CLASS_01_AUDIO (0x01) +#define DESC_CLASS_02_CDC_CTRL (0x02) +#define DESC_CLASS_03_HID (0x03) +#define DESC_CLASS_05_PHY (0x05) +#define DESC_CLASS_06_STILL_IMG (0x06) +#define DESC_CLASS_07_PRINTER (0x07) +#define DESC_CLASS_08_MASS_STORAGE (0x08) +#define DESC_CLASS_09_HUB (0x09) +#define DESC_CLASS_0A_CDC_DATA (0x0A) +#define DESC_CLASS_0B_SMART_CARD (0x0B) +#define DESC_CLASS_0E_VIDEO (0x0E) +#define DESC_CLASS_0F_PHD (0x0F) +#define DESC_CLASS_FF_VENDOR (0xFF) + +#define DESC_LEN_DEV ((u32)(18)) +#define DESC_LEN_CONFN ((u32)(9)) +#define DESC_LEN_INF ((u32)(9)) +#define DESC_LEN_EPT ((u32)(7)) +/** + * @} + */ + +/** @defgroup USBDCore_Request Definitions for USB Request + * @{ + */ +#define REQ_DIR_00_H2D (0 << 7) +#define REQ_DIR_01_D2H (1 << 7) + +#define REQ_TYPE_00_STD (0 << 5) +#define REQ_TYPE_01_CLS (1 << 5) +#define REQ_TYPE_02_VND (2 << 5) + +#define REQ_REC_00_DEV (0) +#define REQ_REC_01_INF (1) +#define REQ_REC_02_EPT (2) +/** + * @} + */ + +/** + * @brief For USBDCore_EPTReadOUTData function. + */ +#define USB_DISCARD_OUT_DATA (0) + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Macro USB Device Core exported macros + * @{ + */ +#define __DBG_USBPrintf(...) +#define __DBG_USBDump(a, b) + +#if (USBDCORE_DEBUG == 1) + #ifndef RETARGET_IS_USB + extern u32 __DBG_USBCount; + #undef __DBG_USBPrintf + #define __DBG_USBPrintf printf + #if (USBDCORE_DEBUG_DATA == 1) + #undef __DBG_USBDump + void __DBG_USBDump(uc8 *memory, u32 len); + #endif + #endif +#endif + +/** + * @brief Convert Half-Word to Byte for descriptor. + */ +#define DESC_H2B(Val) ((u8)(Val & 0x00FF)), ((u8)((Val & 0xFF00) >> 8)) + +/** + * @brief Padding 0 automatically for String descriptor. + */ +#define DESC_CHAR(c) (c), (0) + +/** + * @brief Calculate String length for String descriptor. + */ +#define DESC_STRLEN(n) (n * 2 + 2) + +/** + * @brief Calculate power for Configuration descriptor. + */ +#define DESC_POWER(mA) (mA / 2) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Functions USB Device Core exported functions + * @{ + */ +#define USBDCore_DeInit API_USB_DEINIT +#define USBDCore_EPTReset API_USB_EPTn_RESET +#define USBDCore_EPTGetBufferLen API_USB_EPTn_GET_BUFFLEN +#define USBDCore_EPTGetTransferCount API_USB_EPTn_GET_CNT +#define USBDCore_EPTSetSTALL API_USB_EPTn_SET_HALT +#define USBDCore_EPTWaitSTALLSent API_USB_EPTn_WAIT_STALL_SENT +#define USBDCore_EPTClearDataToggle API_USB_EPTn_CLR_DTG + +#define USBDCore_EPTWriteINData API_USB_EPTn_WRITE_IN +#define USBDCore_EPTReadOUTData API_USB_EPTn_READ_OUT +#define USBDCore_EPTReadMemory API_USB_EPTn_READ_MEM + +void USBDCore_Init(USBDCore_TypeDef *pCore); +void USBDCore_IRQHandler(USBDCore_TypeDef *pCore); +void USBDCore_MainRoutine(USBDCore_TypeDef *pCore); +u32 USBDCore_IsSuspend(USBDCore_TypeDef *pCore); +u32 USBDCore_GetRemoteWakeUpFeature(USBDCore_TypeDef *pCore); +void USBDCore_TriggerRemoteWakeup(void); +USBDCore_Status_Enum USBDCore_GetStatus(void); + +void USBDCore_EPTReset(USBD_EPTn_Enum USBD_EPTn); +u32 USBDCore_EPTGetBufferLen(USBD_EPTn_Enum USBD_EPTn); +u32 USBDCore_EPTGetTransferCount(USBD_EPTn_Enum USBD_EPTn, USBD_TCR_Enum type); +void USBDCore_EPTSetSTALL(USBD_EPTn_Enum USBD_EPTn); +void USBDCore_EPTWaitSTALLSent(USBD_EPTn_Enum USBD_EPTn); +void USBDCore_EPTClearDataToggle(USBD_EPTn_Enum USBD_EPTn); + +u32 USBDCore_EPTWriteINData(USBD_EPTn_Enum USBD_EPTn, u32 *pFrom, u32 len); +u32 USBDCore_EPTReadOUTData(USBD_EPTn_Enum USBD_EPTn, u32 *pTo, u32 len); +u32 USBDCore_EPTReadMemory(USBD_EPTn_Enum USBD_EPTn, u32 *pTo, u32 len); +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __HT32_USBD_CORE_H -------------------------------------------------------------------------------*/ diff --git a/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_int.h b/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_int.h new file mode 100644 index 0000000000..87e4bd2ebd --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_int.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-11 QT-one first version + */ + +#ifndef __HT32_USBD_INT_H__ +#define __HT32_USBD_INT_H__ + +#include +#include +#include "drv_common.h" + +#include "ht32_usbd_core.h" + +#ifdef __cplusplus +extern "C" { +#endif + + + + + /* º¯ÊýÉùÃ÷ */ + void usbd_sof_callback(USBDCore_TypeDef *pCore); + void usbd_reset_callback(USBDCore_TypeDef *pCore); + void usbd_suspend_callback(USBDCore_TypeDef *pCore); + void usbd_resume_callback(USBDCore_TypeDef *pCore); + + void usbd_setup_callback(USBDCore_TypeDef *pCore); + void usbd_ep0_in_callback(USBDCore_TypeDef *pCore); + void usbd_ep0_out_callback(USBDCore_TypeDef *pCore); + + void usbd_ep_in_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn); + void usbd_ep_out_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn); + +// void USB_Configuration(USBDCore_TypeDef *pCore); + + + +#ifdef __cplusplus +} +#endif + +#endif /* __HT32_USBD_INT_H__ */ diff --git a/bsp/ht32/libraries/usbd_library/inc/usb_port.h b/bsp/ht32/libraries/usbd_library/inc/usb_port.h new file mode 100644 index 0000000000..de96b24b04 --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/inc/usb_port.h @@ -0,0 +1,29 @@ + +#ifndef _USB_PORT_H +#define _USB_PORT_H + +#include "ht32.h" +//#include "ht32_usbd_core.h" +#include "usbd_code.h" + + +#define HT32F_DVB_USBConnect() USBD_DPpullupCmd(ENABLE) +#define HT32F_DVB_USBDisConnect() USBD_DPpullupCmd(DISABLE) + + +/* º¯ÊýÉùÃ÷ */ +void usbd_sof_callback(USBDCore_TypeDef *pCore); +void usbd_reset_callback(USBDCore_TypeDef *pCore); +void usbd_suspend_callback(USBDCore_TypeDef *pCore); +void usbd_resume_callback(USBDCore_TypeDef *pCore); + +void usbd_setup_callback(USBDCore_TypeDef *pCore); +void usbd_ep0_in_callback(USBDCore_TypeDef *pCore); +void usbd_ep0_out_callback(USBDCore_TypeDef *pCore); + +void usbd_ep_in_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn); +void usbd_ep_out_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn); + +void USB_Configuration(USBDCore_TypeDef *pCore); + +#endif /* _USB_PORT_H */ diff --git a/bsp/ht32/libraries/usbd_library/inc/usbd_code.h b/bsp/ht32/libraries/usbd_library/inc/usbd_code.h new file mode 100644 index 0000000000..fe27279b89 --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/inc/usbd_code.h @@ -0,0 +1,434 @@ + + + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __USBD_CODE_H +#define __USBD_CODE_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------------------------------------*/ +#include "ht32.h" +/** @addtogroup HT32_USBD_Library + * @{ + */ + +/** @addtogroup USBDCore + * @{ + */ + + +/* Settings ------------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Settings USB Device Core settings + * @{ + */ +/* USBD Debug mode */ +// Enable USB Debug mode +// Dump USB Debug data +#ifndef USBDCORE_DEBUG + #define USBDCORE_DEBUG (0) /*!< Enable USB Debug mode */ + #define USBDCORE_DEBUG_DATA (0) /*!< Dump USB Debug data */ +#endif +/** + * @} + */ + +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Type USB Device Core exported types + * @{ + */ +/** + * @brief USB Device Request. + */ +typedef __PACKED_H struct +{ + uc8 bmRequestType; + uc8 bRequest; + uc8 wValueL; + uc8 wValueH; + uc16 wIndex; + uc16 wLength; +} __PACKED_F USBDCore_Request_TypeDef; + +/** + * @brief USB Descriptor. + */ +typedef struct +{ + uc8 *pDeviceDesc; /*!< Device Descriptor */ + uc8 *pConfnDesc; /*!< Configuration Descriptor */ + uc8 **ppStringDesc; /*!< String Descriptor */ + u32 uStringDescNumber; /*!< Count of String Descriptor */ +} USBDCore_Desc_TypeDef; + +/** + * @brief STALL, control IN or control OUT. + */ +typedef enum +{ + USB_ACTION_STALL = 0, + USB_ACTION_DATAIN = 1, + USB_ACTION_DATAOUT = 2, +} USBDCore_Action_Enum; + +/** + * @brief Call back function. + */ +typedef struct +{ + void (*func) (u32 uPara); /*!< Call back function pointer */ + u32 uPara; /*!< Parameter of call back function */ +} USBDCore_CallBack_TypeDef; + +/** + * @brief Parameter for control IN/OUT Transfer. + */ +typedef struct +{ + u8 uBuffer[2]; /*!< Temporary buffer */ + uc8 *pData; /*!< Pointer of control IN/OUT Data */ + s32 sByteLength; /*!< Total length for control IN/OUT Transfer */ + USBDCore_Action_Enum Action; /*!< STALL, control IN or control OUT */ + USBDCore_CallBack_TypeDef CallBack_OUT; /*!< Call back function pointer for Control OUT */ +} USBDCore_Transfer_TypeDef; + +/** + * @brief USB Device. + */ +typedef struct +{ + USBDCore_Request_TypeDef Request; /*!< USB Device Request */ + USBDCore_Desc_TypeDef Desc; /*!< USB Descriptor */ + USBDCore_Transfer_TypeDef Transfer; /*!< Parameter for control IN/OUT Transfer */ +} USBDCore_Device_TypeDef; + +/** + * @brief Bit access for CurrentFeature. + */ +typedef __PACKED_H struct _FEATURE_TYPEBIT +{ + unsigned bSelfPowered :1; /*!< Remote Wakeup feature */ + unsigned bRemoteWakeup :1; /*!< Self Powered */ +} __PACKED_F USBDCore_Feature_TypeBit; + +/** + * @brief For Set/ClearFeature and GetStatus request. + */ +typedef __PACKED_H union _FEATURE_TYPEDEF +{ + u8 uByte; /*!< Byte access for CurrentFeature */ + USBDCore_Feature_TypeBit Bits; /*!< Bit access for CurrentFeature */ +} __PACKED_F USBDCore_Feature_TypeDef; + +/** + * @brief Device State. + */ +typedef enum +{ + USER_USB_STATE_UNCONNECTED = 0, + USER_USB_STATE_ATTACHED = 1, + USER_USB_STATE_POWERED = 2, + USER_USB_STATE_SUSPENDED = 3, + USER_USB_STATE_DEFAULT = 4, + USER_USB_STATE_ADDRESS = 5, + USER_USB_STATE_CONFIGURED = 6, +} USBDCore_Status_Enum; + +/** + * @brief USB Device information. + */ +typedef struct +{ + u8 uCurrentConfiguration; /*!< For Set/GetConfiguration request */ + u8 uCurrentInterface; /*!< For Set/GetInterface request */ + volatile USBDCore_Status_Enum CurrentStatus; /*!< Device State */ + USBDCore_Status_Enum LastStatus; /*!< Device State before SUSPEND */ + USBDCore_Feature_TypeDef CurrentFeature; /*!< For Set/ClearFeature and GetStatus request */ + u32 uIsDiscardClearFeature; /*!< Discard ClearFeature flag for Mass Storage */ +} USBDCore_Info_TypeDef; + +typedef void (*USBDCore_CallBackClass_Typedef) (USBDCore_Device_TypeDef *pDev); +typedef void (*USBDCore_CallBackVendor_Typedef) (USBDCore_Device_TypeDef *pDev); +typedef void (*USBDCore_CallBackEPTn_Typedef) (USBD_EPTn_Enum EPTn); + +/** + * @brief USB Class call back function. + */ +typedef struct +{ + USBDCore_CallBack_TypeDef CallBack_MainRoutine; /*!< Class main routine call back function */ + USBDCore_CallBack_TypeDef CallBack_Reset; /*!< Class RESET call back function */ + USBDCore_CallBack_TypeDef CallBack_StartOfFrame; /*!< Class SOF call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassGetDescriptor; /*!< Class Get Descriptor call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassSetInterface; /*!< Set Interface call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassGetInterface; /*!< Get Interface call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassRequest; /*!< Class Request call back function */ + USBDCore_CallBackVendor_Typedef CallBack_VendorRequest; /*!< Vendor Request call back function */ + USBDCore_CallBackEPTn_Typedef CallBack_EPTn[MAX_EP_NUM]; /*!< Endpoint n call back function */ +} USBDCore_Class_TypeDef; + +/** + * @brief USB Device Power related call back function. + */ +typedef struct +{ + USBDCore_CallBack_TypeDef CallBack_Suspend; +} USBDCore_Power_TypeDef; + +/** + * @brief USB EP TypeDef. + */ +typedef struct +{ + uint16_t maxpacket; /*!< endpoint max packet*/ + uint16_t status; /*!< endpoint status */ + /* transmission buffer and count */ + uint16_t total_len; /*!< endpoint transmission total length */ + uint16_t trans_len; /*!< endpoint transmission length*/ + uint8_t *trans_buf; /*!< endpoint transmission buffer */ +} usb_ept_info; + + + +/** + * @brief Major structure of USB Library. + */ +typedef struct +{ + USBDCore_Device_TypeDef Device; /*!< USB Device */ + USBDCore_Info_TypeDef Info; /*!< USB Device information */ + USBDCore_Class_TypeDef Class; /*!< USB Class call back function */ + u32 *pDriver; /*!< USB Device Driver initialization structure */ + USBDCore_Power_TypeDef Power; /*!< USB Device Power related call back function */ + + usb_ept_info ept_io[8]; /*!< */ + void *pdata; /*!< USB User private pointer */ +} USBDCore_TypeDef; + +/*----------------------------------------------------------------------------------------------------------*/ +/* Variable architecture of USB Library */ +/*----------------------------------------------------------------------------------------------------------*/ +/* USBCore - USBDCore_TypeDef Major structure of USB Library */ +/* USBCore.Device - USBDCore_Device_TypeDef USB Device */ +/* USBCore.Device.Request - USBDCore_Request_TypeDef USB Device Request */ +/* USBCore.Device.Request.bmRequestType */ +/* USBCore.Device.Request.bRequest */ +/* USBCore.Device.Request.wValueL */ +/* USBCore.Device.Request.wValueH */ +/* USBCore.Device.Request.wIndex */ +/* USBCore.Device.Request.wLength */ +/* USBCore.Device.Desc - USBDCore_Desc_TypeDef USB Descriptor */ +/* USBCore.Device.Desc.pDeviceDesc Device Descriptor */ +/* USBCore.Device.Desc.pConfnDesc Configuration Descriptor */ +/* USBCore.Device.Desc.pStringDesc[DESC_NUM_STRING] String Descriptor */ +/* USBCore.Device.Desc.uStringDescNumber Count of String Descriptor */ +/* USBCore.Device.Transfer - USBDCore_Transfer_TypeDef Parameter for control IN/OUT Transfer */ +/* USBCore.Device.Transfer.uBuffer[2] Temporary buffer */ +/* USBCore.Device.Transfer.pData Pointer of control IN/OUT Data */ +/* USBCore.Device.Transfer.sByteLength Total length for control IN/OUT Transfer */ +/* USBCore.Device.Transfer.Action - USBDCore_Action_Enum STALL, control IN or control OUT */ +/* USBCore.Device.Transfer.CallBack_OUT.func(uPara) Call back function pointer for Control OUT */ +/* USBCore.Device.Transfer.CallBack_OUT.uPara Parameter of Control OUT call back function */ +/* */ +/* USBCore.Info - USBDCore_Info_TypeDef USB Device information */ +/* USBCore.Info.uCurrentConfiguration For Set/GetConfiguration request */ +/* USBCore.Info.uCurrentInterface For Set/GetInterface request */ +/* USBCore.Info.CurrentStatus - USBDCore_Status_Enum Device State */ +/* USBCore.Info.LastStatus - USBDCore_Status_Enum Device State before SUSPEND */ +/* USBCore.Info.CurrentFeature - USBDCore_Feature_TypeDef For Set/ClearFeature and GetStatus request */ +/* USBCore.Info.CurrentFeature.uByte Byte access for CurrentFeature */ +/* USBCore.Info.CurrentFeature.Bits.bRemoteWakeup Remote Wakeup feature */ +/* USBCore.Info.CurrentFeature.Bits.bSelfPowered Self Powered */ +/* USBCore.Info.uIsDiscardClearFeature Discard ClearFeature flag for Mass Storage */ +/* */ +/* USBCore.Class - USBDCore_Class_TypeDef USB Class call back function */ +/* USBCore.Class.CallBack_MainRoutine.func(uPara) Class main routine call back function */ +/* USBCore.Class.CallBack_MainRoutine.uPara Parameter of class main routine */ +/* USBCore.Class.CallBack_Reset.func(uPara) Class RESET call back function */ +/* USBCore.Class.CallBack_Reset.uPara Parameter of RESET call back function */ +/* USBCore.Class.CallBack_StartOfFrame.func(uPara) Class SOF call back function */ +/* USBCore.Class.CallBack_StartOfFrame.uPara Parameter of SOF call back function */ +/* USBCore.Class.CallBack_ClassGetDescriptor(pDev) Class Get Descriptor call back function */ +/* USBCore.Class.CallBack_ClassSetInterface(pDev) Set Interface call back function */ +/* USBCore.Class.CallBack_ClassGetInterface(pDev) Get Interface call back function */ +/* USBCore.Class.CallBack_ClassRequest(pDev) Class Request call back function */ +/* USBCore.Class.CallBack_EPTn[MAX_EP_NUM](EPTn) Endpoint n call back function */ +/* */ +/* USBCore.pDriver USB Device Driver initialization structure */ +/* */ +/* USBCore.Power - USBDCore_Power_TypeDef USB Device Power related call back function */ +/* USBCore.Power.CallBack_Suspend.func(uPara) System low power function for SUSPEND */ +/* USBCore.Power.CallBack_Suspend.uPara Parameter of system low power function */ +/*----------------------------------------------------------------------------------------------------------*/ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Constant USB Device Core exported constants + * @{ + */ + +/** @defgroup USBDCore_Descriptor Definitions for USB descriptor + * @{ + */ +#define DESC_TYPE_01_DEV (0x1) +#define DESC_TYPE_02_CONFN (0x2) +#define DESC_TYPE_03_STR (0x3) +#define DESC_TYPE_04_INF (0x4) +#define DESC_TYPE_05_EPT (0x5) +#define DESC_TYPE_06_DEV_QLF (0x6) +#define DESC_TYPE_08_INF_PWR (0x8) + +#define DESC_CLASS_00_BY_INF (0x00) +#define DESC_CLASS_01_AUDIO (0x01) +#define DESC_CLASS_02_CDC_CTRL (0x02) +#define DESC_CLASS_03_HID (0x03) +#define DESC_CLASS_05_PHY (0x05) +#define DESC_CLASS_06_STILL_IMG (0x06) +#define DESC_CLASS_07_PRINTER (0x07) +#define DESC_CLASS_08_MASS_STORAGE (0x08) +#define DESC_CLASS_09_HUB (0x09) +#define DESC_CLASS_0A_CDC_DATA (0x0A) +#define DESC_CLASS_0B_SMART_CARD (0x0B) +#define DESC_CLASS_0E_VIDEO (0x0E) +#define DESC_CLASS_0F_PHD (0x0F) +#define DESC_CLASS_FF_VENDOR (0xFF) + +#define DESC_LEN_DEV ((u32)(18)) +#define DESC_LEN_CONFN ((u32)(9)) +#define DESC_LEN_INF ((u32)(9)) +#define DESC_LEN_EPT ((u32)(7)) +/** + * @} + */ + +/** @defgroup USBDCore_Request Definitions for USB Request + * @{ + */ +#define REQ_DIR_00_H2D (0 << 7) +#define REQ_DIR_01_D2H (1 << 7) + +#define REQ_TYPE_00_STD (0 << 5) +#define REQ_TYPE_01_CLS (1 << 5) +#define REQ_TYPE_02_VND (2 << 5) + +#define REQ_REC_00_DEV (0) +#define REQ_REC_01_INF (1) +#define REQ_REC_02_EPT (2) +/** + * @} + */ + +/** + * @brief For USBDCore_EPTReadOUTData function. + */ +#define USB_DISCARD_OUT_DATA (0) + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Macro USB Device Core exported macros + * @{ + */ +#define __DBG_USBPrintf(...) +#define __DBG_USBDump(a, b) + +#if (USBDCORE_DEBUG == 1) + #ifndef RETARGET_IS_USB + extern u32 __DBG_USBCount; + #undef __DBG_USBPrintf + #define __DBG_USBPrintf printf + #if (USBDCORE_DEBUG_DATA == 1) + #undef __DBG_USBDump + void __DBG_USBDump(uc8 *memory, u32 len); + #endif + #endif +#endif + +/** + * @brief Convert Half-Word to Byte for descriptor. + */ +#define DESC_H2B(Val) ((u8)(Val & 0x00FF)), ((u8)((Val & 0xFF00) >> 8)) + +/** + * @brief Padding 0 automatically for String descriptor. + */ +#define DESC_CHAR(c) (c), (0) + +/** + * @brief Calculate String length for String descriptor. + */ +#define DESC_STRLEN(n) (n * 2 + 2) + +/** + * @brief Calculate power for Configuration descriptor. + */ +#define DESC_POWER(mA) (mA / 2) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Functions USB Device Core exported functions + * @{ + */ +#define USBDCore_DeInit API_USB_DEINIT +#define USBDCore_EPTReset API_USB_EPTn_RESET +#define USBDCore_EPTGetBufferLen API_USB_EPTn_GET_BUFFLEN +#define USBDCore_EPTGetTransferCount API_USB_EPTn_GET_CNT +#define USBDCore_EPTSetSTALL API_USB_EPTn_SET_HALT +#define USBDCore_EPTWaitSTALLSent API_USB_EPTn_WAIT_STALL_SENT +#define USBDCore_EPTClearDataToggle API_USB_EPTn_CLR_DTG + +#define USBDCore_EPTWriteINData API_USB_EPTn_WRITE_IN +#define USBDCore_EPTReadOUTData API_USB_EPTn_READ_OUT +#define USBDCore_EPTReadMemory API_USB_EPTn_READ_MEM + + +void usbd_irq_handler(USBDCore_TypeDef *pCore); +void USBDCore_Init(USBDCore_TypeDef *pCore); +void USBDCore_MainRoutine(USBDCore_TypeDef *pCore); + +void usbd_ep_enable(USBDCore_TypeDef *pCore, uint8_t ept_addr); +void usbd_ep_disable(USBDCore_TypeDef *pCore, uint8_t ept_addr); +void usbd_ept_recv(USBDCore_TypeDef *udev, uint8_t ept_addr, uint8_t *buffer, uint16_t len); +//u32 USBDCore_IsSuspend(USBDCore_TypeDef *pCore); +//u32 USBDCore_GetRemoteWakeUpFeature(USBDCore_TypeDef *pCore); +//void USBDCore_TriggerRemoteWakeup(void); +//USBDCore_Status_Enum USBDCore_GetStatus(void); + +void USBDCore_EPTReset(USBD_EPTn_Enum USBD_EPTn); +u32 USBDCore_EPTGetBufferLen(USBD_EPTn_Enum USBD_EPTn); +u32 USBDCore_EPTGetTransferCount(USBD_EPTn_Enum USBD_EPTn, USBD_TCR_Enum type); +void USBDCore_EPTSetSTALL(USBD_EPTn_Enum USBD_EPTn); +void USBDCore_EPTWaitSTALLSent(USBD_EPTn_Enum USBD_EPTn); +void USBDCore_EPTClearDataToggle(USBD_EPTn_Enum USBD_EPTn); + +u32 USBDCore_EPTWriteINData(USBD_EPTn_Enum USBD_EPTn, u32 *pFrom, u32 len); +u32 USBDCore_EPTReadOUTData(USBD_EPTn_Enum USBD_EPTn, u32 *pTo, u32 len); +u32 USBDCore_EPTReadMemory(USBD_EPTn_Enum USBD_EPTn, u32 *pTo, u32 len); +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CODE_H -------------------------------------------------------------------------------*/ + diff --git a/bsp/ht32/libraries/usbd_library/src/ht32_usbd_core.c b/bsp/ht32/libraries/usbd_library/src/ht32_usbd_core.c new file mode 100644 index 0000000000..e7a488ce2e --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/src/ht32_usbd_core.c @@ -0,0 +1,1069 @@ +/*********************************************************************************************************//** + * @file ht32_usbd_core.c + * @version $Rev:: 1684 $ + * @date $Date:: 2019-05-07 #$ + * @brief The standard protocol related function of HT32 USB Device Library. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ + +/* Includes ------------------------------------------------------------------------------------------------*/ +#include "ht32.h" +#include "ht32_usbd_core.h" +#include "usb_port.h" + + +#ifdef USBD_VENDOR_SUPPORT + #include "ht32_usbd_vendor.c" +#endif + +/** @addtogroup HT32_USBD_Library HT32 USB Device Library + * @{ + */ + +/** @defgroup USBDCore USB Device Core + * @brief USB Device Core standard protocol related function + * @{ + */ + + +/* Private types -------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_TypesDefinitions USB Device Core private types definitions + * @{ + */ +typedef enum +{ + Device = 0, + Interface = 1, + Endpoint = 2, + Other = 3, +} USBDCore_Recipient_Enum; + +typedef enum +{ + ClearFeature = 0, + SetFeature = 1, +} USBDCore_SetClearFeature_Enum; +/** + * @} + */ + +/* Private constants ---------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_Define USB Device Core private definitions + * @{ + */ +/* USBD Debug mode */ +#if (USBDCORE_DEBUG == 1) + #ifdef RETARGET_IS_USB + #warning "USB debug mode can not work when retaget to USB Virtual COM. Turn off automatically." + #undef USBDCORE_DEBUG + #define USBDCORE_DEBUG 0 + #else + u32 __DBG_USBCount; + #warning "USB debug mode has been enabled which degrade the performance." + #warning "After the debug operation, please remember to turn off USB debug mode." + #endif +#endif + +/** @defgroup USBDCore_STD Definition for standard request + * @{ + */ +#define REQ_00_GET_STAT ((u16)(0 << 8)) +#define REQ_01_CLR_FETU ((u16)(1 << 8)) +#define REQ_03_SET_FETU ((u16)(3 << 8)) +#define REQ_05_SET_ADDR ((u16)(5 << 8)) +#define REQ_06_GET_DESC ((u16)(6 << 8)) +#define REQ_07_SET_DESC ((u16)(7 << 8)) +#define REQ_08_GET_CONF ((u16)(8 << 8)) +#define REQ_09_SET_CONF ((u16)(9 << 8)) +#define REQ_10_GET_INF ((u16)(10 << 8)) +#define REQ_11_SET_INF ((u16)(11 << 8)) +#define REQ_12_SYN_FRME ((u16)(12 << 8)) +/** + * @} + */ + +#define DESC_TYPE_01_DEV (0x1) +#define DESC_TYPE_02_CONFN (0x2) +#define DESC_TYPE_03_STR (0x3) +#define USB_NO_DATA (-1) /*!< For Device.Transfer.sByteLength */ +#define BMREQUEST_TYPE_MASK (0x6 << 4) /*!< bmRequestType[6:5] */ +#define USB_FEATURE_REMOTE_WAKEUP (1) + +#define MAX_CONTROL_OUT_SIZE (64) +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------------------------------------*/ +static void _USBDCore_PowerHandler(USBDCore_TypeDef *pCore); +static void _USBDCore_Reset(USBDCore_TypeDef *pCore); +static void _USBDCore_Resume(USBDCore_TypeDef *pCore); +static void _USBDCore_Suspend(USBDCore_TypeDef *pCore); +static void _USBDCore_Setup(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_Request(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_GetStatus(USBDCore_TypeDef *pCore, USBDCore_Recipient_Enum recipient); +static void _USBDCore_Standard_SetClearFeature(USBDCore_TypeDef *pCore, USBDCore_Recipient_Enum recipient, USBDCore_SetClearFeature_Enum type); +static void _USBDCore_Standard_SetAddress(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_GetDescriptor(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_GetConfiguration(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_SetConfiguration(USBDCore_TypeDef *pCore); +static void _USBDCore_ControlIN(USBDCore_TypeDef *pCore); +static void _USBDCore_ControlOUT(USBDCore_TypeDef *pCore); + +/* Private macro -------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_Macro USB Device Core private macros + * @{ + */ +/** + * @brief Get self powered bit from Device descriptor + */ +#define _GET_SELFPOWERED_FROM_DESC() (((pCore->Device.Desc.pConfnDesc[7]) >> 6) & 0x01) +/** + * @} + */ + +/* Private variables ---------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_Variable USB Device Core private variables + * @{ + */ +USBDCore_TypeDef *pUSBCore; +/** + * @} + */ + + +/* Global Function -----------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Functions USB Device Core exported functions + * @{ + */ +/*********************************************************************************************************//** + * @brief USB Core initialization. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_Init(USBDCore_TypeDef *pCore) +{ + pUSBCore = pCore; + pCore->Info.CurrentStatus = USER_USER_USB_STATE_POWERED; + API_USB_INIT(pCore->pDriver); + __DBG_USBPrintf("\r\n%06ld \r\n", ++__DBG_USBCount); + return; +} + +/*********************************************************************************************************//** + * @brief USB Interrupt Service Routine. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_IRQHandler(USBDCore_TypeDef *pCore) +{ + u32 USBISRFlag = API_USB_GET_INT(); + u32 USBEPTISRFlag; + USBD_EPTn_Enum EPTn; + +#if (USBDCORE_DEBUG == 1) + u32 USBAddr = HT_USB->DEVAR; +#endif + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB SOF Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SOF_INT(USBISRFlag)) + { + __DBG_USBPrintf("%06ld SOF[%02d][%02lX]\r\n", ++__DBG_USBCount, pCore->Info.CurrentStatus, USBAddr); + if (pCore->Class.CallBack_StartOfFrame.func != NULL) + { + pCore->Class.CallBack_StartOfFrame.func(pCore->Class.CallBack_StartOfFrame.uPara); + } + + usbd_sof_callback(pCore); + + API_USB_CLR_SOF_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB SUSPEND Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SUSPEND_INT(USBISRFlag)) + { + __DBG_USBPrintf("%06ld SUSPEND[%02d]\r\n", ++__DBG_USBCount, pCore->Info.CurrentStatus); + API_USB_CLR_SUSPEND_INT(); + _USBDCore_Suspend(pCore); + +// usbd_suspend_callback(pCore); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB RESET Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_RESET_INT(USBISRFlag)) + { + if (API_USB_IS_FRES_INT(USBISRFlag)) + { + API_USB_CLR_FRES_INT(); + } + else + { + __DBG_USBPrintf("%06ld RESET[%02d][%02lX]\r\n", ++__DBG_USBCount, pCore->Info.CurrentStatus, USBAddr); + _USBDCore_Reset(pCore); + if (pCore->Class.CallBack_Reset.func != NULL) + { + pCore->Class.CallBack_Reset.func(pCore->Class.CallBack_Reset.uPara); + } + + usbd_reset_callback(pCore); + } + API_USB_CLR_RESET_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB RESUME Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_RESUME_INT(USBISRFlag)) + { + __DBG_USBPrintf("%06ld RESUME\r\n", ++__DBG_USBCount); + _USBDCore_Resume(pCore); + +// usbd_resume_callback(pCore); + + API_USB_CLR_RESUME_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB Endpoint 0 interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_EPTn_INT(USBISRFlag, USBD_EPT0)) + { + USBEPTISRFlag = API_USB_EPTn_GET_INT(USBD_EPT0); + + /*------------------------------------------------------------------------------------------------------*/ + /* Control SETUP Stage */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SETUP_INT(USBEPTISRFlag)) + { + API_USB_READ_SETUP(&(pCore->Device.Request)); /* Read SETUP Command data from USB Buffer*/ + + __DBG_USBPrintf("%06ld SETUP\t[08]\r\n", ++__DBG_USBCount); + __DBG_USBDump((uc8 *) & (pCore->Device.Request), 8); + +// _USBDCore_Setup(pCore); + + usbd_setup_callback(pCore); + + API_USB_CLR_SETUP_INT(); /* Clear SETUP Interrupt */ + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Control Endpoint 0 IN */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_EPTn_IS_IN_INT(USBEPTISRFlag)) + { + __DBG_USBPrintf("%06ld EP0IN\t[%02ld]", ++__DBG_USBCount, pCore->Device.Transfer.sByteLength); + +// _USBDCore_ControlIN(pCore); + + usbd_ep0_in_callback(pCore); + + API_USB_EPTn_CLR_IN_INT(USBD_EPT0); + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Control Endpoint 0 OUT */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_EPTn_IS_OUT_INT(USBEPTISRFlag)) + { + __DBG_USBPrintf("%06ld EP0OUT\t[%02ld]", ++__DBG_USBCount, pCore->Device.Transfer.sByteLength); + + /*----------------------------------------------------------------------------------------------------*/ + /* Clear interrupt flag before USBDCore_ControlOUT is meaning since USBDCore_ControlOUT clear NAKRX */ + /* bit which will cause another interrupt occur. */ + /*----------------------------------------------------------------------------------------------------*/ + API_USB_EPTn_CLR_OUT_INT(USBD_EPT0); +// _USBDCore_ControlOUT(pCore); + + usbd_ep0_out_callback(pCore); + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Clear Control Endpoint 0 global interrupt */ + /*------------------------------------------------------------------------------------------------------*/ + API_USB_CLR_EPTn_INT(USBD_EPT0); + + } /* if (API_USB_IS_EP_INT(USBISRFlag, USBD_EPT0)) */ + + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB Endpoint n call back function */ + /*--------------------------------------------------------------------------------------------------------*/ + while ((EPTn = API_USB_GET_EPT_NUM(API_USB_GET_INT())) != USBD_NOEPT) + { + USBEPTISRFlag = API_USB_EPTn_GET_INT((USBD_EPTn_Enum)EPTn); + + if (API_USB_EPTn_IS_INT(USBEPTISRFlag)) + { + API_USB_EPTn_CLR_INT(EPTn); + API_USB_CLR_EPTn_INT(EPTn); + + if (pCore->Class.CallBack_EPTn[EPTn] != NULL) + { + pCore->Class.CallBack_EPTn[EPTn](EPTn); + } + /* 在此处调用端点输入输出回调函数*/ + if (USBEPTISRFlag & IDTXIF) + { + /* 在此处调用端点输入函数 */ + usbd_ep_in_callback(pCore, (USBD_EPTn_Enum)EPTn); + } + else + { + /* 在此处调用端点输出函数 */ + usbd_ep_out_callback(pCore, (USBD_EPTn_Enum)EPTn); + } + + } + } /* while ((EPTn = API_USB_GET_EPTn_NUM(API_USB_GET_INT())) != USBD_NOEPT) */ + + return; +} + +/*********************************************************************************************************//** + * @brief USB Core Main Routine for application. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_MainRoutine(USBDCore_TypeDef *pCore) +{ + _USBDCore_PowerHandler(pCore); + + /*--------------------------------------------------------------------------------------------------------*/ + /* Class main routine call back function */ + /*--------------------------------------------------------------------------------------------------------*/ + if ((pCore->Class.CallBack_MainRoutine.func != NULL) && (pCore->Info.CurrentStatus == USER_USER_USB_STATE_CONFIGURED)) + { + pCore->Class.CallBack_MainRoutine.func(pCore->Class.CallBack_MainRoutine.uPara); + } + + return; +} + +/*********************************************************************************************************//** + * @brief Return Suspend status + * @param pCore: pointer of USB Device + * @retval TRUE or FALSE + ***********************************************************************************************************/ +u32 USBDCore_IsSuspend(USBDCore_TypeDef *pCore) +{ + return ((pCore->Info.CurrentStatus == USER_USER_USB_STATE_SUSPENDED) ? TRUE : FALSE); +} + +/*********************************************************************************************************//** + * @brief Return remote wake status which set by SET FEATURE standard command + * @param pCore: pointer of USB Device + * @retval TRUE or FALSE + ***********************************************************************************************************/ +u32 USBDCore_GetRemoteWakeUpFeature(USBDCore_TypeDef *pCore) +{ + return (pCore->Info.CurrentFeature.Bits.bRemoteWakeup); +} + +/*********************************************************************************************************//** + * @brief Turn on USB power and remote wakeup the Host + * @retval None + ***********************************************************************************************************/ +void USBDCore_TriggerRemoteWakeup(void) +{ + API_USB_POWER_ON(); /* Turn on USB Power */ + API_USB_REMOTE_WAKEUP(); /* Generate Remote Wakeup request to Host (RESUME) */ + return; +} + +/*********************************************************************************************************//** + * @brief Get USB Device status + * @retval USBDCore_Status_Enum + ***********************************************************************************************************/ +USBDCore_Status_Enum USBDCore_GetStatus(void) +{ + return pUSBCore->Info.CurrentStatus; +} + +/*********************************************************************************************************//** + * @brief Dump memory data for debug purpose. + * @param memory: buffer pointer to dump + * @param len: dump length + * @retval None + ***********************************************************************************************************/ +#if (USBDCORE_DEBUG == 1 && USBDCORE_DEBUG_DATA == 1) +void __DBG_USBDump(uc8 *memory, u32 len) +{ + u32 i; + for (i = 0; i < len; i++) + { + if (i % 8 == 0) + { + if (i != 0) + { + __DBG_USBPrintf("\r\n"); + } + __DBG_USBPrintf("\t\t"); + } + __DBG_USBPrintf("%02X ", *((u8 *)(memory + i))); + } + __DBG_USBPrintf("\r\n"); + + return; +} +#endif +/** + * @} + */ + +/* Private functions ---------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_Function USB Device Core private functions + * @{ + */ +/*********************************************************************************************************//** + * @brief USB Core Power handler for application. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_PowerHandler(USBDCore_TypeDef *pCore) +{ + API_USB_POWER_UP(pCore->pDriver, pCore->Info.CurrentFeature.Bits.bSelfPowered); + + if (pCore->Info.CurrentStatus == USER_USER_USB_STATE_SUSPENDED) + { + /*------------------------------------------------------------------------------------------------------*/ + /* System Low Power call back function */ + /*------------------------------------------------------------------------------------------------------*/ + if (pCore->Power.CallBack_Suspend.func != NULL) + { + __DBG_USBPrintf("%06ld >LOWPOWER\r\n", ++__DBG_USBCount); + + pCore->Power.CallBack_Suspend.func(pCore->Power.CallBack_Suspend.uPara); + + __DBG_USBPrintf("%06ld pDriver; + + pCore->Device.Transfer.sByteLength = USB_NO_DATA; + pCore->Info.uCurrentConfiguration = 0; + pCore->Info.uCurrentInterface = 0; + pCore->Info.CurrentFeature.Bits.bRemoteWakeup = 0; + pCore->Info.CurrentStatus = USER_USER_USB_STATE_DEFAULT; + pCore->Info.uIsDiscardClearFeature = FALSE; + + API_USB_DEINIT(); + + API_USB_POWER_ON(); + + /* Endpoint 0 initialization */ + API_USB_EPTn_INIT(USBD_EPT0, pCore->pDriver); // To be modify, init from desc + + /* Enable USB interrupt */ + API_USB_ENABLE_INT(pDrv->uInterruptMask); + + return; +} + +/*********************************************************************************************************//** + * @brief USB Resume + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Resume(USBDCore_TypeDef *pCore) +{ + API_USB_POWER_ON(); + pCore->Info.CurrentStatus = pCore->Info.LastStatus; + return; +} + +/*********************************************************************************************************//** + * @brief USB Suspend + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Suspend(USBDCore_TypeDef *pCore) +{ + /*--------------------------------------------------------------------------------------------------------*/ + /* When Device has been suspended, Change CurrentStatus as SUSPEND and then USBDCore_PowerHandler will */ + /* turn off chip power. */ + /*--------------------------------------------------------------------------------------------------------*/ + if (pCore->Info.CurrentStatus >= USER_USER_USB_STATE_POWERED) + { + API_USB_POWER_OFF(); + pCore->Info.LastStatus = pCore->Info.CurrentStatus; + pCore->Info.CurrentStatus = USER_USER_USB_STATE_SUSPENDED; + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Setup Stage + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Setup(USBDCore_TypeDef *pCore) +{ + pCore->Device.Transfer.Action = USB_ACTION_STALL; + pCore->Device.Transfer.sByteLength = 0; + + switch (pCore->Device.Request.bmRequestType & BMREQUEST_TYPE_MASK) + { + /*------------------------------------------------------------------------------------------------------*/ + /* Standard requests */ + /*------------------------------------------------------------------------------------------------------*/ + case REQ_TYPE_00_STD: + { + _USBDCore_Standard_Request(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* Class requests */ + /*------------------------------------------------------------------------------------------------------*/ + case REQ_TYPE_01_CLS: + { + if (pCore->Class.CallBack_ClassRequest != NULL) + { + pCore->Class.CallBack_ClassRequest(&(pCore->Device)); + } + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* Vendor requests */ + /*------------------------------------------------------------------------------------------------------*/ + case REQ_TYPE_02_VND: + { + if (pCore->Class.CallBack_VendorRequest != NULL) + { + pCore->Class.CallBack_VendorRequest(&(pCore->Device)); + } + /* Add Vendor requests handler here.... */ +#ifdef USBD_VENDOR_SUPPORT + USBDVendor_Request(pCore); +#endif + break; + } + } /* switch (gUSBReq.bmRequestType.byte) */ + + switch (pCore->Device.Transfer.Action) + { + /*------------------------------------------------------------------------------------------------------*/ + /* Control IN */ + /*------------------------------------------------------------------------------------------------------*/ + case USB_ACTION_DATAIN: + { + /*----------------------------------------------------------------------------------------------------*/ + /* When the Control IN length is large than the Host required, transfer the length which specified */ + /* by SETUP Data Packet. */ + /*----------------------------------------------------------------------------------------------------*/ + if (pCore->Device.Transfer.sByteLength > pCore->Device.Request.wLength) + { + pCore->Device.Transfer.sByteLength = pCore->Device.Request.wLength; + } + __DBG_USBPrintf("%06ld EP0IN\t[%02ld]", __DBG_USBCount, pCore->Device.Transfer.sByteLength); + + _USBDCore_ControlIN(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* Control OUT */ + /*------------------------------------------------------------------------------------------------------*/ + case USB_ACTION_DATAOUT: + { + if (pCore->Device.Transfer.sByteLength == 0) + { + API_USB_EPTn_WRITE_IN(USBD_EPT0, (u32 *)0, 0); /* Prepare ZLP ack for Control OUT */ + } + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* STALL */ + /*------------------------------------------------------------------------------------------------------*/ + default: + { + __DBG_USBPrintf("%06ld EP0 STALL\r\n", __DBG_USBCount); + + API_USB_EPTn_SEND_STALL(USBD_EPT0); + break; + } + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Stand Request. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_Request(USBDCore_TypeDef *pCore) +{ + u16 USBCmd = *((u16 *)(&(pCore->Device.Request))); + + switch (USBCmd) + { + /*------------------------------------------------------------------------------------------------------*/ + /* | bRequest | Data transfer direction | Type | Recipient | Data */ + /*------------------------------------------------------------------------------------------------------*/ + + /*------------------------------------------------------------------------------------------------------*/ + /* | 00_Get Status | 80_Device-to-Host | 00_Standard Request | 0_Device | 0080h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_00_GET_STAT | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld GET DST\t[%02d]\r\n", __DBG_USBCount, pCore->Info.CurrentFeature.uByte); + _USBDCore_Standard_GetStatus(pCore, Device); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 00_Get Status | 80_Device-to-Host | 00_Standard Request | 1_Interface | 0081h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_00_GET_STAT | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_01_INF): + { + __DBG_USBPrintf("%06ld GET IST\t[%02d]\r\n", __DBG_USBCount, 0); + _USBDCore_Standard_GetStatus(pCore, Interface); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 00_Get Status | 80_Device-to-Host | 00_Standard Request | 2_Endpoint | 0082h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_00_GET_STAT | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_02_EPT): + { + __DBG_USBPrintf("%06ld GET EST\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wIndex); + _USBDCore_Standard_GetStatus(pCore, Endpoint); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 01_Clear Feature | 00_Host-to-Device | 00_Standard Request | 0_Device | 0100h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_01_CLR_FETU | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld CLR DFEA\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + _USBDCore_Standard_SetClearFeature(pCore, Device, ClearFeature); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 01_Clear Feature | 00_Host-to-Device | 00_Standard Request | 2_Endpoint | 0102h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_01_CLR_FETU | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_02_EPT): + { + __DBG_USBPrintf("%06ld CLR EFEA\t[0x%02x]\r\n", __DBG_USBCount, pCore->Device.Request.wIndex); + _USBDCore_Standard_SetClearFeature(pCore, Endpoint, ClearFeature); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 03_Set Feature | 00_Host-to-Device | 00_Standard Request | 0_Device | 0300h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_03_SET_FETU | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld SET DFEA\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + _USBDCore_Standard_SetClearFeature(pCore, Device, SetFeature); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 03_Set Feature | 00_Host-to-Device | 00_Standard Request | 2_Endpoint | 0302h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_03_SET_FETU | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_02_EPT): + { + __DBG_USBPrintf("%06ld SET EFEA\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wIndex); + _USBDCore_Standard_SetClearFeature(pCore, Endpoint, SetFeature); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 05_Set Address | 00_Host-to-Device | 00_Standard Request | 0_Device | 0500h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_05_SET_ADDR | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld SET ADDR\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + _USBDCore_Standard_SetAddress(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 06_Get Descriptor | 80_Device-to-Host | 00_Standard Request | 0_Device | 0680h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_06_GET_DESC | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld GET DDESC\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueH); + _USBDCore_Standard_GetDescriptor(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 06_Get Descriptor | 80_Device-to-Host | 00_Standard Request | 1_Interface | 0681h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_06_GET_DESC | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_01_INF): + { + __DBG_USBPrintf("%06ld GET IDESC\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueH); + if (pCore->Class.CallBack_ClassGetDescriptor != NULL) + { + pCore->Class.CallBack_ClassGetDescriptor((USBDCore_Device_TypeDef *) & (pCore->Device)); + } + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 08_Get Configuration | 80_Host-to-Device | 00_Standard Request | 0_Device | 0880h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_08_GET_CONF | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld GET CONF\t[%02X]\r\n", __DBG_USBCount, pCore->Info.uCurrentConfiguration); + _USBDCore_Standard_GetConfiguration(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 09_Set Configuration | 00_Host-to-Device | 00_Standard Request | 0_Device | 0900h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_09_SET_CONF | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld SET CONF\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + _USBDCore_Standard_SetConfiguration(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 11_Set Interface | 00_Host-to-Device | 00_Standard Request | 1_Interface | 0B01h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_11_SET_INF | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_01_INF): + { + __DBG_USBPrintf("%06ld SET INF\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + if (pCore->Class.CallBack_ClassSetInterface != NULL) + { + pCore->Class.CallBack_ClassSetInterface((USBDCore_Device_TypeDef *) & (pCore->Device)); + } + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 10_Get Interface | 80_Device-to-Host | 00_Standard Request | 1_Interface | 0A81h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_10_GET_INF | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_01_INF): + { + __DBG_USBPrintf("%06ld GET INF\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + if (pCore->Class.CallBack_ClassGetInterface != NULL) + { + pCore->Class.CallBack_ClassGetInterface((USBDCore_Device_TypeDef *) & (pCore->Device)); + } + break; + } + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - GET_STATUS. + * @param pCore: pointer of USB Device + * @param recipient: Recipient + * @arg Device: 0 + * @arg Interface: 1 + * @arg Endpoint: 2 + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_GetStatus(USBDCore_TypeDef *pCore, USBDCore_Recipient_Enum recipient) +{ + pCore->Device.Transfer.uBuffer[1] = 0; + switch (recipient) + { + case Device: + { + pCore->Device.Transfer.uBuffer[0] = pCore->Info.CurrentFeature.uByte; + break; + } + case Interface: + { + pCore->Device.Transfer.uBuffer[0] = 0; + break; + } + case Endpoint: + { + pCore->Device.Transfer.uBuffer[0] = API_USB_EPTn_GET_HALT((USBD_EPTn_Enum)(pCore->Device.Request.wIndex & 0xF)); + break; + } + default: + { + return; + } + } + + pCore->Device.Transfer.pData = (uc8 *) & (pCore->Device.Transfer.uBuffer); + pCore->Device.Transfer.sByteLength = 2; + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - SET_FEATURE / CLEAR_FEATURE. + * @param pCore: pointer of USB Device + * @param recipient: Recipient + * @arg Device: 0 + * @arg Interface: 1 + * @arg Endpoint: 2 + * @param type: + * @arg ClearFeature: 0 + @arg SerFeature: 1 + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_SetClearFeature(USBDCore_TypeDef *pCore, + USBDCore_Recipient_Enum recipient, + USBDCore_SetClearFeature_Enum type) +{ + u32 i; + switch (recipient) + { + case Device: + { + if (pCore->Device.Request.wValueL == USB_FEATURE_REMOTE_WAKEUP) + { + pCore->Info.CurrentFeature.Bits.bRemoteWakeup = type; + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + } + break; + } + case Endpoint: + { + i = pCore->Device.Request.wIndex & 0xF; + if (i != 0) + { + if (type == ClearFeature) + { + if (pCore->Info.uIsDiscardClearFeature == FALSE) + { + API_USB_EPTn_CLR_HALT((USBD_EPTn_Enum)i); + API_USB_EPTn_CLR_DTG((USBD_EPTn_Enum)i); + } + } + else + { + API_USB_EPTn_SET_HALT((USBD_EPTn_Enum)i); + } + } + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + break; + } + default: + { + break; + } + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - SET_ADDRESS. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_SetAddress(USBDCore_TypeDef *pCore) +{ + API_USB_SET_ADDR(pCore->Device.Request.wValueL); + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + pCore->Info.CurrentStatus = USER_USER_USB_STATE_ADDRESS; + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - GET_DESCRIPTOR. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_GetDescriptor(USBDCore_TypeDef *pCore) +{ + u32 value = pCore->Device.Request.wValueH; + uc8 *pTemp; + + switch (value) + { + case DESC_TYPE_01_DEV: + { + pCore->Device.Transfer.pData = pCore->Device.Desc.pDeviceDesc; + pCore->Device.Transfer.sByteLength = *(pCore->Device.Desc.pDeviceDesc); + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + break; + } + case DESC_TYPE_02_CONFN: + { + pCore->Device.Transfer.pData = pCore->Device.Desc.pConfnDesc; + pCore->Device.Transfer.sByteLength = *(u16 *)((pCore->Device.Desc.pConfnDesc) + 2); + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + break; + } + case DESC_TYPE_03_STR: + { + value = pCore->Device.Request.wValueL; + if (value < pCore->Device.Desc.uStringDescNumber) + { + if (*(pCore->Device.Desc.ppStringDesc + value) != NULL) + { + pTemp = *(pCore->Device.Desc.ppStringDesc + value); + pCore->Device.Transfer.pData = (uc8 *)(pTemp); + pCore->Device.Transfer.sByteLength = *(pTemp); + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + } + } + break; + } + } + +#ifdef USBD_VENDOR_SUPPORT + USBDVendor_StandardGetDescriptor(pCore); +#endif + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - GET_CONFIGURATION. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_GetConfiguration(USBDCore_TypeDef *pCore) +{ + pCore->Device.Transfer.pData = &(pCore->Info.uCurrentConfiguration); + pCore->Device.Transfer.sByteLength = 1; + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - SET_CONFIGURATION. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_SetConfiguration(USBDCore_TypeDef *pCore) +{ + u32 i; + + pCore->Info.uCurrentConfiguration = pCore->Device.Request.wValueL; + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + + /* Endpoint n settings */ + for (i = 1; i < MAX_EP_NUM; i++) + { + API_USB_EPTn_INIT((USBD_EPTn_Enum)i, pCore->pDriver); // To be modify, init from desc + } + + pCore->Info.CurrentStatus = USER_USER_USB_STATE_CONFIGURED; + + return; +} + +/*********************************************************************************************************//** + * @brief USB Control IN transfer. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_ControlIN(USBDCore_TypeDef *pCore) +{ + s32 EP0INLen = API_USB_GET_CTRL_IN_LEN(); + u32 len; + + if (pCore->Device.Transfer.sByteLength != USB_NO_DATA && pCore->Device.Transfer.Action == USB_ACTION_DATAIN) + { + if (pCore->Device.Transfer.sByteLength >= EP0INLen) + { + len = EP0INLen; + pCore->Device.Transfer.sByteLength -= len; + } + else + { + len = pCore->Device.Transfer.sByteLength; + pCore->Device.Transfer.sByteLength = USB_NO_DATA; + pCore->Device.Transfer.Action = USB_ACTION_DATAOUT; + } + + __DBG_USBPrintf("[%02ld]\r\n", len); + __DBG_USBDump((uc8 *)pCore->Device.Transfer.pData, len); + + API_USB_EPTn_WRITE_IN(USBD_EPT0, (u32 *)pCore->Device.Transfer.pData, len); + pCore->Device.Transfer.pData = pCore->Device.Transfer.pData + len; + } + else + { + __DBG_USBPrintf("[-1]\r\n"); + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Control OUT transfer. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_ControlOUT(USBDCore_TypeDef *pCore) +{ + u32 len; + + if (pCore->Device.Transfer.sByteLength != USB_NO_DATA && pCore->Device.Transfer.Action == USB_ACTION_DATAOUT) + { + len = API_USB_EPTn_READ_OUT(USBD_EPT0, (u32 *)pCore->Device.Transfer.pData, MAX_CONTROL_OUT_SIZE); + + __DBG_USBPrintf("[%02ld]\r\n", len); + __DBG_USBDump((uc8 *)pCore->Device.Transfer.pData, len); + + pCore->Device.Transfer.pData = pCore->Device.Transfer.pData + len; + pCore->Device.Transfer.sByteLength -= len; + + if (pCore->Device.Transfer.sByteLength == 0) + { + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + if (pCore->Device.Transfer.CallBack_OUT.func != NULL) + { + pCore->Device.Transfer.CallBack_OUT.func(pCore->Device.Transfer.CallBack_OUT.uPara); + pCore->Device.Transfer.CallBack_OUT.func = NULL; + } + pCore->Device.Transfer.sByteLength = USB_NO_DATA; + API_USB_EPTn_WRITE_IN(USBD_EPT0, (u32 *)0, 0); + } + } + else + { + __DBG_USBPrintf("[-1]\r\n"); + } + + return; +} +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ diff --git a/bsp/ht32/libraries/usbd_library/src/ht32_usbd_int.c b/bsp/ht32/libraries/usbd_library/src/ht32_usbd_int.c new file mode 100644 index 0000000000..8999a00c52 --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/src/ht32_usbd_int.c @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-11 QT-one first version + */ + +#include "ht32_usbd_int.h" + +#ifdef RT_USING_USB_DEVICE +//#include "ht32_usbd_core.h" + + + +static void USBPLL_Configuration(void); +static void USBVRG_Configuration(void); +static void Suspend(u32 uPara); + + +static USBDCore_TypeDef *int_p_usbd_code; +static USBD_Driver_TypeDef gUSBDriver; +static u32 gIsLowPowerAllowed = TRUE; + +/* + 为了不破坏原本的usb_code文件中的USB中断回调函数 + 此处重构USB中断回调函数 + 除了重构USB的中断回调函数以外,还需要重写一些中断回调功能函数 +*/ +/* + RTT的USB中断回调过程如下 + USB中断函数 -> USB中断回调函数 -> USB相关功能回调函数 + -> RTT的USB相关功能回调函数 -> 结束USB中断 + + RTT的USB程序运行流程(RTT的USB线程运行流程) + USB线程阻塞等待USB获取到消息队列中的消息 + -> USB中断通过回调函数将接收到的消息传给USB的消息队列 + -> RTT的USB相关功能回调函数获取到USB中断的消息,并设置USB消息队列的状态 + -> USB退出中断,USB获取到消息后,线程阻塞被解除 + -> USB线程根据获取的状态执行对应的功能 + -> USB线程通过USB操作接口实现对应的功能 + +*/ +/* + 根据RTT的USB中断回调过程和RTT的USB线程执行过程 + 得出完成USB驱动需要实现的两个重要部分 + 1、USB线程实现功能所需要的调用到的USB操作接口函数 + 2、USB中断回调过程使用到的RTT的USB驱动的函数的相关衔接部分 + + 除了以上两个比较重要的功能外,还需要完成以下的一些必要部分 + 1、USB初始化函数 + 2、USB设备注册函数 + + 完成以上功能主要涉及到两个文件为: + 1、drv_usbd.c + 2、ht32_usbd_int.c + + 对两个文件的内容分配以及文件依赖如下: + drv_usbd.c + 主要负责实现USB的操作接口的实现 + 以及初始化函数和USB设备注册函数 + 由于自定义的USB内核挂载点在该文件中 + 所以USB的中断函数也会写在该文件中 + 依赖: + ht32_usbd_core.c + ht32_usbd_int.c + 以及RTT的相关文件 + + ht32_usbd_int.c + 主要负责实现USB中断回调以及回调函数 + 中和RTT的USB驱动函数相关衔接部分 + 该文件还会包含USB的初始配置函数以及 + USB的休眠与唤醒的相关函数 + 依赖: + ht32_usbd_core.c + 以及RTT的相关文件 +*/ + +/* 帧起始(SOF)中断回调 */ +void usbd_sof_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_sof_handler(udcd); +} +/* USB复位中断 */ +void usbd_reset_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_reset_handler(udcd); +} + +/* USB暂停(断开连接)中断 */ +void usbd_suspend_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_disconnect_handler(udcd); +} + +/* USB恢复(重新连接)中断 */ +void usbd_resume_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_connect_handler(udcd); +} + +/* USB端点0中断 */ +/* 端点0控制中断 */ +void usbd_setup_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_setup_handler(udcd, (struct urequest *)&pCore->Device.Request); +} + +/* 端点0输入中断(可以归入其他端点输入中断) */ +void usbd_ep0_in_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_in_handler(udcd); +} + +/* 端点0输出中断(可以归入其他端点输出中断) */ +void usbd_ep0_out_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_out_handler(udcd, pCore->Device.Transfer.sByteLength); +} + +/* USB其他端点中断 */ +/* 其他端点输入中断 */ +void usbd_ep_in_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep_in_handler(udcd, EPTn | 0x80, pCore->Device.Transfer.sByteLength); +} + +/* 其他端点输出中断 */ +void usbd_ep_out_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep_out_handler(udcd, EPTn, pCore->Device.Transfer.sByteLength); +} + + + + +//rt_err_t rt_usbd_set_feature(udevice_t device, rt_uint16_t value, rt_uint16_t index); +//rt_err_t rt_usbd_clear_feature(udevice_t device, rt_uint16_t value, rt_uint16_t index); +//rt_err_t rt_usbd_ep_set_stall(udevice_t device, uep_t ep); +//rt_err_t rt_usbd_ep_clear_stall(udevice_t device, uep_t ep); +//rt_err_t rt_usbd_ep0_set_stall(udevice_t device); +//rt_err_t rt_usbd_ep0_clear_stall(udevice_t device); + + +/*********************************************************************************************************//** + * @brief Configure USB. + * @retval None + ***********************************************************************************************************/ +static void USB_Configuration(USBDCore_TypeDef *pCore) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + CKCUClock.Bit.USBD = 1; + CKCUClock.Bit.EXTI = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + int_p_usbd_code = pCore; + +#if (LIBCFG_CKCU_USB_PLL) + USBPLL_Configuration(); +#endif + +#if (LIBCFG_PWRCU_VREG) + USBVRG_Configuration(); /* Voltage of USB setting */ +#endif + + pCore->pDriver = (u32 *)&gUSBDriver; /* Initiate memory pointer of USB driver */ + pCore->Power.CallBack_Suspend.func = Suspend; /* Install suspend call back function into USB core */ + +// gUSBCore.pDriver = (u32 *)&gUSBDriver; /* Initiate memory pointer of USB driver */ +// gUSBCore.Power.CallBack_Suspend.func = Suspend; /* Install suspend call back function into USB core */ + //gUSBCore.Power.CallBack_Suspend.uPara = (u32)NULL; + + /* 描述符初始化 */ +// USBDDesc_Init(&pCore->Device.Desc); /* Initiate memory pointer of descriptor */ + /* USB类初始化 */ +// USBDClass_Init(&(pCore->Class)); /* Initiate USB Class layer */ + /* USB内核初始化 */ + USBDCore_Init(pCore); /* Initiate USB Core layer */ + + /* !!! NOTICE !!! + Must turn on if the USB clock source is from HSI (PLL clock Source) + */ +#if 0 + { + /* Turn on HSI auto trim function */ + CKCU_HSIAutoTrimClkConfig(CKCU_ATC_USB); + CKCU_HSIAutoTrimCmd(ENABLE); + } +#endif + + NVIC_EnableIRQ(USB_IRQn); /* Enable USB device interrupt */ +} + +#if (LIBCFG_CKCU_USB_PLL) +/*********************************************************************************************************//** + * @brief Configure USB PLL + * @retval None + ************************************************************************************************************/ +static void USBPLL_Configuration(void) +{ + { + /* USB PLL configuration */ + + /* !!! NOTICE !!! + Notice that the local variable (structure) did not have an initial value. + Please confirm that there are no missing members in the parameter settings below in this function. + */ + CKCU_PLLInitTypeDef PLLInit; + + PLLInit.ClockSource = CKCU_PLLSRC_HSE; // CKCU_PLLSRC_HSE or CKCU_PLLSRC_HSI +#if (LIBCFG_CKCU_USB_PLL_96M) + PLLInit.CFG = CKCU_USBPLL_8M_96M; +#else + PLLInit.CFG = CKCU_USBPLL_8M_48M; +#endif + PLLInit.BYPASSCmd = DISABLE; + CKCU_USBPLLInit(&PLLInit); + } + + CKCU_USBPLLCmd(ENABLE); + + while (CKCU_GetClockReadyStatus(CKCU_FLAG_USBPLLRDY) == RESET); + CKCU_USBClockConfig(CKCU_CKUSBPLL); +} +#endif + +#if (LIBCFG_PWRCU_VREG) +/*********************************************************************************************************//** + * @brief Configure USB Voltage + * @retval None + ************************************************************************************************************/ +static void USBVRG_Configuration(void) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + CKCUClock.Bit.BKP = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + PWRCU_SetVREG(PWRCU_VREG_3V3); + + /* !!! NOTICE !!! + USB LDO should be enabled (PWRCU_VREG_ENABLE) if the MCU VDD > 3.6 V. + */ + PWRCU_VREGConfig(PWRCU_VREG_BYPASS); +} +#endif + +#define REMOTE_WAKEUP (0) +/*********************************************************************************************************//** + * @brief Suspend call back function which enter DeepSleep1 + * @param uPara: Parameter for Call back function + * @retval None + ***********************************************************************************************************/ +static void Suspend(u32 uPara) +{ +#if (REMOTE_WAKEUP == 1) + u32 IsRemoteWakeupAllowed; +#endif + + if (gIsLowPowerAllowed) + { + +#if (REMOTE_WAKEUP == 1) + /* Disable EXTI interrupt to prevent interrupt occurred after wakeup */ + EXTI_IntConfig(KEY1_BUTTON_EXTI_CHANNEL, DISABLE); + IsRemoteWakeupAllowed = USBDCore_GetRemoteWakeUpFeature(&gUSBCore); + + if (IsRemoteWakeupAllowed == TRUE) + { + /* Enable EXTI wake event and clear wakeup flag */ + EXTI_WakeupEventConfig(KEY1_BUTTON_EXTI_CHANNEL, EXTI_WAKEUP_LOW_LEVEL, ENABLE); + EXTI_ClearWakeupFlag(KEY1_BUTTON_EXTI_CHANNEL); + } +#endif + + __DBG_USBPrintf("%06ld >DEEPSLEEP\r\n", ++__DBG_USBCount); + + // Add your procedure here which disable related IO to reduce power consumption + // .................. + // + + if ((int_p_usbd_code->Info.CurrentStatus == USB_STATE_SUSPENDED) && ((HT_USB->CSR & 0xC0) == 0x40)) // D+ = 1, D- = 0 + { + /* For Bus powered device, you must enter DeepSleep1 when device has been suspended. For self-powered */ + /* device, you may decide to enter DeepSleep1 or not depended on your application. */ + + /* For the convenient during debugging and evaluation stage, the USBDCore_LowPower() is map to a null */ + /* function by default. In the real product, you must map this function to the low power function of */ + /* firmware library by setting USBDCORE_ENABLE_LOW_POWER as 1 (in the ht32fxxxx_usbdconf.h file). */ + USBDCore_LowPower(); + } + + // Add your procedure here which recovery related IO for application + // .................. + // + + __DBG_USBPrintf("%06ld 3.6 V. + */ + PWRCU_VREGConfig(PWRCU_VREG_BYPASS); +} +#endif + +#define REMOTE_WAKEUP (0) +/*********************************************************************************************************//** + * @brief Suspend call back function which enter DeepSleep1 + * @param uPara: Parameter for Call back function + * @retval None + ***********************************************************************************************************/ +static void Suspend(u32 uPara) +{ +#if (REMOTE_WAKEUP == 1) + u32 IsRemoteWakeupAllowed; +#endif + + if (gIsLowPowerAllowed) + { + +#if (REMOTE_WAKEUP == 1) + /* Disable EXTI interrupt to prevent interrupt occurred after wakeup */ + EXTI_IntConfig(KEY1_BUTTON_EXTI_CHANNEL, DISABLE); + IsRemoteWakeupAllowed = USBDCore_GetRemoteWakeUpFeature(&gUSBCore); + + if (IsRemoteWakeupAllowed == TRUE) + { + /* Enable EXTI wake event and clear wakeup flag */ + EXTI_WakeupEventConfig(KEY1_BUTTON_EXTI_CHANNEL, EXTI_WAKEUP_LOW_LEVEL, ENABLE); + EXTI_ClearWakeupFlag(KEY1_BUTTON_EXTI_CHANNEL); + } +#endif + + __DBG_USBPrintf("%06ld >DEEPSLEEP\r\n", ++__DBG_USBCount); + + // Add your procedure here which disable related IO to reduce power consumption + // .................. + // + + if ((gUSBCore->Info.CurrentStatus == USER_USB_STATE_SUSPENDED) && ((HT_USB->CSR & 0xC0) == 0x40)) // D+ = 1, D- = 0 + { + /* For Bus powered device, you must enter DeepSleep1 when device has been suspended. For self-powered */ + /* device, you may decide to enter DeepSleep1 or not depended on your application. */ + + /* For the convenient during debugging and evaluation stage, the USBDCore_LowPower() is map to a null */ + /* function by default. In the real product, you must map this function to the low power function of */ + /* firmware library by setting USBDCORE_ENABLE_LOW_POWER as 1 (in the ht32fxxxx_usbdconf.h file). */ + USBDCore_LowPower(); + } + + // Add your procedure here which recovery related IO for application + // .................. + // + + __DBG_USBPrintf("%06ld pDriver = (u32 *)&gUSBDriver; /* Initiate memory pointer of USB driver */ + gUSBCore->Power.CallBack_Suspend.func = Suspend; /* Install suspend call back function into USB core */ + +// USBDDesc_Init(&gUSBCore.Device.Desc); /* Initiate memory pointer of descriptor */ +// USBDClass_Init(&gUSBCore.Class); /* Initiate USB Class layer */ + USBDCore_Init(gUSBCore); /* Initiate USB Core layer */ + + NVIC_SetPriority(USB_IRQn,0); + NVIC_EnableIRQ(USB_IRQn); /* Enable USB device interrupt */ + + HT32F_DVB_USBConnect(); + +} + + + + + + + + diff --git a/bsp/ht32/libraries/usbd_library/src/usbd_code.c b/bsp/ht32/libraries/usbd_library/src/usbd_code.c new file mode 100644 index 0000000000..33040e57eb --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/src/usbd_code.c @@ -0,0 +1,327 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-09 QT-one first version + */ + +#include "usbd_code.h" +#include "usb_port.h" + +#include +#include +#include "drv_common.h" + +#if 1 + +#define USB_NO_DATA (-1) /*!< For Device.Transfer.sByteLength */ +/* Private function prototypes -----------------------------------------------------------------------------*/ +static void _USBDCore_Suspend(USBDCore_TypeDef *pCore); +static void _USBDCore_Reset(USBDCore_TypeDef *pCore); +static void _USBDCore_Resume(USBDCore_TypeDef *pCore); + +static void usbd_ept_init(USBDCore_TypeDef *udev); +/*********************************************************************************************************//** + * @brief USB Interrupt Service Routine. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void usbd_irq_handler(USBDCore_TypeDef *pCore) +{ + u32 USBISRFlag = API_USB_GET_INT(); + u32 USBEPTISRFlag; + USBD_EPTn_Enum EPTn; + +#if (USBDCORE_DEBUG == 1) + u32 USBAddr = HT_USB->DEVAR; +#endif + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB SOF Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SOF_INT(USBISRFlag)) + { + usbd_sof_callback(pCore); + API_USB_CLR_SOF_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB SUSPEND Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SUSPEND_INT(USBISRFlag)) + { + API_USB_CLR_SUSPEND_INT(); + usbd_suspend_callback(pCore); + _USBDCore_Suspend(pCore); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB RESET Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_RESET_INT(USBISRFlag)) + { + if (API_USB_IS_FRES_INT(USBISRFlag)) + { + API_USB_CLR_FRES_INT(); + } + else + { + usbd_reset_callback(pCore); + _USBDCore_Reset(pCore); + } + API_USB_CLR_RESET_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB RESUME Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_RESUME_INT(USBISRFlag)) + { + usbd_resume_callback(pCore); + _USBDCore_Resume(pCore); + API_USB_CLR_RESUME_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB Endpoint 0 interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_EPTn_INT(USBISRFlag, USBD_EPT0)) + { + USBEPTISRFlag = API_USB_EPTn_GET_INT(USBD_EPT0); + + /*------------------------------------------------------------------------------------------------------*/ + /* Control SETUP Stage */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SETUP_INT(USBEPTISRFlag)) + { + API_USB_READ_SETUP(&(pCore->Device.Request)); /* Read SETUP Command data from USB Buffer*/ + usbd_setup_callback(pCore); + API_USB_CLR_SETUP_INT(); /* Clear SETUP Interrupt */ + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Control Endpoint 0 IN */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_EPTn_IS_IN_INT(USBEPTISRFlag)) + { + usbd_ep0_in_callback(pCore); + API_USB_EPTn_CLR_IN_INT(USBD_EPT0); + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Control Endpoint 0 OUT */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_EPTn_IS_OUT_INT(USBEPTISRFlag)) + { + /*----------------------------------------------------------------------------------------------------*/ + /* Clear interrupt flag before USBDCore_ControlOUT is meaning since USBDCore_ControlOUT clear NAKRX */ + /* bit which will cause another interrupt occur. */ + /*----------------------------------------------------------------------------------------------------*/ + API_USB_EPTn_CLR_OUT_INT(USBD_EPT0); + usbd_ep0_out_callback(pCore); + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Clear Control Endpoint 0 global interrupt */ + /*------------------------------------------------------------------------------------------------------*/ + API_USB_CLR_EPTn_INT(USBD_EPT0); + + } /* if (API_USB_IS_EP_INT(USBISRFlag, USBD_EPT0)) */ + + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB Endpoint n call back function */ + /*--------------------------------------------------------------------------------------------------------*/ + while ((EPTn = API_USB_GET_EPT_NUM(API_USB_GET_INT())) != USBD_NOEPT) + { + USBEPTISRFlag = API_USB_EPTn_GET_INT((USBD_EPTn_Enum)EPTn); + + if (API_USB_EPTn_IS_INT(USBEPTISRFlag)) + { + API_USB_EPTn_CLR_INT(EPTn); + API_USB_CLR_EPTn_INT(EPTn); + + if (USBEPTISRFlag & IDTXIF) + { + usbd_ep_in_callback(pCore, (USBD_EPTn_Enum)EPTn); + } + else + { + usbd_ep_out_callback(pCore, (USBD_EPTn_Enum)EPTn); + } + + } + } /* while ((EPTn = API_USB_GET_EPTn_NUM(API_USB_GET_INT())) != USBD_NOEPT) */ + + return; +} +/*********************************************************************************************************//** + * @brief USB Core initialization. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_Init(USBDCore_TypeDef *pCore) +{ + pCore->Info.CurrentStatus = USER_USB_STATE_POWERED; + API_USB_INIT(pCore->pDriver); + + /* Endpoint information initialisation */ + usbd_ept_init(pCore); + + return; +} +/*********************************************************************************************************//** + * @brief USB Core Main Routine for application. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_MainRoutine(USBDCore_TypeDef *pCore) +{ + API_USB_POWER_UP(pCore->pDriver, pCore->Info.CurrentFeature.Bits.bSelfPowered); + + if (pCore->Info.CurrentStatus == USER_USB_STATE_SUSPENDED) + { + /*------------------------------------------------------------------------------------------------------*/ + /* System Low Power call back function */ + /*------------------------------------------------------------------------------------------------------*/ + if (pCore->Power.CallBack_Suspend.func != NULL) + { + __DBG_USBPrintf("%06ld >LOWPOWER\r\n", ++__DBG_USBCount); + + pCore->Power.CallBack_Suspend.func(pCore->Power.CallBack_Suspend.uPara); + + __DBG_USBPrintf("%06ld Info.CurrentStatus >= USER_USB_STATE_POWERED) + { + API_USB_POWER_OFF(); + pCore->Info.LastStatus = pCore->Info.CurrentStatus; + pCore->Info.CurrentStatus = USER_USB_STATE_SUSPENDED; + } + + return; +} +/*********************************************************************************************************//** + * @brief USB Reset + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Reset(USBDCore_TypeDef *pCore) +{ + USBD_Driver_TypeDef *pDrv = (USBD_Driver_TypeDef *)pCore->pDriver; + + pCore->Device.Transfer.sByteLength = USB_NO_DATA; + pCore->Info.uCurrentConfiguration = 0; + pCore->Info.uCurrentInterface = 0; + pCore->Info.CurrentFeature.Bits.bRemoteWakeup = 0; + pCore->Info.CurrentStatus = USER_USB_STATE_DEFAULT; + pCore->Info.uIsDiscardClearFeature = FALSE; + + API_USB_DEINIT(); + + API_USB_POWER_ON(); + + /* Endpoint 0 initialization */ + API_USB_EPTn_INIT(USBD_EPT0, pCore->pDriver); // To be modify, init from desc + + /* Enable USB interrupt */ + API_USB_ENABLE_INT(pDrv->uInterruptMask); + + return; +} +/*********************************************************************************************************//** + * @brief USB Resume + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Resume(USBDCore_TypeDef *pCore) +{ + API_USB_POWER_ON(); + pCore->Info.CurrentStatus = pCore->Info.LastStatus; + return; +} +/****************************************************************************************************************************/ +void usbd_ep_enable(USBDCore_TypeDef *pCore, uint8_t ept_addr) +{ + USBD_Driver_TypeDef *pDrv = (USBD_Driver_TypeDef *)pCore->pDriver; + pDrv->ept[ept_addr & 0x7f].CFGR.bits.EPEN = 1; + API_USB_EPTn_INIT((USBD_EPTn_Enum)(ept_addr & 0x7f), pCore->pDriver); // To be modify, init from desc +} +void usbd_ep_disable(USBDCore_TypeDef *pCore, uint8_t ept_addr) +{ + USBD_Driver_TypeDef *pDrv = (USBD_Driver_TypeDef *)pCore->pDriver; + pDrv->ept[ept_addr & 0x7f].CFGR.bits.EPEN = 0; + API_USB_EPTn_INIT((USBD_EPTn_Enum)(ept_addr & 0x7f), pCore->pDriver); // To be modify, init from desc +} + +static void usbd_ept_init(USBDCore_TypeDef *udev) +{ + uint8_t ept_num = 0; + usb_ept_info *ept_info; + for (ept_num = 0; ept_num < 8; ept_num++) + { + ept_info = &udev->ept_io[ept_num]; + + ept_info->maxpacket = 64; + + ept_info->status = 1; + + ept_info->total_len = 0; + ept_info->trans_len = 0; + ept_info->trans_buf = NULL; + } +} +/** + * @brief usb endpoint receive data + * @param udev: to the structure of usbd_core_type + * @param ept_addr: endpoint number + * @param buffer: receive data buffer + * @param len: receive data length + * @retval none + */ +void usbd_ept_recv(USBDCore_TypeDef *udev, uint8_t ept_addr, uint8_t *buffer, uint16_t len) +{ + /* get endpoint info struct and register */ + usb_ept_info *ept_info = &udev->ept_io[ept_addr & 0x7F]; + uint32_t trs_len = 0; + + /* set receive data buffer and length */ + ept_info->trans_buf = buffer; + ept_info->total_len = len; + ept_info->trans_len = 0; + + if (ept_info->total_len > ept_info->maxpacket) + { + trs_len = ept_info->maxpacket; + ept_info->total_len -= trs_len; + } + else + { + trs_len = len; + ept_info->total_len = 0; + } + + ept_info->trans_len = trs_len; + /* set rx status valid */ + ept_info->status = TRUE; +} + +#endif /* BSP_USING_USBD */ diff --git a/bsp/ht32/tools/sdk_dist.py b/bsp/ht32/tools/sdk_dist.py index 49b2c2872a..01540d7ec6 100644 --- a/bsp/ht32/tools/sdk_dist.py +++ b/bsp/ht32/tools/sdk_dist.py @@ -37,3 +37,27 @@ def dist_do_building(BSP_ROOT, dist_dir): bsp_update_kconfig_library(dist_dir) +def get_source(ic_model, file_path, system_path, base_path): + source_path = [] + files_list = [] + readafter = 0 + if not os.path.isfile(file_path): + return + + with open(file_path, 'r') as file: + # content = file.read() + for line in file: + if readafter == 2 and line.find('>') != -1: + break + if readafter == 2: + files_list.append(line.strip()) + if line.find(ic_model) != -1: + readafter = 1 + if readafter == 1 and line.find('<') != -1: + readafter = 2 + for line in files_list: + if line.find('system') != -1: + source_path.append(os.path.join(system_path, line.strip())) + else: + source_path.append(os.path.join(base_path, line.strip())) + return source_path

;-spNf4FGLD76iinC|( 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 Yl9 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 z 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