From 8baaf73210a101305b9b514a045b2030228b38c6 Mon Sep 17 00:00:00 2001 From: luobeihai <83497188+luobeihai@users.noreply.github.com> Date: Wed, 5 Apr 2023 12:18:51 +0800 Subject: [PATCH] add apm32 can driver and add apm32e1/s1 rtt driver support (#7170) * add apm32 can driver and add apm32e1/s1 rtt driver support * format some files * modified action.yml file and modified bsp picture and add bsp README.md --- .github/workflows/action.yml | 4 + bsp/apm32/README.md | 23 + bsp/apm32/apm32e103ze-evalboard/.config | 1005 +++ bsp/apm32/apm32e103ze-evalboard/.gitignore | 42 + bsp/apm32/apm32e103ze-evalboard/Kconfig | 22 + bsp/apm32/apm32e103ze-evalboard/README.md | 122 + bsp/apm32/apm32e103ze-evalboard/SConscript | 15 + bsp/apm32/apm32e103ze-evalboard/SConstruct | 60 + .../applications/SConscript | 11 + .../apm32e103ze-evalboard/applications/main.c | 34 + bsp/apm32/apm32e103ze-evalboard/board/Kconfig | 274 + .../apm32e103ze-evalboard/board/SConscript | 40 + bsp/apm32/apm32e103ze-evalboard/board/board.c | 189 + bsp/apm32/apm32e103ze-evalboard/board/board.h | 94 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 163 + .../board/linker_scripts/link.sct | 17 + .../board/ports/drv_sdram.c | 257 + .../board/ports/drv_sdram.h | 43 + .../board/ports/fal_cfg.h | 34 + .../board/ports/sdcard_port.c | 66 + .../board/ports/spi_flash_init.c | 30 + .../figures/APM32E103ZE-EVAL.png | Bin 0 -> 539403 bytes .../figures/JFlash_Leader_01.png | Bin 0 -> 47629 bytes .../figures/JFlash_Leader_02.png | Bin 0 -> 9973 bytes .../figures/JFlash_Leader_03.png | Bin 0 -> 3590 bytes .../figures/JFlash_Leader_04.png | Bin 0 -> 12434 bytes bsp/apm32/apm32e103ze-evalboard/project.ewp | 2388 +++++++ bsp/apm32/apm32e103ze-evalboard/project.eww | 10 + .../apm32e103ze-evalboard/project.uvoptx | 865 +++ .../apm32e103ze-evalboard/project.uvprojx | 693 ++ bsp/apm32/apm32e103ze-evalboard/rtconfig.h | 243 + bsp/apm32/apm32e103ze-evalboard/rtconfig.py | 184 + bsp/apm32/apm32e103ze-evalboard/template.ewp | 2144 ++++++ bsp/apm32/apm32e103ze-evalboard/template.eww | 10 + .../apm32e103ze-evalboard/template.uvoptx | 185 + .../apm32e103ze-evalboard/template.uvprojx | 396 ++ bsp/apm32/apm32e103ze-tinyboard/.config | 1001 +++ bsp/apm32/apm32e103ze-tinyboard/.gitignore | 42 + bsp/apm32/apm32e103ze-tinyboard/Kconfig | 22 + bsp/apm32/apm32e103ze-tinyboard/README.md | 120 + bsp/apm32/apm32e103ze-tinyboard/SConscript | 15 + bsp/apm32/apm32e103ze-tinyboard/SConstruct | 60 + .../applications/SConscript | 11 + .../apm32e103ze-tinyboard/applications/main.c | 34 + bsp/apm32/apm32e103ze-tinyboard/board/Kconfig | 251 + .../apm32e103ze-tinyboard/board/SConscript | 40 + bsp/apm32/apm32e103ze-tinyboard/board/board.c | 189 + bsp/apm32/apm32e103ze-tinyboard/board/board.h | 94 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 163 + .../board/linker_scripts/link.sct | 17 + .../board/ports/fal_cfg.h | 34 + .../board/ports/sdcard_port.c | 66 + .../figures/APM32E103ZE-Tiny.png | Bin 0 -> 676510 bytes .../figures/JFlash_Leader_01.png | Bin 0 -> 47629 bytes .../figures/JFlash_Leader_02.png | Bin 0 -> 9973 bytes .../figures/JFlash_Leader_03.png | Bin 0 -> 3590 bytes .../figures/JFlash_Leader_04.png | Bin 0 -> 12434 bytes bsp/apm32/apm32e103ze-tinyboard/project.ewp | 2401 +++++++ bsp/apm32/apm32e103ze-tinyboard/project.eww | 10 + .../apm32e103ze-tinyboard/project.uvoptx | 865 +++ .../apm32e103ze-tinyboard/project.uvprojx | 693 ++ bsp/apm32/apm32e103ze-tinyboard/rtconfig.h | 243 + bsp/apm32/apm32e103ze-tinyboard/rtconfig.py | 184 + bsp/apm32/apm32e103ze-tinyboard/template.ewp | 2144 ++++++ bsp/apm32/apm32e103ze-tinyboard/template.eww | 10 + .../apm32e103ze-tinyboard/template.uvoptx | 185 + .../apm32e103ze-tinyboard/template.uvprojx | 396 ++ bsp/apm32/apm32f103vb-miniboard/.config | 1 + bsp/apm32/apm32f103vb-miniboard/board/Kconfig | 10 + bsp/apm32/apm32f103vb-miniboard/board/board.c | 29 + .../apm32f103vb-miniboard/project.uvoptx | 683 ++ .../apm32f103vb-miniboard/project.uvprojx | 8 + bsp/apm32/apm32f103xe-minibroard/.config | 45 +- .../apm32f103xe-minibroard/board/Kconfig | 13 + .../apm32f103xe-minibroard/board/board.c | 49 + .../apm32f103xe-minibroard/project.uvoptx | 695 +- .../apm32f103xe-minibroard/project.uvprojx | 306 +- bsp/apm32/apm32f103xe-minibroard/rtconfig.h | 27 - bsp/apm32/apm32f107vc-evalboard/.config | 1 + bsp/apm32/apm32f107vc-evalboard/board/Kconfig | 13 + bsp/apm32/apm32f107vc-evalboard/board/board.c | 48 + .../apm32f107vc-evalboard/project.uvoptx | 688 ++ .../apm32f107vc-evalboard/project.uvprojx | 8 + bsp/apm32/apm32f407ig-minibroard/.config | 15 +- .../apm32f407ig-minibroard/board/Kconfig | 13 + .../apm32f407ig-minibroard/board/board.c | 45 + .../apm32f407ig-minibroard/board/board.h | 3 + .../apm32f407ig-minibroard/project.uvoptx | 700 ++ .../apm32f407ig-minibroard/project.uvprojx | 19 + bsp/apm32/apm32f407ig-minibroard/rtconfig.h | 6 - bsp/apm32/apm32f407zg-evalboard/.config | 1 + bsp/apm32/apm32f407zg-evalboard/board/Kconfig | 13 + bsp/apm32/apm32f407zg-evalboard/board/board.c | 47 + .../apm32f407zg-evalboard/project.uvoptx | 695 ++ .../apm32f407zg-evalboard/project.uvprojx | 8 + bsp/apm32/apm32s103vb-miniboard/.config | 999 +++ bsp/apm32/apm32s103vb-miniboard/.gitignore | 42 + bsp/apm32/apm32s103vb-miniboard/Kconfig | 22 + bsp/apm32/apm32s103vb-miniboard/README.md | 118 + bsp/apm32/apm32s103vb-miniboard/SConscript | 15 + bsp/apm32/apm32s103vb-miniboard/SConstruct | 60 + .../applications/SConscript | 11 + .../apm32s103vb-miniboard/applications/main.c | 34 + bsp/apm32/apm32s103vb-miniboard/board/Kconfig | 213 + .../apm32s103vb-miniboard/board/SConscript | 34 + bsp/apm32/apm32s103vb-miniboard/board/board.c | 164 + bsp/apm32/apm32s103vb-miniboard/board/board.h | 88 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 163 + .../board/linker_scripts/link.sct | 17 + .../board/ports/fal_cfg.h | 34 + .../board/ports/spi_flash_init.c | 30 + .../figures/APM32S103VB-MINI.png | Bin 0 -> 629147 bytes .../figures/JFlash_Leader_01.png | Bin 0 -> 47629 bytes .../figures/JFlash_Leader_02.png | Bin 0 -> 9973 bytes .../figures/JFlash_Leader_03.png | Bin 0 -> 3590 bytes .../figures/JFlash_Leader_04.png | Bin 0 -> 12434 bytes bsp/apm32/apm32s103vb-miniboard/project.ewp | 2401 +++++++ bsp/apm32/apm32s103vb-miniboard/project.eww | 10 + .../apm32s103vb-miniboard/project.uvoptx | 872 +++ .../apm32s103vb-miniboard/project.uvprojx | 693 ++ bsp/apm32/apm32s103vb-miniboard/rtconfig.h | 243 + bsp/apm32/apm32s103vb-miniboard/rtconfig.py | 184 + bsp/apm32/apm32s103vb-miniboard/template.ewp | 2144 ++++++ bsp/apm32/apm32s103vb-miniboard/template.eww | 10 + .../apm32s103vb-miniboard/template.uvoptx | 192 + .../apm32s103vb-miniboard/template.uvprojx | 396 ++ bsp/apm32/libraries/.ignore_format.yml | 4 +- .../inc/apm32e10x_adc.h | 350 + .../inc/apm32e10x_bakpr.h | 151 + .../inc/apm32e10x_can.h | 354 + .../inc/apm32e10x_crc.h | 67 + .../inc/apm32e10x_dac.h | 197 + .../inc/apm32e10x_dbgmcu.h | 102 + .../inc/apm32e10x_dma.h | 306 + .../inc/apm32e10x_dmc.h | 379 + .../inc/apm32e10x_eint.h | 137 + .../inc/apm32e10x_fmc.h | 267 + .../inc/apm32e10x_gpio.h | 263 + .../inc/apm32e10x_i2c.h | 350 + .../inc/apm32e10x_iwdt.h | 124 + .../inc/apm32e10x_misc.h | 120 + .../inc/apm32e10x_pmu.h | 122 + .../inc/apm32e10x_rcm.h | 381 + .../inc/apm32e10x_rtc.h | 101 + .../inc/apm32e10x_sci2c.h | 325 + .../inc/apm32e10x_sdio.h | 434 ++ .../inc/apm32e10x_smc.h | 370 + .../inc/apm32e10x_spi.h | 335 + .../inc/apm32e10x_tmr.h | 678 ++ .../inc/apm32e10x_usart.h | 312 + .../inc/apm32e10x_usb.h | 597 ++ .../inc/apm32e10x_wwdt.h | 94 + .../src/apm32e10x_adc.c | 1064 +++ .../src/apm32e10x_bakpr.c | 249 + .../src/apm32e10x_can.c | 1057 +++ .../src/apm32e10x_crc.c | 127 + .../src/apm32e10x_dac.c | 412 ++ .../src/apm32e10x_dbgmcu.c | 146 + .../src/apm32e10x_dma.c | 559 ++ .../src/apm32e10x_dmc.c | 463 ++ .../src/apm32e10x_eint.c | 205 + .../src/apm32e10x_fmc.c | 769 +++ .../src/apm32e10x_gpio.c | 546 ++ .../src/apm32e10x_i2c.c | 1026 +++ .../src/apm32e10x_iwdt.c | 150 + .../src/apm32e10x_misc.c | 222 + .../src/apm32e10x_pmu.c | 270 + .../src/apm32e10x_rcm.c | 1097 +++ .../src/apm32e10x_rtc.c | 266 + .../src/apm32e10x_sci2c.c | 913 +++ .../src/apm32e10x_sdio.c | 745 ++ .../src/apm32e10x_smc.c | 976 +++ .../src/apm32e10x_spi.c | 619 ++ .../src/apm32e10x_tmr.c | 2148 ++++++ .../src/apm32e10x_usart.c | 833 +++ .../src/apm32e10x_usb.c | 409 ++ .../src/apm32e10x_wwdt.c | 160 + .../CMSIS/Include/cmsis_armcc.h | 894 +++ .../CMSIS/Include/cmsis_armclang.h | 1444 ++++ .../CMSIS/Include/cmsis_armclang_ltm.h | 1891 +++++ .../CMSIS/Include/cmsis_compiler.h | 283 + .../CMSIS/Include/cmsis_gcc.h | 2211 ++++++ .../CMSIS/Include/cmsis_iccarm.h | 935 +++ .../CMSIS/Include/cmsis_version.h | 39 + .../CMSIS/Include/core_cm3.h | 1939 ++++++ .../APM32E10x_Library/CMSIS/LICENSE.txt | 176 + .../Geehy/APM32E10x/Include/apm32e10x.h | 6107 +++++++++++++++++ .../APM32E10x/Include/system_apm32e10x.h | 59 + .../Source/arm/startup_apm32e10x_hd.s | 368 + .../APM32E10x/Source/gcc/gcc_APM32E10xxC.ld | 164 + .../APM32E10x/Source/gcc/gcc_APM32E10xxE.ld | 164 + .../Source/gcc/startup_apm32e10x_hd.S | 398 ++ .../Source/iar/startup_apm32e10x_hd.s | 504 ++ .../Geehy/APM32E10x/Source/system_apm32e10x.c | 659 ++ .../libraries/APM32E10x_Library/SConscript | 58 + .../inc/apm32s10x_adc.h | 327 + .../inc/apm32s10x_bakpr.h | 118 + .../inc/apm32s10x_can.h | 349 + .../inc/apm32s10x_crc.h | 68 + .../inc/apm32s10x_dbgmcu.h | 90 + .../inc/apm32s10x_dma.h | 262 + .../inc/apm32s10x_eint.h | 135 + .../inc/apm32s10x_fmc.h | 231 + .../inc/apm32s10x_gpio.h | 254 + .../inc/apm32s10x_i2c.h | 349 + .../inc/apm32s10x_iwdt.h | 123 + .../inc/apm32s10x_misc.h | 119 + .../inc/apm32s10x_pmu.h | 124 + .../inc/apm32s10x_qspi.h | 350 + .../inc/apm32s10x_rcm.h | 365 + .../inc/apm32s10x_rtc.h | 100 + .../inc/apm32s10x_spi.h | 248 + .../inc/apm32s10x_tmr.h | 676 ++ .../inc/apm32s10x_usart.h | 312 + .../inc/apm32s10x_wwdt.h | 94 + .../src/apm32s10x_adc.c | 1052 +++ .../src/apm32s10x_bakpr.c | 252 + .../src/apm32s10x_can.c | 1075 +++ .../src/apm32s10x_crc.c | 125 + .../src/apm32s10x_dbgmcu.c | 131 + .../src/apm32s10x_dma.c | 399 ++ .../src/apm32s10x_eint.c | 206 + .../src/apm32s10x_fmc.c | 763 ++ .../src/apm32s10x_gpio.c | 518 ++ .../src/apm32s10x_i2c.c | 1027 +++ .../src/apm32s10x_iwdt.c | 148 + .../src/apm32s10x_misc.c | 220 + .../src/apm32s10x_pmu.c | 268 + .../src/apm32s10x_qspi.c | 608 ++ .../src/apm32s10x_rcm.c | 1027 +++ .../src/apm32s10x_rtc.c | 265 + .../src/apm32s10x_spi.c | 507 ++ .../src/apm32s10x_tmr.c | 2140 ++++++ .../src/apm32s10x_usart.c | 823 +++ .../src/apm32s10x_wwdt.c | 160 + .../CMSIS/Include/cmsis_armcc.h | 894 +++ .../CMSIS/Include/cmsis_armclang.h | 1444 ++++ .../CMSIS/Include/cmsis_armclang_ltm.h | 1891 +++++ .../CMSIS/Include/cmsis_compiler.h | 283 + .../CMSIS/Include/cmsis_gcc.h | 2211 ++++++ .../CMSIS/Include/cmsis_iccarm.h | 935 +++ .../CMSIS/Include/cmsis_version.h | 39 + .../CMSIS/Include/core_cm3.h | 1937 ++++++ .../APM32S10x_Library/CMSIS/LICENSE.txt | 176 + .../Geehy/APM32S10x/Include/apm32s10x.h | 4528 ++++++++++++ .../APM32S10x/Include/system_apm32s10x.h | 60 + .../Source/arm/startup_apm32s10x_md.s | 322 + .../APM32S10x/Source/gcc/gcc_APM32S10xx8.ld | 164 + .../APM32S10x/Source/gcc/gcc_APM32S10xxB.ld | 164 + .../Source/gcc/startup_apm32s10x_md.S | 336 + .../Source/iar/startup_apm32s10x_md.s | 415 ++ .../Geehy/APM32S10x/Source/system_apm32s10x.c | 594 ++ .../libraries/APM32S10x_Library/SConscript | 52 + bsp/apm32/libraries/Drivers/SConscript | 9 + bsp/apm32/libraries/Drivers/drv_adc.c | 96 +- bsp/apm32/libraries/Drivers/drv_can.c | 881 +++ bsp/apm32/libraries/Drivers/drv_can.h | 70 + bsp/apm32/libraries/Drivers/drv_dac.c | 11 +- .../Drivers/drv_flash/drv_flash_e1.c | 210 + .../Drivers/drv_flash/drv_flash_f0.c | 2 +- .../Drivers/drv_flash/drv_flash_f1.c | 2 +- .../Drivers/drv_flash/drv_flash_s1.c | 210 + bsp/apm32/libraries/Drivers/drv_gpio.c | 41 +- bsp/apm32/libraries/Drivers/drv_hwtimer.c | 43 +- bsp/apm32/libraries/Drivers/drv_pwm.c | 31 +- bsp/apm32/libraries/Drivers/drv_rtc.c | 27 +- bsp/apm32/libraries/Drivers/drv_sdio.c | 7 +- bsp/apm32/libraries/Drivers/drv_sdio.h | 5 +- .../Drivers/drv_sdram/APM32E1/drv_sdram.c | 257 + .../Drivers/drv_sdram/APM32E1/drv_sdram.h | 43 + .../Drivers/drv_sdram/APM32F4/drv_sdram.c | 245 + .../Drivers/drv_sdram/APM32F4/drv_sdram.h | 41 + bsp/apm32/libraries/Drivers/drv_spi.c | 41 +- bsp/apm32/libraries/Drivers/drv_usart.c | 27 +- bsp/apm32/libraries/Drivers/drv_wdt.c | 9 +- bsp/apm32/libraries/Kconfig | 10 + 279 files changed, 107768 insertions(+), 462 deletions(-) create mode 100644 bsp/apm32/README.md create mode 100644 bsp/apm32/apm32e103ze-evalboard/.config create mode 100644 bsp/apm32/apm32e103ze-evalboard/.gitignore create mode 100644 bsp/apm32/apm32e103ze-evalboard/Kconfig create mode 100644 bsp/apm32/apm32e103ze-evalboard/README.md create mode 100644 bsp/apm32/apm32e103ze-evalboard/SConscript create mode 100644 bsp/apm32/apm32e103ze-evalboard/SConstruct create mode 100644 bsp/apm32/apm32e103ze-evalboard/applications/SConscript create mode 100644 bsp/apm32/apm32e103ze-evalboard/applications/main.c create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/Kconfig create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/SConscript create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/board.c create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/board.h create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.icf create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.lds create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.sct create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/ports/drv_sdram.c create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/ports/drv_sdram.h create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/ports/fal_cfg.h create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/ports/sdcard_port.c create mode 100644 bsp/apm32/apm32e103ze-evalboard/board/ports/spi_flash_init.c create mode 100644 bsp/apm32/apm32e103ze-evalboard/figures/APM32E103ZE-EVAL.png create mode 100644 bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_01.png create mode 100644 bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_02.png create mode 100644 bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_03.png create mode 100644 bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_04.png create mode 100644 bsp/apm32/apm32e103ze-evalboard/project.ewp create mode 100644 bsp/apm32/apm32e103ze-evalboard/project.eww create mode 100644 bsp/apm32/apm32e103ze-evalboard/project.uvoptx create mode 100644 bsp/apm32/apm32e103ze-evalboard/project.uvprojx create mode 100644 bsp/apm32/apm32e103ze-evalboard/rtconfig.h create mode 100644 bsp/apm32/apm32e103ze-evalboard/rtconfig.py create mode 100644 bsp/apm32/apm32e103ze-evalboard/template.ewp create mode 100644 bsp/apm32/apm32e103ze-evalboard/template.eww create mode 100644 bsp/apm32/apm32e103ze-evalboard/template.uvoptx create mode 100644 bsp/apm32/apm32e103ze-evalboard/template.uvprojx create mode 100644 bsp/apm32/apm32e103ze-tinyboard/.config create mode 100644 bsp/apm32/apm32e103ze-tinyboard/.gitignore create mode 100644 bsp/apm32/apm32e103ze-tinyboard/Kconfig create mode 100644 bsp/apm32/apm32e103ze-tinyboard/README.md create mode 100644 bsp/apm32/apm32e103ze-tinyboard/SConscript create mode 100644 bsp/apm32/apm32e103ze-tinyboard/SConstruct create mode 100644 bsp/apm32/apm32e103ze-tinyboard/applications/SConscript create mode 100644 bsp/apm32/apm32e103ze-tinyboard/applications/main.c create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/Kconfig create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/SConscript create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/board.c create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/board.h create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.icf create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.lds create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.sct create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/ports/fal_cfg.h create mode 100644 bsp/apm32/apm32e103ze-tinyboard/board/ports/sdcard_port.c create mode 100644 bsp/apm32/apm32e103ze-tinyboard/figures/APM32E103ZE-Tiny.png create mode 100644 bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_01.png create mode 100644 bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_02.png create mode 100644 bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_03.png create mode 100644 bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_04.png create mode 100644 bsp/apm32/apm32e103ze-tinyboard/project.ewp create mode 100644 bsp/apm32/apm32e103ze-tinyboard/project.eww create mode 100644 bsp/apm32/apm32e103ze-tinyboard/project.uvoptx create mode 100644 bsp/apm32/apm32e103ze-tinyboard/project.uvprojx create mode 100644 bsp/apm32/apm32e103ze-tinyboard/rtconfig.h create mode 100644 bsp/apm32/apm32e103ze-tinyboard/rtconfig.py create mode 100644 bsp/apm32/apm32e103ze-tinyboard/template.ewp create mode 100644 bsp/apm32/apm32e103ze-tinyboard/template.eww create mode 100644 bsp/apm32/apm32e103ze-tinyboard/template.uvoptx create mode 100644 bsp/apm32/apm32e103ze-tinyboard/template.uvprojx create mode 100644 bsp/apm32/apm32s103vb-miniboard/.config create mode 100644 bsp/apm32/apm32s103vb-miniboard/.gitignore create mode 100644 bsp/apm32/apm32s103vb-miniboard/Kconfig create mode 100644 bsp/apm32/apm32s103vb-miniboard/README.md create mode 100644 bsp/apm32/apm32s103vb-miniboard/SConscript create mode 100644 bsp/apm32/apm32s103vb-miniboard/SConstruct create mode 100644 bsp/apm32/apm32s103vb-miniboard/applications/SConscript create mode 100644 bsp/apm32/apm32s103vb-miniboard/applications/main.c create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/Kconfig create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/SConscript create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/board.c create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/board.h create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.icf create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.lds create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.sct create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/ports/fal_cfg.h create mode 100644 bsp/apm32/apm32s103vb-miniboard/board/ports/spi_flash_init.c create mode 100644 bsp/apm32/apm32s103vb-miniboard/figures/APM32S103VB-MINI.png create mode 100644 bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_01.png create mode 100644 bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_02.png create mode 100644 bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_03.png create mode 100644 bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_04.png create mode 100644 bsp/apm32/apm32s103vb-miniboard/project.ewp create mode 100644 bsp/apm32/apm32s103vb-miniboard/project.eww create mode 100644 bsp/apm32/apm32s103vb-miniboard/project.uvoptx create mode 100644 bsp/apm32/apm32s103vb-miniboard/project.uvprojx create mode 100644 bsp/apm32/apm32s103vb-miniboard/rtconfig.h create mode 100644 bsp/apm32/apm32s103vb-miniboard/rtconfig.py create mode 100644 bsp/apm32/apm32s103vb-miniboard/template.ewp create mode 100644 bsp/apm32/apm32s103vb-miniboard/template.eww create mode 100644 bsp/apm32/apm32s103vb-miniboard/template.uvoptx create mode 100644 bsp/apm32/apm32s103vb-miniboard/template.uvprojx create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_adc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_bakpr.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_can.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_crc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dac.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dbgmcu.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dma.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dmc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_eint.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_fmc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_gpio.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_i2c.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_iwdt.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_misc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_pmu.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_rcm.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_rtc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_sci2c.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_sdio.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_smc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_spi.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_tmr.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_usart.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_usb.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_wwdt.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_adc.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_bakpr.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_can.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_crc.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dac.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dbgmcu.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dma.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dmc.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_eint.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_fmc.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_gpio.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_i2c.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_iwdt.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_misc.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_pmu.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_rcm.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_rtc.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_sci2c.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_sdio.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_smc.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_spi.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_tmr.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_usart.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_usb.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_wwdt.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armcc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armclang.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armclang_ltm.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_compiler.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_gcc.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_iccarm.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_version.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/core_cm3.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/CMSIS/LICENSE.txt create mode 100644 bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Include/apm32e10x.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Include/system_apm32e10x.h create mode 100644 bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/arm/startup_apm32e10x_hd.s create mode 100644 bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/gcc_APM32E10xxC.ld create mode 100644 bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/gcc_APM32E10xxE.ld create mode 100644 bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/startup_apm32e10x_hd.S create mode 100644 bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/iar/startup_apm32e10x_hd.s create mode 100644 bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/system_apm32e10x.c create mode 100644 bsp/apm32/libraries/APM32E10x_Library/SConscript create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_adc.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_bakpr.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_can.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_crc.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_dbgmcu.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_dma.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_eint.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_fmc.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_gpio.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_i2c.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_iwdt.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_misc.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_pmu.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_qspi.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_rcm.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_rtc.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_spi.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_tmr.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_usart.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_wwdt.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_adc.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_bakpr.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_can.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_crc.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_dbgmcu.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_dma.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_eint.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_fmc.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_gpio.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_i2c.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_iwdt.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_misc.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_pmu.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_qspi.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_rcm.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_rtc.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_spi.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_tmr.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_usart.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_wwdt.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armcc.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armclang.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armclang_ltm.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_compiler.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_gcc.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_iccarm.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_version.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/core_cm3.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/CMSIS/LICENSE.txt create mode 100644 bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Include/apm32s10x.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Include/system_apm32s10x.h create mode 100644 bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/arm/startup_apm32s10x_md.s create mode 100644 bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/gcc_APM32S10xx8.ld create mode 100644 bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/gcc_APM32S10xxB.ld create mode 100644 bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/startup_apm32s10x_md.S create mode 100644 bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/iar/startup_apm32s10x_md.s create mode 100644 bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/system_apm32s10x.c create mode 100644 bsp/apm32/libraries/APM32S10x_Library/SConscript create mode 100644 bsp/apm32/libraries/Drivers/drv_can.c create mode 100644 bsp/apm32/libraries/Drivers/drv_can.h create mode 100644 bsp/apm32/libraries/Drivers/drv_flash/drv_flash_e1.c create mode 100644 bsp/apm32/libraries/Drivers/drv_flash/drv_flash_s1.c create mode 100644 bsp/apm32/libraries/Drivers/drv_sdram/APM32E1/drv_sdram.c create mode 100644 bsp/apm32/libraries/Drivers/drv_sdram/APM32E1/drv_sdram.h create mode 100644 bsp/apm32/libraries/Drivers/drv_sdram/APM32F4/drv_sdram.c create mode 100644 bsp/apm32/libraries/Drivers/drv_sdram/APM32F4/drv_sdram.h diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml index 1188f4ae9d..b3c3f89ddb 100644 --- a/.github/workflows/action.yml +++ b/.github/workflows/action.yml @@ -222,12 +222,16 @@ jobs: - "Infineon/psoc6-evaluationkit-062S2" - "apm32/apm32f103xe-minibroard" - "apm32/apm32f407ig-minibroard" + - "apm32/apm32f407zg-evalboard" - "apm32/apm32f072vb-miniboard" - "apm32/apm32f107vc-evalboard" - "apm32/apm32f030r8-miniboard" - "apm32/apm32f051r8-evalboard" - "apm32/apm32f091vc-miniboard" - "apm32/apm32f103vb-miniboard" + - "apm32/apm32e103ze-evalboard" + - "apm32/apm32e103ze-tinyboard" + - "apm32/apm32s103vb-miniboard" - "at32/at32f403a-start" - "at32/at32f407-start" - "at32/at32f413-start" diff --git a/bsp/apm32/README.md b/bsp/apm32/README.md new file mode 100644 index 0000000000..7123731ec5 --- /dev/null +++ b/bsp/apm32/README.md @@ -0,0 +1,23 @@ +# APM32 系列 BSP 说明 + +APM32 系列 BSP 目前支持情况如下表所示: + +| **BSP 文件夹名称** | **开发板名称** | +| :----------------------------------------------- | :------------------------------- | +| **F0 系列** | | +| [apm32f030r8-miniboard](apm32f030r8-miniboard) | 极海官方 APM32F030R8-MINI 开发板 | +| [apm32f051r8-evalboard](apm32f051r8-evalboard) | 极海官方 APM32F051R8-EVAL 开发板 | +| [apm32f072vb-miniboard](apm32f072vb-miniboard) | 极海官方 APM32F072VB-MINI 开发板 | +| [apm32f091vc-miniboard](apm32f091vc-miniboard) | 极海官方 APM32F091VC-MINI 开发板 | +| **F1 系列** | | +| [apm32f103xe-minibroard](apm32f103xe-minibroard) | 极海官方 APM32F103ZE-MINI 开发板 | +| [apm32f103vb-miniboard](apm32f103vb-miniboard) | 极海官方 APM32F103VB-MINI 开发板 | +| [apm32f107vc-evalboard](apm32f107vc-evalboard) | 极海官方 APM32F107VC-EVAL 开发板 | +| **E1 系列** | | +| [apm32e103ze-evalboard](apm32e103ze-evalboard) | 极海官方 APM32E103ZE-EVAL 开发板 | +| [apm32e103ze-tinyboard](apm32e103ze-tinyboard) | 极海官方 APM32E103ZE-Tiny 开发板 | +| **S1 系列** | | +| [apm32s103vb-miniboard](apm32s103vb-miniboard) | 极海官方 APM32S03VB-MINI 开发板 | +| **F4 系列** | | +| [apm32f407ig-minibroard](apm32f407ig-minibroard) | 极海官方 APM32F407IG-MINI 开发板 | +| [apm32f407zg-evalboard](apm32f407zg-evalboard) | 极海官方 APM32F407ZG-EVAL 开发板 | diff --git a/bsp/apm32/apm32e103ze-evalboard/.config b/bsp/apm32/apm32e103ze-evalboard/.config new file mode 100644 index 0000000000..a48763a403 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/.config @@ -0,0 +1,1005 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 + +# +# kservice optimization +# +CONFIG_RT_KSERVICE_USING_STDLIB=y +# CONFIG_RT_KSERVICE_USING_STDLIB_MEMORY 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_DEBUG=y +# CONFIG_RT_DEBUG_COLOR is not set +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG 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_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_PAGE_MAX_ORDER=11 +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x50000 +# CONFIG_RT_USING_STDC_ATOMIC is not set +# CONFIG_RT_USING_CACHE is not set +CONFIG_RT_USING_HW_ATOMIC=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M3=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +# CONFIG_RT_USING_DFS is not set +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +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=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB is not set +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# C/C++ and POSIX layer +# +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set + +# +# 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_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# 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_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_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 + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_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_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_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 + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + +# +# miscellaneous packages +# + +# +# project laboratory +# + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_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_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_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR 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_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_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_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_SENSORLAB 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_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_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 + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_U8GLIB_ARDUINO is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP 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 + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# +CONFIG_SOC_FAMILY_APM32=y +CONFIG_SOC_SERIES_APM32E1=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_APM32E103ZE=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_USB_TO_USART=y +# CONFIG_BSP_USING_SPI_FLASH is not set +# CONFIG_BSP_USING_EEPROM is not set +# CONFIG_BSP_USING_SDCARD is not set +# CONFIG_BSP_USING_SDRAM is not set + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_DAC is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_I2C is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_TMR is not set +# CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_DMC is not set diff --git a/bsp/apm32/apm32e103ze-evalboard/.gitignore b/bsp/apm32/apm32e103ze-evalboard/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/apm32/apm32e103ze-evalboard/Kconfig b/bsp/apm32/apm32e103ze-evalboard/Kconfig new file mode 100644 index 0000000000..7a400db91f --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/Kconfig @@ -0,0 +1,22 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" + diff --git a/bsp/apm32/apm32e103ze-evalboard/README.md b/bsp/apm32/apm32e103ze-evalboard/README.md new file mode 100644 index 0000000000..c0c6efcc24 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/README.md @@ -0,0 +1,122 @@ +# APM32E103ZE EVAL BOARD BSP 说明 + +## 简介 + +本文档为 APM32E103ZE EVAL 开发板(EVAL BOARD)的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。 + +## 开发板介绍 + +APM32E103ZE EVAL BOARD,采用标准JTAG/SWD调试接口,引出了全部的IO。开发板外观如下图所示: + +![board](figures/APM32E103ZE-EVAL.png) + +- 有关开发板和芯片的详情可至极海官网查阅。[官网开发板链接 ](https://www.geehy.com/support/apm32?id=192) + + +该开发板常用 **板载资源** 如下: + +- MCU:APM32E103ZET6,主频 120MHz,512KB FLASH ,128KB RAM +- 外部 RAM:M12L64164A(外部SDRAM,2MB) +- 外部 FLASH:W25Q16(SPI, 2MB) +- 常用外设 + - LED:3个,(红色,PD13/PD14/PD15) + - 按键:3个,K1(PF9),K2(PC13),K3(PA0) +- 常用接口:RS232转串口、SD卡接口、双CAN接口、USB SLAVE +- 调试接口:标准 JTAG/SWD + + + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------- | :----------: | :------------------------------------ | +| RS232转串口 | 支持 | 使用 UART1/ UART2(通过跳线选择) | +| SPI Flash | 支持 | 使用 W25Q16 芯片 | +| SD卡 | 支持 | 支持 FATFS 文件系统 | +| SDRAM | 支持 | 使用 M12L64164A 芯片 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PG15 ---> PIN: 0, 1...108 | +| UART | 支持 | UART1/2 | +| ADC | 支持 | ADC1/2/3 | +| DAC | 支持 | DAC1 | +| RTC | 支持 | 支持外部晶振和内部低速时钟 | +| TMR | 支持 | TMR1/2/3/4/5/6/7/8 | +| PWM | 支持 | TMR3 ->CH1/2/3/4 | +| I2C | 支持 | 软件I2C | +| SPI | 支持 | SPI1/2/3 | +| WDT | 支持 | IWDT | +| SDIO | 支持 | | +| Flash | 支持 | 已适配 [FAL](https://github.com/RT-Thread-packages/fal) | +| CAN | 支持 | CAN1/CAN2 | + +## 使用说明 + +本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + + +### 快速上手 + +本 BSP 为开发者提供MDK5 工程。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 +- 方式一:MDK + + 双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 J-Link 仿真器下载程序,在通过 J-Link 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +- 方式二:J-Flash下载 + + 通过ENV工具的scons指令或MDK编译出bin文件后,再使用J-Flash工具将bin文件下载至开发板即可,大致步骤如下: + +##### 1、建立J-Flash工程 + +![board](figures/JFlash_Leader_01.png) + +**注意**:步骤4选择芯片型号时,要根据自己的开发板所用的芯片型号进行选择。比如本开发板,则选择对应的 **APM32E103ZET6** 。 + +##### 2、连接开发板 + +![board](figures/JFlash_Leader_02.png) +##### 3、将bin文件拖至工程,起始地址设为0x8000000 +![board](figures/JFlash_Leader_03.png) +##### 4、点击下载 +![board](figures/JFlash_Leader_04.png) + +#### 运行结果 + +下载程序成功之后,系统会自动运行,LED 闪烁 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.1.0 build Aug 20 2021 + 2006 - 2021 Copyright by rt-thread team +msh > +``` +## 注意事项 + +- 可在极海官方网站进行所需资料下载,如pack安装包和MINI开发板原理图等(www.geehy.com); + +## 联系人信息 + +-[abbbcc ](https://gitee.com/abbbcc) + +-[stevetong459 ](https://github.com/stevetong459) + +-[luobeihai](https://github.com/luobeihai) \ No newline at end of file diff --git a/bsp/apm32/apm32e103ze-evalboard/SConscript b/bsp/apm32/apm32e103ze-evalboard/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/apm32/apm32e103ze-evalboard/SConstruct b/bsp/apm32/apm32e103ze-evalboard/SConstruct new file mode 100644 index 0000000000..97990e23f7 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/SConstruct @@ -0,0 +1,60 @@ +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, CFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $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) + +apm32_library = 'APM32E10x_Library' +rtconfig.BSP_LIBRARY_TYPE = apm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, apm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/apm32/apm32e103ze-evalboard/applications/SConscript b/bsp/apm32/apm32e103ze-evalboard/applications/SConscript new file mode 100644 index 0000000000..ca2395451a --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/apm32/apm32e103ze-evalboard/applications/main.c b/bsp/apm32/apm32e103ze-evalboard/applications/main.c new file mode 100644 index 0000000000..415c8e7598 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/applications/main.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-26 luobeihai first version + */ + +#include +#include +#include + +/* defined the LED1 pin: PD13 */ +#define LED1_PIN GET_PIN(D, 13) + +int main(void) +{ + uint32_t sysclock = 0; + /* set LED1 pin mode to output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + /* Print system clock */ + sysclock = RCM_ReadSYSCLKFreq(); + rt_kprintf("System Clock: %d\n", sysclock); + + while (1) + { + rt_pin_write(LED1_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED1_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} diff --git a/bsp/apm32/apm32e103ze-evalboard/board/Kconfig b/bsp/apm32/apm32e103ze-evalboard/board/Kconfig new file mode 100644 index 0000000000..5be25544e8 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/Kconfig @@ -0,0 +1,274 @@ +menu "Hardware Drivers Config" + +config SOC_APM32E103ZE + bool + select SOC_SERIES_APM32E1 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_USB_TO_USART + bool "Enable USB TO USART (uart1)" + select BSP_USING_UART + select BSP_USING_UART1 + default y + + config BSP_USING_SPI_FLASH + bool "Enable SPI FLASH (W25Q16 spi3)" + select BSP_USING_SPI + select BSP_USING_SPI3 + select RT_USING_SFUD + select RT_SFUD_USING_SFDP + default n + + config BSP_USING_EEPROM + bool "Enable I2C EEPROM (i2c1)" + select BSP_USING_I2C + select BSP_USING_I2C1 + default n + + config BSP_USING_SDCARD + bool "Enable SDCARD (sdio)" + select BSP_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + + config BSP_USING_SDRAM + bool "Enable SDRAM" + select BSP_USING_DMC + default n + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + config BSP_USING_UART2 + bool "Enable UART2" + default n + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + config BSP_USING_ADC3 + bool "Enable ADC3" + default n + endif + + menuconfig BSP_USING_DAC + bool "Enable DAC" + default n + select RT_USING_DAC + if BSP_USING_DAC + config BSP_USING_DAC1 + bool "Enable DAC1" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + endif + + menuconfig BSP_USING_I2C + bool "Enable I2C BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C + config BSP_USING_I2C1 + bool "Enable I2C1 BUS" + if BSP_USING_I2C1 + comment "Notice: PB6 --> 22; PB7 --> 23" + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 0 63 + default 22 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 0 63 + default 23 + endif + config BSP_USING_I2C2 + bool "Enable I2C2 BUS" + if BSP_USING_I2C2 + comment "Notice: PA0 --> 0; PA1 --> 1" + config BSP_I2C2_SCL_PIN + int "i2c2 scl pin number" + range 0 63 + default 22 + config BSP_I2C2_SDA_PIN + int "I2C2 sda pin number" + range 0 63 + default 23 + endif + config BSP_USING_I2C3 + bool "Enable I2C3 BUS" + if BSP_USING_I2C3 + comment "Notice: PB0 --> 16; PB1 --> 17" + config BSP_I2C3_SCL_PIN + int "i2c3 scl pin number" + range 0 63 + default 8 + config BSP_I2C3_SDA_PIN + int "I2C3 sda pin number" + range 0 63 + default 41 + endif + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1" + default n + + config BSP_USING_SPI2 + bool "Enable SPI2" + default n + + config BSP_USING_SPI3 + bool "Enable SPI3" + default n + endif + + menuconfig BSP_USING_TMR + bool "Enable Timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TMR + config BSP_USING_TMR1 + bool "Enable TMR1" + default n + + config BSP_USING_TMR2 + bool "Enable TMR2" + default n + + config BSP_USING_TMR3 + bool "Enable TMR3" + default n + + config BSP_USING_TMR4 + bool "Enable TMR4" + default n + + config BSP_USING_TMR5 + bool "Enable TMR5" + default n + + config BSP_USING_TMR6 + bool "Enable TMR6" + default n + + config BSP_USING_TMR7 + bool "Enable TMR7" + default n + + config BSP_USING_TMR8 + bool "Enable TMR8" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable PWM" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM3 + bool "Enable timer3 output PWM" + default n + if BSP_USING_PWM3 + config BSP_USING_PWM3_CH1 + bool "Enable PWM3 channel1" + default n + + config BSP_USING_PWM3_CH2 + bool "Enable PWM3 channel2" + default n + + config BSP_USING_PWM3_CH3 + bool "Enable PWM3 channel3" + default n + + config BSP_USING_PWM3_CH4 + bool "Enable PWM3 channel4" + default n + endif + endif + + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + config BSP_USING_CAN2 + bool "Enable CAN2" + default n + endif + + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + + config BSP_USING_DMC + bool + default n + +endmenu + +endmenu diff --git a/bsp/apm32/apm32e103ze-evalboard/board/SConscript b/bsp/apm32/apm32e103ze-evalboard/board/SConscript new file mode 100644 index 0000000000..12efa4f337 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/SConscript @@ -0,0 +1,40 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +''') + +if GetDepend(['BSP_USING_SPI_FLASH']): + src += Glob('ports/spi_flash_init.c') + +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + +if GetDepend(['BSP_USING_SDRAM']): + src += Glob('ports/drv_sdram.c') + +path = [cwd] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.PLATFORM in ['armcc', 'armclang']: + src += [startup_path_prefix + '/APM32E10x_Library/Device/Geehy/APM32E10x/Source/arm/startup_apm32e10x_hd.s'] + +if rtconfig.PLATFORM in ['iccarm']: + src += [startup_path_prefix + '/APM32E10x_Library/Device/Geehy/APM32E10x/Source/iar/startup_apm32e10x_hd.s'] + +if rtconfig.PLATFORM in ['gcc']: + src += [startup_path_prefix + '/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/startup_apm32e10x_hd.S'] + +# You can select chips from the list above +CPPDEFINES = ['APM32E10X_HD'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +Return('group') diff --git a/bsp/apm32/apm32e103ze-evalboard/board/board.c b/bsp/apm32/apm32e103ze-evalboard/board/board.c new file mode 100644 index 0000000000..e48145c578 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/board.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-26 luobeihai first version + */ + +#include "board.h" + +void apm32_usart_init(void) +{ + GPIO_Config_T GPIO_ConfigStruct; + +#ifdef BSP_USING_UART1 + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_USART1); + + GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP; + GPIO_ConfigStruct.pin = GPIO_PIN_9; + GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); + + GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU; + GPIO_ConfigStruct.pin = GPIO_PIN_10; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); +#endif + +#ifdef BSP_USING_UART2 + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2); + + GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP; + GPIO_ConfigStruct.pin = GPIO_PIN_2; + GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); + + GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU; + GPIO_ConfigStruct.pin = GPIO_PIN_3; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); +#endif +} + +/** + * apm32 timer gpio init + * + */ +void apm32_msp_timer_init(void *Instance) +{ +#ifdef BSP_USING_PWM3 + GPIO_Config_T gpio_config; + TMR_T *tmr_x = (TMR_T *)Instance; + + if (tmr_x == TMR3) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOC | RCM_APB2_PERIPH_AFIO); + + GPIO_ConfigPinRemap(GPIO_FULL_REMAP_TMR3); + + /* TMR3 channel 1 gpio config */ + gpio_config.pin = GPIO_PIN_6; + gpio_config.mode = GPIO_MODE_AF_PP; + gpio_config.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 2 gpio config */ + gpio_config.pin = GPIO_PIN_7; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 3 gpio config */ + gpio_config.pin = GPIO_PIN_8; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 4 gpio config */ + gpio_config.pin = GPIO_PIN_9; + GPIO_Config(GPIOC, &gpio_config); + } +#endif +} + +/** + * apm32 spi gpio init + * + */ +void apm32_msp_spi_init(void *Instance) +{ +#ifdef BSP_USING_SPI + GPIO_Config_T gpioConfig; + SPI_T *spi_x = (SPI_T *)Instance; + + if(spi_x == SPI3) + { + /* Enable related Clock */ + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_SPI3); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB | RCM_APB2_PERIPH_AFIO); + + GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE); + + /* Configure FLASH_SPI pins: SCK */ + gpioConfig.pin = GPIO_PIN_3; + gpioConfig.mode = GPIO_MODE_AF_PP; + gpioConfig.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &gpioConfig); + + /* Configure FLASH_SPI pins: MOSI */ + gpioConfig.pin = GPIO_PIN_5; + GPIO_Config(GPIOB, &gpioConfig); + + /* Configure FLASH_SPI pins: MISO */ + gpioConfig.pin = GPIO_PIN_4; + gpioConfig.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &gpioConfig); + } +#endif +} + +/** + * apm32 sdio gpio init + * + */ +void apm32_msp_sdio_init(void *Instance) +{ +#ifdef BSP_USING_SDIO + GPIO_Config_T GPIO_InitStructure; + + /* Enable the GPIO Clock */ + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOC | RCM_APB2_PERIPH_GPIOD); + + /* Enable the SDIO Clock */ + RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_SDIO); + + /* Configure the GPIO pin */ + GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOC, &GPIO_InitStructure); + + GPIO_InitStructure.pin = GPIO_PIN_2; + GPIO_Config(GPIOD, &GPIO_InitStructure); +#endif +} + +void apm32_msp_can_init(void *Instance) +{ +#if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) + GPIO_Config_T GPIO_InitStructure; + CAN_T *CANx = (CAN_T *)Instance; + + if (CAN1 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + GPIO_ConfigPinRemap(GPIO_REMAP1_CAN1); + + /* CAN1 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_9; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + /* CAN1 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_8; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &GPIO_InitStructure); + } + else if (CAN2 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + /* CAN2 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_13; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + /* CAN2 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_12; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &GPIO_InitStructure); + } +#endif +} diff --git a/bsp/apm32/apm32e103ze-evalboard/board/board.h b/bsp/apm32/apm32e103ze-evalboard/board/board.h new file mode 100644 index 0000000000..2274bb453b --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/board.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-26 luobeihai first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include + +#include "apm32e10x_gpio.h" +#include "apm32e10x_rcm.h" +#include "apm32e10x_misc.h" +#include "apm32e10x_rcm.h" +#include "apm32e10x_eint.h" +#include "apm32e10x_usart.h" +#include "apm32e10x_dma.h" + +#if defined(RT_USING_ADC) + #include "apm32e10x_adc.h" +#endif +#if defined(RT_USING_DAC) + #include "apm32e10x_dac.h" +#endif +#if defined(RT_USING_RTC) + #include "apm32e10x_rtc.h" + #include "apm32e10x_pmu.h" +#endif +#if defined(RT_USING_SPI) + #include "apm32e10x_spi.h" +#endif +#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) + #include "apm32e10x_tmr.h" +#endif +#if defined(RT_USING_WDT) + #include "apm32e10x_iwdt.h" + #include "apm32e10x_wwdt.h" +#endif +#if defined(BSP_USING_SDCARD) + #include "apm32e10x_sdio.h" +#endif +#if defined(BSP_USING_ON_CHIP_FLASH) + #include "apm32e10x_fmc.h" +#endif +#if defined(RT_USING_CAN) + #include "apm32e10x_can.h" +#endif +#if defined(BSP_USING_SDRAM) + #include "apm32e10x_dmc.h" +#endif + +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define APM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define APM32_FLASH_SIZE (512 * 1024) +#define APM32_FLASH_END_ADDRESS ((uint32_t)(APM32_FLASH_START_ADRESS + APM32_FLASH_SIZE)) + +/* Internal SRAM memory size[Kbytes] <6-128>, Default: 128 */ +#define APM32_SRAM_SIZE 128 +#define APM32_SRAM_END (0x20000000 + APM32_SRAM_SIZE * 1024) + +#if defined(__ARMCC_VERSION) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END APM32_SRAM_END + +void SystemClock_Config(void); + +void apm32_usart_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.icf b/bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.icf new file mode 100644 index 0000000000..8a71ffd87c --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/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__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-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}; diff --git a/bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.lds b/bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.lds new file mode 100644 index 0000000000..01fc272e96 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.lds @@ -0,0 +1,163 @@ +/* + * linker script for APM32E10x with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* 512K flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128K /* 128K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x400; + +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 = .; + _start_address_init_data = .; + } > 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 = . ; + _start_address_data = .; + + *(.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 = . ; + _end_address_data = .; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + _end_stack = .; + } >RAM + + __bss_start = .; + _start_address_bss = .; + .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_address_bss = .; + + _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/apm32/apm32e103ze-evalboard/board/linker_scripts/link.sct b/bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.sct new file mode 100644 index 0000000000..5f21bc4aa3 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/linker_scripts/link.sct @@ -0,0 +1,17 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data + .ANY (+RW +ZI) + } +} + + diff --git a/bsp/apm32/apm32e103ze-evalboard/board/ports/drv_sdram.c b/bsp/apm32/apm32e103ze-evalboard/board/ports/drv_sdram.c new file mode 100644 index 0000000000..23ee916ae4 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/ports/drv_sdram.c @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#include + +#ifdef BSP_USING_SDRAM +#include "drv_sdram.h" + +#define DRV_DEBUG +#define LOG_TAG "drv.sdram" +#include + +/* SDRAM GPIO Clock */ +#define RCM_SDRAM_GPIO_PERIPH (RCM_APB2_PERIPH_AFIO | \ + RCM_APB2_PERIPH_GPIOB | \ + RCM_APB2_PERIPH_GPIOC | \ + RCM_APB2_PERIPH_GPIOD | \ + RCM_APB2_PERIPH_GPIOE | \ + RCM_APB2_PERIPH_GPIOF | \ + RCM_APB2_PERIPH_GPIOG) + +/* SDRAM Peripheral Clock */ +#define RCM_SDRAM_PERIPH (RCM_AHB_PERIPH_SMC) + +#ifdef RT_USING_MEMHEAP_AS_HEAP +static struct rt_memheap system_heap; +#endif + +/** + * @brief SDRAM divider Number + */ +typedef enum +{ + RCM_DMC_DIV_1, + RCM_DMC_DIV_2, + RCM_DMC_DIV_4 = 3 +} RCM_DMC_DIV_T; + +/** + * @brief Configs the SDRAM clock prescaler + * @param SDRAMDiv: Specifies the SDRAM clock prescaler from the DMC clock. + * @retval None + */ +static void RCM_ConfigSDRAMCLK(RCM_DMC_DIV_T SDRAMDiv) +{ + RCM->CFG_B.SDRAMPSC = SDRAMDiv; +} + +/** + * @brief sdram gpio init + * @param None + * @retval None + */ +static void SDRAM_GPIO_Init(void) +{ + GPIO_Config_T gpioConfig; + + RCM_EnableAPB2PeriphClock(RCM_SDRAM_GPIO_PERIPH); + + /** SDRAM pins assignment */ + /** + +-------------------------+--------------------------+--------------------------+ + | PB10 <-> MMC_SDRAM_UDQM | PC10 <-> MMC_SDRAM_D8 | PD2 <-> MMC_SDRAM_D10 | + | PB11 <-> MMC_SDRAM_CKE | PC11 <-> MMC_SDRAM_D9 | PD3 <-> MMC_SDRAM_D11 | + | | | PD4 <-> MMC_SDRAM_D12 | + | | | PD5 <-> MMC_SDRAM_D13 | + | | | PD6 <-> MMC_SDRAM_D14 | + +-------------------------+--------------------------+--------------------------+ + | PE3 <-> MMC_SDRAM_D4 | PF0 <-> MMC_SDRAM_D7 | PG0 <-> MMC_SDRAM_A3 | + | PE5 <-> MMC_SDRAM_D5 | PF2 <-> MMC_SDRAM_NCS | PG9 <-> MMC_SDRAM_D15 | + | PE6 <-> MMC_SDRAM_D6 | PF4 <-> MMC_SDRAM_NRAS | PG12 <-> MMC_SDRAM_D0 | + | PE8 <-> MMC_SDRAM_A4 | PF5 <-> MMC_SDRAM_NCAS | PG13 <-> MMC_SDRAM_D1 | + | PE9 <-> MMC_SDRAM_A5 | PF6 <-> MMC_SDRAM_NWE | PG14 <-> MMC_SDRAM_D2 | + | PE10 <-> MMC_SDRAM_A6 | PF10 <-> MMC_SDRAM_LDQM | PG15 <-> MMC_SDRAM_D3 | + | PE11 <-> MMC_SDRAM_A7 | PF11 <-> MMC_SDRAM_Bank | | + | PE12 <-> MMC_SDRAM_A8 | PF12 <-> MMC_SDRAM_A10 | | + | PE13 <-> MMC_SDRAM_A9 | PF13 <-> MMC_SDRAM_A0 | | + | PE15 <-> MMC_SDRAM_CLK | PF14 <-> MMC_SDRAM_A1 | | + | | PF15 <-> MMC_SDRAM_A2 | | + +-------------------------+--------------------------+--------------------------+ + */ + + gpioConfig.speed = GPIO_SPEED_50MHz; + gpioConfig.mode = GPIO_MODE_AF_PP; + + gpioConfig.pin = GPIO_PIN_10 | GPIO_PIN_11; + GPIO_Config(GPIOB, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_10 | GPIO_PIN_11; + GPIO_Config(GPIOC, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_2 | GPIO_PIN_3 | + GPIO_PIN_4 | GPIO_PIN_5 | + GPIO_PIN_6; + GPIO_Config(GPIOD, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_3 | GPIO_PIN_5 | + GPIO_PIN_6 | GPIO_PIN_8 | + GPIO_PIN_9 | GPIO_PIN_10| + GPIO_PIN_11 | GPIO_PIN_12 | + GPIO_PIN_13 | GPIO_PIN_15 ; + GPIO_Config(GPIOE, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_4 | + GPIO_PIN_5 | GPIO_PIN_6 | + GPIO_PIN_10 |GPIO_PIN_11 | + GPIO_PIN_12 | GPIO_PIN_13| + GPIO_PIN_14 | GPIO_PIN_15; + GPIO_Config(GPIOF, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_0 | GPIO_PIN_9| + GPIO_PIN_12 | GPIO_PIN_13 | + GPIO_PIN_14 | GPIO_PIN_15; + GPIO_Config(GPIOG, &gpioConfig); +} + +/** + * @brief sdram init + * @param None + * @retval None + */ +static int SDRAM_Init(void) +{ + int result = RT_EOK; + + DMC_Config_T dmc_init_config; + DMC_TimingConfig_T dmc_timing_config; + + /* Config the SDRAM clock prescaler */ + RCM_ConfigSDRAMCLK(RCM_DMC_DIV_2); + + /* enable sdram clock */ + RCM_EnableAHBPeriphClock(RCM_SDRAM_PERIPH); + + /* sdram gpio init */ + SDRAM_GPIO_Init(); + + /* dmc timing config */ + dmc_timing_config.latencyCAS = DMC_CAS_LATENCY_3; //!< Configure CAS latency period + dmc_timing_config.tARP = DMC_AUTO_REFRESH_10; //!< Configure auto refresh period + dmc_timing_config.tRAS = DMC_RAS_MINIMUM_5; //!< Configure line activation and precharging minimum time + dmc_timing_config.tCMD = DMC_ATA_CMD_7; //!< Configure active to active period + dmc_timing_config.tRCD = DMC_DELAY_TIME_2; //!< Configure RAS To CAS delay Time + dmc_timing_config.tRP = DMC_PRECHARGE_2; //!< Configure precharge period + dmc_timing_config.tWR = DMC_NEXT_PRECHARGE_2; //!< Configure time between the Last Data and The Next Precharge for write + dmc_timing_config.tXSR = 6; //!< Configure XSR0 + dmc_timing_config.tRFP = 0xC3; //!< Configure refresh Cycle + +#if SDRAM_TARGET_BANK == 1 + dmc_init_config.bankWidth = DMC_BANK_WIDTH_1; //!< Configure bank address width +#else + dmc_init_config.bankWidth = DMC_BANK_WIDTH_2; //!< Configure bank address width +#endif + dmc_init_config.clkPhase = DMC_CLK_PHASE_REVERSE; //!< Configure clock phase + dmc_init_config.rowWidth = SDRAM_ROW_BITS; //!< Configure row address width + dmc_init_config.colWidth = SDRAM_COLUMN_BITS; //!< Configure column address width + dmc_init_config.memorySize = SDRAM_MEMORY_SIZE; + dmc_init_config.timing = dmc_timing_config; + + DMC_Config(&dmc_init_config); + DMC_ConfigOpenBank(DMC_BANK_NUMBER_2); + DMC_EnableAccelerateModule(); + + DMC_Enable(); + + LOG_D("sdram clock: %d MHz\r\n", RCM_ReadSYSCLKFreq()/1000000/(RCM->CFG_B.SDRAMPSC + 1)); + LOG_D("sdram init success, mapped at 0x%X, size is %d bytes, data width is %d", SDRAM_BANK_ADDR, SDRAM_SIZE, SDRAM_DATA_WIDTH); + +#ifdef RT_USING_MEMHEAP_AS_HEAP + /* If RT_USING_MEMHEAP_AS_HEAP is enabled, SDRAM is initialized to the heap */ + rt_memheap_init(&system_heap, "sdram", (void *)SDRAM_BANK_ADDR, SDRAM_SIZE); +#endif + + return result; +} +INIT_BOARD_EXPORT(SDRAM_Init); + +#ifdef DRV_DEBUG +#ifdef FINSH_USING_MSH +int sdram_test(void) +{ + int i = 0; + uint32_t start_time = 0, time_cast = 0; +#if SDRAM_DATA_WIDTH == 8 + char data_width = 1; + uint8_t data = 0; +#elif SDRAM_DATA_WIDTH == 16 + char data_width = 2; + uint16_t data = 0; +#else + char data_width = 4; + uint32_t data = 0; +#endif + + /* write data */ + LOG_D("Writing the %ld bytes data, waiting....", SDRAM_SIZE); + start_time = rt_tick_get(); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { +#if SDRAM_DATA_WIDTH == 8 + *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint8_t)(i % 100); +#elif SDRAM_DATA_WIDTH == 16 + *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint16_t)(i % 1000); +#else + *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint32_t)(i % 1000); +#endif + } + time_cast = rt_tick_get() - start_time; + LOG_D("Write data success, total time: %d.%03dS.", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + + /* read data */ + LOG_D("start Reading and verifying data, waiting...."); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { +#if SDRAM_DATA_WIDTH == 8 + data = *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 100) + { + LOG_E("SDRAM test failed!"); + break; + } +#elif SDRAM_DATA_WIDTH == 16 + data = *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 1000) + { + LOG_E("SDRAM test failed!"); + break; + } +#else + data = *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 1000) + { + LOG_E("SDRAM test failed!"); + break; + } +#endif + } + + if (i >= SDRAM_SIZE / data_width) + { + LOG_D("SDRAM test success!"); + } + + return RT_EOK; +} +MSH_CMD_EXPORT(sdram_test, sdram test) +#endif /* FINSH_USING_MSH */ +#endif /* DRV_DEBUG */ +#endif /* BSP_USING_SDRAM */ diff --git a/bsp/apm32/apm32e103ze-evalboard/board/ports/drv_sdram.h b/bsp/apm32/apm32e103ze-evalboard/board/ports/drv_sdram.h new file mode 100644 index 0000000000..35c7d2b02b --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/ports/drv_sdram.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#ifndef __DRV_SDRAM_H__ +#define __DRV_SDRAM_H__ + +/* parameters for sdram peripheral */ +/* Bank1 or Bank2 */ +#define SDRAM_TARGET_BANK 1 +/* apm32f407 Bank Addr: 0x60000000 */ +#define SDRAM_BANK_ADDR ((uint32_t)0x60000000) +/* data width: 8, 16, 32 */ +#define SDRAM_DATA_WIDTH 16 +/* column bit numbers */ +#define SDRAM_COLUMN_BITS DMC_COL_WIDTH_8 +/* row bit numbers */ +#define SDRAM_ROW_BITS DMC_ROW_WIDTH_11 + +#define SDRAM_MEMORY_SIZE DMC_MEMORY_SIZE_2MB + +#define SDRAM_SIZE ((uint32_t)0x200000) + +/* memory mode register */ +#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) +#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) +#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004) +#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) +#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) +#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) +#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) + +#endif diff --git a/bsp/apm32/apm32e103ze-evalboard/board/ports/fal_cfg.h b/bsp/apm32/apm32e103ze-evalboard/board/ports/fal_cfg.h new file mode 100644 index 0000000000..5aa5acced7 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/ports/fal_cfg.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ + +#include +#include + +extern const struct fal_flash_dev apm32_onchip_flash; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ +{ \ + &apm32_onchip_flash, \ +} +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG + +/* partition table */ +#define FAL_PART_TABLE \ +{ \ + {FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 496 * 1024, 0}, \ + {FAL_PART_MAGIC_WROD, "param", "onchip_flash", 496* 1024 , 16 * 1024, 0}, \ +} +#endif /* FAL_PART_HAS_TABLE_CFG */ +#endif /* _FAL_CFG_H_ */ diff --git a/bsp/apm32/apm32e103ze-evalboard/board/ports/sdcard_port.c b/bsp/apm32/apm32e103ze-evalboard/board/ports/sdcard_port.c new file mode 100644 index 0000000000..4c81ecfb45 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/ports/sdcard_port.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-27 luobeihai first version + */ + +#include + +#ifdef BSP_USING_SDCARD + +#include +#include +#include +#include +#include +#include +#include + +#define DBG_TAG "app.card" +#define DBG_LVL DBG_INFO +#include + +void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + if(rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/'"); + break; + } + else + { + LOG_W("sd card mount to '/' failed!"); + } + } + } +} + +int apm32_sdcard_mount(void) +{ + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 2048, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } + return RT_EOK; +} +INIT_APP_EXPORT(apm32_sdcard_mount); + +#endif /* BSP_USING_SDCARD */ + diff --git a/bsp/apm32/apm32e103ze-evalboard/board/ports/spi_flash_init.c b/bsp/apm32/apm32e103ze-evalboard/board/ports/spi_flash_init.c new file mode 100644 index 0000000000..f5fba50b39 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/board/ports/spi_flash_init.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#include +#include "spi_flash.h" +#include "spi_flash_sfud.h" +#include "drv_spi.h" + +#if defined(BSP_USING_SPI_FLASH) +static int rt_hw_spi_flash_init(void) +{ + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); + rt_hw_spi_device_attach("spi3", "spi30", GPIOA, GPIO_PIN_15); + + if (RT_NULL == rt_sfud_flash_probe("W25Q16", "spi30")) + { + return -RT_ERROR; + } + + return RT_EOK; +} +INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); +#endif diff --git a/bsp/apm32/apm32e103ze-evalboard/figures/APM32E103ZE-EVAL.png b/bsp/apm32/apm32e103ze-evalboard/figures/APM32E103ZE-EVAL.png new file mode 100644 index 0000000000000000000000000000000000000000..444a3658e0dac34e55b1aa97282e800dde879cbc GIT binary patch literal 539403 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

As8@t7+%w7#IS`yu@H=@8W%8p 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 -$ahEb*mMuRi^4z`zk! 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

Zl}Zsc*M9webQvxx0rYrKVZ_ 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
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 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 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0APM32E10x_512 -FL080000 -FS08000000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM) + + + 0 + JL2CM3 + -U150710805 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0APM32E10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM) + + + + + 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 + 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\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 5 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 25 + 2 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\arm\startup_apm32e10x_hd.s + startup_apm32e10x_hd.s + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_eint.c + apm32e10x_eint.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_misc.c + apm32e10x_misc.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_gpio.c + apm32e10x_gpio.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\system_apm32e10x.c + system_apm32e10x.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_usart.c + apm32e10x_usart.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_rcm.c + apm32e10x_rcm.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_dma.c + apm32e10x_dma.c + 0 + 0 + + + + diff --git a/bsp/apm32/apm32e103ze-evalboard/project.uvprojx b/bsp/apm32/apm32e103ze-evalboard/project.uvprojx new file mode 100644 index 0000000000..dc285a0764 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/project.uvprojx @@ -0,0 +1,693 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + APM32E103ZE + Geehy + Geehy.APM32E1xx_DFP.1.0.0 + https://www.geehy.com/uploads/tool/ + IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32E10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM)) + 0 + $$Device:APM32E103ZE$Device\Include\apm32e10x.h + + + + + + + + + + $$Device:APM32E103ZE$SVD\APM32E103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 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-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 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 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + __STDC_LIMIT_MACROS, APM32E10X_HD, USE_STDPERIPH_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, RT_USING_ARMLIBC + + board;applications;..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\inc;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m3;..\..\..\libcpu\arm\common;..\libraries\Drivers;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\stdio;..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Include;..\..\..\components\finsh;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\Drivers\config;..\libraries\APM32E10x_Library\CMSIS\Include;board\ports;..\..\..\components\drivers\include;.;..\..\..\include;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + 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 + + + cstdio.c + 1 + ..\..\..\components\libc\compilers\common\cstdio.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 + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + CPU + + + atomic_arm.c + 1 + ..\..\..\libcpu\arm\common\atomic_arm.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + + + DeviceDrivers + + + completion.c + 1 + ..\..\..\components\drivers\ipc\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + startup_apm32e10x_hd.s + 2 + ..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\arm\startup_apm32e10x_hd.s + + + drv_common.c + 1 + ..\libraries\Drivers\drv_common.c + + + drv_gpio.c + 1 + ..\libraries\Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\Drivers\drv_usart.c + + + + + Finsh + + + 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 + 1 + ..\..\..\components\finsh\cmd.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler_up.c + 1 + ..\..\..\src\scheduler_up.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Libraries + + + apm32e10x_eint.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_eint.c + + + apm32e10x_misc.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_misc.c + + + apm32e10x_gpio.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_gpio.c + + + system_apm32e10x.c + 1 + ..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\system_apm32e10x.c + + + apm32e10x_usart.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_usart.c + + + apm32e10x_rcm.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_rcm.c + + + apm32e10x_dma.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_dma.c + + + + + + + + + + + + + +
diff --git a/bsp/apm32/apm32e103ze-evalboard/rtconfig.h b/bsp/apm32/apm32e103ze-evalboard/rtconfig.h new file mode 100644 index 0000000000..52433cb937 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/rtconfig.h @@ -0,0 +1,243 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 8 +#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 RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* kservice optimization */ + +#define RT_KSERVICE_USING_STDLIB +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_PAGE_MAX_ORDER 11 +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x50000 +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M3 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#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 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 + +/* 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_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using USB */ + + +/* C/C++ and POSIX layer */ + +#define RT_LIBC_DEFAULT_TIMEZONE 8 + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + + +/* Network */ + + +/* Utilities */ + + +/* RT-Thread Utestcases */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + + +/* XML: Extensible Markup Language */ + + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + + +/* u8g2: a monochrome graphic library */ + + +/* tools packages */ + + +/* system packages */ + +/* enhanced kernel services */ + + +/* acceleration: Assembly language or algorithmic acceleration packages */ + + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + + +/* Micrium: Micrium software products porting for RT-Thread */ + + +/* peripheral libraries and drivers */ + +/* sensors drivers */ + + +/* touch drivers */ + + +/* Kendryte SDK */ + + +/* AI packages */ + + +/* Signal Processing and Control Algorithm Packages */ + + +/* miscellaneous packages */ + +/* project laboratory */ + +/* samples: kernel and components samples */ + + +/* entertainment: terminal games and other interesting software packages */ + + +/* Arduino libraries */ + + +/* Projects */ + + +/* Sensors */ + + +/* Display */ + + +/* Timing */ + + +/* Data Processing */ + + +/* Data Storage */ + +/* Communication */ + + +/* Device Control */ + + +/* Other */ + + +/* Signal IO */ + + +/* Uncategorized */ + +#define SOC_FAMILY_APM32 +#define SOC_SERIES_APM32E1 + +/* Hardware Drivers Config */ + +#define SOC_APM32E103ZE + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_USB_TO_USART + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 + +#endif diff --git a/bsp/apm32/apm32e103ze-evalboard/rtconfig.py b/bsp/apm32/apm32e103ze-evalboard/rtconfig.py new file mode 100644 index 0000000000..7b1531669a --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m3' +CROSS_TOOL='gcc' + +# 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'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = r'E:\IAR' + +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-m3 -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' + + 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-M3 ' + 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 == 'armclang': + # toolchains + CC = 'armclang' + CXX = 'armclang' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M1.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m0 ' + CFLAGS += ' -mcpu=cortex-m0 ' + CFLAGS += ' -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar ' + CFLAGS += ' -gdwarf-3 -ffunction-sections ' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers ' + LFLAGS += ' --list rt-thread.map ' + LFLAGS += r' --strict --scatter "board\linker_scripts\link.sct" ' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib' + + EXEC_PATH += '/ARM/ARMCLANG/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O1' # armclang recommend + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # 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-M3' + 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-M3' + 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/apm32/apm32e103ze-evalboard/template.ewp b/bsp/apm32/apm32e103ze-evalboard/template.ewp new file mode 100644 index 0000000000..62e3416ef6 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/template.ewp @@ -0,0 +1,2144 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 1 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + diff --git a/bsp/apm32/apm32e103ze-evalboard/template.eww b/bsp/apm32/apm32e103ze-evalboard/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/apm32/apm32e103ze-evalboard/template.uvoptx b/bsp/apm32/apm32e103ze-evalboard/template.uvoptx new file mode 100644 index 0000000000..208b29d80d --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/template.uvoptx @@ -0,0 +1,185 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 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 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0APM32E10x_512 -FL080000 -FS08000000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM) + + + 0 + JL2CM3 + -U150710805 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0APM32E10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM) + + + + + 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 + 0 + 0 + + + + + + + + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/apm32/apm32e103ze-evalboard/template.uvprojx b/bsp/apm32/apm32e103ze-evalboard/template.uvprojx new file mode 100644 index 0000000000..fb5044d404 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/template.uvprojx @@ -0,0 +1,396 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + APM32E103ZE + Geehy + Geehy.APM32E1xx_DFP.1.0.0 + https://www.geehy.com/uploads/tool/ + IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32E10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM)) + 0 + $$Device:APM32E103ZE$Device\Include\apm32e10x.h + + + + + + + + + + $$Device:APM32E103ZE$SVD\APM32E103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 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-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 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 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
diff --git a/bsp/apm32/apm32e103ze-tinyboard/.config b/bsp/apm32/apm32e103ze-tinyboard/.config new file mode 100644 index 0000000000..65c17beaaa --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/.config @@ -0,0 +1,1001 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 + +# +# kservice optimization +# +CONFIG_RT_KSERVICE_USING_STDLIB=y +# CONFIG_RT_KSERVICE_USING_STDLIB_MEMORY 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_DEBUG=y +# CONFIG_RT_DEBUG_COLOR is not set +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG 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_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_PAGE_MAX_ORDER=11 +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x50000 +# CONFIG_RT_USING_STDC_ATOMIC is not set +# CONFIG_RT_USING_CACHE is not set +CONFIG_RT_USING_HW_ATOMIC=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M3=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +# CONFIG_RT_USING_DFS is not set +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +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=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB is not set +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# C/C++ and POSIX layer +# +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set + +# +# 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_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# 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_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_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 + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_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_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_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 + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + +# +# miscellaneous packages +# + +# +# project laboratory +# + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_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_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_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR 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_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_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_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_SENSORLAB 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_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_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 + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_U8GLIB_ARDUINO is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP 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 + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# +CONFIG_SOC_FAMILY_APM32=y +CONFIG_SOC_SERIES_APM32E1=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_APM32E103ZE=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_USB_TO_USART=y +# CONFIG_BSP_USING_SDCARD is not set + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_DAC is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_I2C is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_TMR is not set +# CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set +# CONFIG_BSP_USING_WDT is not set diff --git a/bsp/apm32/apm32e103ze-tinyboard/.gitignore b/bsp/apm32/apm32e103ze-tinyboard/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/apm32/apm32e103ze-tinyboard/Kconfig b/bsp/apm32/apm32e103ze-tinyboard/Kconfig new file mode 100644 index 0000000000..7a400db91f --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/Kconfig @@ -0,0 +1,22 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" + diff --git a/bsp/apm32/apm32e103ze-tinyboard/README.md b/bsp/apm32/apm32e103ze-tinyboard/README.md new file mode 100644 index 0000000000..f751385b5d --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/README.md @@ -0,0 +1,120 @@ +# APM32E103ZE Tiny BOARD BSP 说明 + +## 简介 + +本文档为 APM32E103ZE Tiny 开发板(Tiny BOARD)的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。 + +## 开发板介绍 + +APM32E103ZE Tiny BOARD,采用标准JTAG/SWD调试接口,引出了全部的IO。开发板外观如下图所示: + +![board](figures/APM32E103ZE-Tiny.png) + +- 有关开发板和芯片的详情可至极海官网查阅。[官网开发板链接 ](https://www.geehy.com/support/apm32?id=192) + + +该开发板常用 **板载资源** 如下: + +- MCU:APM32E103ZET6,主频 120MHz,512KB FLASH ,128KB RAM +- 外部 RAM:无 +- 外部 FLASH:无 +- 常用外设 + - LED:3个,(红色,PD13/PD14/PD15) + - 按键:3个,K1(PF9),K2(PA0),K3(PC13) +- 常用接口:USB SLAVE +- 调试接口:标准 JTAG/SWD + + + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------- | :----------: | :------------------------------------ | +| USB转串口 | 支持 | 需要使用外接的USB转TTL模块 | +| SD卡 | 支持 | 支持 FATFS 文件系统 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PG15 ---> PIN: 0, 1...108 | +| UART | 支持 | UART1/2 | +| ADC | 支持 | ADC1/2/3 | +| DAC | 支持 | DAC1 | +| RTC | 支持 | 支持外部晶振和内部低速时钟 | +| TMR | 支持 | TMR1/2/3/4/5/6/7/8 | +| PWM | 支持 | TMR3 ->CH1/2/3/4 | +| I2C | 支持 | 软件I2C | +| SPI | 支持 | SPI1/2/3 | +| WDT | 支持 | IWDT | +| SDIO | 支持 | | +| Flash | 支持 | 已适配 [FAL](https://github.com/RT-Thread-packages/fal) | +| CAN | 支持 | CAN1/CAN2 | + +## 使用说明 + +本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + + +### 快速上手 + +本 BSP 为开发者提供MDK5 工程。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 +- 方式一:MDK + + 双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 J-Link 仿真器下载程序,在通过 J-Link 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +- 方式二:J-Flash下载 + + 通过ENV工具的scons指令或MDK编译出bin文件后,再使用J-Flash工具将bin文件下载至开发板即可,大致步骤如下: + +##### 1、建立J-Flash工程 + +![board](figures/JFlash_Leader_01.png) + +**注意**:步骤4选择芯片型号时,要根据自己的开发板所用的芯片型号进行选择。比如本开发板,则选择对应的 **APM32E103ZET6** 。 + +##### 2、连接开发板 + +![board](figures/JFlash_Leader_02.png) +##### 3、将bin文件拖至工程,起始地址设为0x8000000 +![board](figures/JFlash_Leader_03.png) +##### 4、点击下载 +![board](figures/JFlash_Leader_04.png) + +#### 运行结果 + +下载程序成功之后,系统会自动运行,LED 闪烁 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.1.0 build Aug 20 2021 + 2006 - 2021 Copyright by rt-thread team +msh > +``` +## 注意事项 + +- 可在极海官方网站进行所需资料下载,如pack安装包和MINI开发板原理图等(www.geehy.com); + +## 联系人信息 + +-[abbbcc ](https://gitee.com/abbbcc) + +-[stevetong459 ](https://github.com/stevetong459) + +-[luobeihai](https://github.com/luobeihai) \ No newline at end of file diff --git a/bsp/apm32/apm32e103ze-tinyboard/SConscript b/bsp/apm32/apm32e103ze-tinyboard/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/apm32/apm32e103ze-tinyboard/SConstruct b/bsp/apm32/apm32e103ze-tinyboard/SConstruct new file mode 100644 index 0000000000..97990e23f7 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/SConstruct @@ -0,0 +1,60 @@ +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, CFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $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) + +apm32_library = 'APM32E10x_Library' +rtconfig.BSP_LIBRARY_TYPE = apm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, apm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/apm32/apm32e103ze-tinyboard/applications/SConscript b/bsp/apm32/apm32e103ze-tinyboard/applications/SConscript new file mode 100644 index 0000000000..ca2395451a --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/apm32/apm32e103ze-tinyboard/applications/main.c b/bsp/apm32/apm32e103ze-tinyboard/applications/main.c new file mode 100644 index 0000000000..415c8e7598 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/applications/main.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-26 luobeihai first version + */ + +#include +#include +#include + +/* defined the LED1 pin: PD13 */ +#define LED1_PIN GET_PIN(D, 13) + +int main(void) +{ + uint32_t sysclock = 0; + /* set LED1 pin mode to output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + /* Print system clock */ + sysclock = RCM_ReadSYSCLKFreq(); + rt_kprintf("System Clock: %d\n", sysclock); + + while (1) + { + rt_pin_write(LED1_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED1_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/Kconfig b/bsp/apm32/apm32e103ze-tinyboard/board/Kconfig new file mode 100644 index 0000000000..a76b738cef --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/board/Kconfig @@ -0,0 +1,251 @@ +menu "Hardware Drivers Config" + +config SOC_APM32E103ZE + bool + select SOC_SERIES_APM32E1 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_USB_TO_USART + bool "Enable USB TO USART (uart1)" + select BSP_USING_UART + select BSP_USING_UART1 + default y + + config BSP_USING_SDCARD + bool "Enable SDCARD (sdio)" + select BSP_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + config BSP_USING_UART2 + bool "Enable UART2" + default n + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + config BSP_USING_ADC3 + bool "Enable ADC3" + default n + endif + + menuconfig BSP_USING_DAC + bool "Enable DAC" + default n + select RT_USING_DAC + if BSP_USING_DAC + config BSP_USING_DAC1 + bool "Enable DAC1" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + endif + + menuconfig BSP_USING_I2C + bool "Enable I2C BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C + config BSP_USING_I2C1 + bool "Enable I2C1 BUS" + if BSP_USING_I2C1 + comment "Notice: PB6 --> 22; PB7 --> 23" + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 0 63 + default 22 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 0 63 + default 23 + endif + config BSP_USING_I2C2 + bool "Enable I2C2 BUS" + if BSP_USING_I2C2 + comment "Notice: PA0 --> 0; PA1 --> 1" + config BSP_I2C2_SCL_PIN + int "i2c2 scl pin number" + range 0 63 + default 22 + config BSP_I2C2_SDA_PIN + int "I2C2 sda pin number" + range 0 63 + default 23 + endif + config BSP_USING_I2C3 + bool "Enable I2C3 BUS" + if BSP_USING_I2C3 + comment "Notice: PB0 --> 16; PB1 --> 17" + config BSP_I2C3_SCL_PIN + int "i2c3 scl pin number" + range 0 63 + default 8 + config BSP_I2C3_SDA_PIN + int "I2C3 sda pin number" + range 0 63 + default 41 + endif + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1" + default n + + config BSP_USING_SPI2 + bool "Enable SPI2" + default n + + config BSP_USING_SPI3 + bool "Enable SPI3" + default n + endif + + menuconfig BSP_USING_TMR + bool "Enable Timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TMR + config BSP_USING_TMR1 + bool "Enable TMR1" + default n + + config BSP_USING_TMR2 + bool "Enable TMR2" + default n + + config BSP_USING_TMR3 + bool "Enable TMR3" + default n + + config BSP_USING_TMR4 + bool "Enable TMR4" + default n + + config BSP_USING_TMR5 + bool "Enable TMR5" + default n + + config BSP_USING_TMR6 + bool "Enable TMR6" + default n + + config BSP_USING_TMR7 + bool "Enable TMR7" + default n + + config BSP_USING_TMR8 + bool "Enable TMR8" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable PWM" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM3 + bool "Enable timer3 output PWM" + default n + if BSP_USING_PWM3 + config BSP_USING_PWM3_CH1 + bool "Enable PWM3 channel1" + default n + + config BSP_USING_PWM3_CH2 + bool "Enable PWM3 channel2" + default n + + config BSP_USING_PWM3_CH3 + bool "Enable PWM3 channel3" + default n + + config BSP_USING_PWM3_CH4 + bool "Enable PWM3 channel4" + default n + endif + endif + + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + config BSP_USING_CAN2 + bool "Enable CAN2" + default n + endif + + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + +endmenu + +endmenu diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/SConscript b/bsp/apm32/apm32e103ze-tinyboard/board/SConscript new file mode 100644 index 0000000000..12efa4f337 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/board/SConscript @@ -0,0 +1,40 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +''') + +if GetDepend(['BSP_USING_SPI_FLASH']): + src += Glob('ports/spi_flash_init.c') + +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + +if GetDepend(['BSP_USING_SDRAM']): + src += Glob('ports/drv_sdram.c') + +path = [cwd] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.PLATFORM in ['armcc', 'armclang']: + src += [startup_path_prefix + '/APM32E10x_Library/Device/Geehy/APM32E10x/Source/arm/startup_apm32e10x_hd.s'] + +if rtconfig.PLATFORM in ['iccarm']: + src += [startup_path_prefix + '/APM32E10x_Library/Device/Geehy/APM32E10x/Source/iar/startup_apm32e10x_hd.s'] + +if rtconfig.PLATFORM in ['gcc']: + src += [startup_path_prefix + '/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/startup_apm32e10x_hd.S'] + +# You can select chips from the list above +CPPDEFINES = ['APM32E10X_HD'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +Return('group') diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/board.c b/bsp/apm32/apm32e103ze-tinyboard/board/board.c new file mode 100644 index 0000000000..e48145c578 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/board/board.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-26 luobeihai first version + */ + +#include "board.h" + +void apm32_usart_init(void) +{ + GPIO_Config_T GPIO_ConfigStruct; + +#ifdef BSP_USING_UART1 + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_USART1); + + GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP; + GPIO_ConfigStruct.pin = GPIO_PIN_9; + GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); + + GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU; + GPIO_ConfigStruct.pin = GPIO_PIN_10; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); +#endif + +#ifdef BSP_USING_UART2 + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2); + + GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP; + GPIO_ConfigStruct.pin = GPIO_PIN_2; + GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); + + GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU; + GPIO_ConfigStruct.pin = GPIO_PIN_3; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); +#endif +} + +/** + * apm32 timer gpio init + * + */ +void apm32_msp_timer_init(void *Instance) +{ +#ifdef BSP_USING_PWM3 + GPIO_Config_T gpio_config; + TMR_T *tmr_x = (TMR_T *)Instance; + + if (tmr_x == TMR3) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOC | RCM_APB2_PERIPH_AFIO); + + GPIO_ConfigPinRemap(GPIO_FULL_REMAP_TMR3); + + /* TMR3 channel 1 gpio config */ + gpio_config.pin = GPIO_PIN_6; + gpio_config.mode = GPIO_MODE_AF_PP; + gpio_config.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 2 gpio config */ + gpio_config.pin = GPIO_PIN_7; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 3 gpio config */ + gpio_config.pin = GPIO_PIN_8; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 4 gpio config */ + gpio_config.pin = GPIO_PIN_9; + GPIO_Config(GPIOC, &gpio_config); + } +#endif +} + +/** + * apm32 spi gpio init + * + */ +void apm32_msp_spi_init(void *Instance) +{ +#ifdef BSP_USING_SPI + GPIO_Config_T gpioConfig; + SPI_T *spi_x = (SPI_T *)Instance; + + if(spi_x == SPI3) + { + /* Enable related Clock */ + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_SPI3); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB | RCM_APB2_PERIPH_AFIO); + + GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE); + + /* Configure FLASH_SPI pins: SCK */ + gpioConfig.pin = GPIO_PIN_3; + gpioConfig.mode = GPIO_MODE_AF_PP; + gpioConfig.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &gpioConfig); + + /* Configure FLASH_SPI pins: MOSI */ + gpioConfig.pin = GPIO_PIN_5; + GPIO_Config(GPIOB, &gpioConfig); + + /* Configure FLASH_SPI pins: MISO */ + gpioConfig.pin = GPIO_PIN_4; + gpioConfig.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &gpioConfig); + } +#endif +} + +/** + * apm32 sdio gpio init + * + */ +void apm32_msp_sdio_init(void *Instance) +{ +#ifdef BSP_USING_SDIO + GPIO_Config_T GPIO_InitStructure; + + /* Enable the GPIO Clock */ + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOC | RCM_APB2_PERIPH_GPIOD); + + /* Enable the SDIO Clock */ + RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_SDIO); + + /* Configure the GPIO pin */ + GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOC, &GPIO_InitStructure); + + GPIO_InitStructure.pin = GPIO_PIN_2; + GPIO_Config(GPIOD, &GPIO_InitStructure); +#endif +} + +void apm32_msp_can_init(void *Instance) +{ +#if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) + GPIO_Config_T GPIO_InitStructure; + CAN_T *CANx = (CAN_T *)Instance; + + if (CAN1 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + GPIO_ConfigPinRemap(GPIO_REMAP1_CAN1); + + /* CAN1 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_9; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + /* CAN1 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_8; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &GPIO_InitStructure); + } + else if (CAN2 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + /* CAN2 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_13; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + /* CAN2 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_12; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &GPIO_InitStructure); + } +#endif +} diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/board.h b/bsp/apm32/apm32e103ze-tinyboard/board/board.h new file mode 100644 index 0000000000..2274bb453b --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/board/board.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-26 luobeihai first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include + +#include "apm32e10x_gpio.h" +#include "apm32e10x_rcm.h" +#include "apm32e10x_misc.h" +#include "apm32e10x_rcm.h" +#include "apm32e10x_eint.h" +#include "apm32e10x_usart.h" +#include "apm32e10x_dma.h" + +#if defined(RT_USING_ADC) + #include "apm32e10x_adc.h" +#endif +#if defined(RT_USING_DAC) + #include "apm32e10x_dac.h" +#endif +#if defined(RT_USING_RTC) + #include "apm32e10x_rtc.h" + #include "apm32e10x_pmu.h" +#endif +#if defined(RT_USING_SPI) + #include "apm32e10x_spi.h" +#endif +#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) + #include "apm32e10x_tmr.h" +#endif +#if defined(RT_USING_WDT) + #include "apm32e10x_iwdt.h" + #include "apm32e10x_wwdt.h" +#endif +#if defined(BSP_USING_SDCARD) + #include "apm32e10x_sdio.h" +#endif +#if defined(BSP_USING_ON_CHIP_FLASH) + #include "apm32e10x_fmc.h" +#endif +#if defined(RT_USING_CAN) + #include "apm32e10x_can.h" +#endif +#if defined(BSP_USING_SDRAM) + #include "apm32e10x_dmc.h" +#endif + +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define APM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define APM32_FLASH_SIZE (512 * 1024) +#define APM32_FLASH_END_ADDRESS ((uint32_t)(APM32_FLASH_START_ADRESS + APM32_FLASH_SIZE)) + +/* Internal SRAM memory size[Kbytes] <6-128>, Default: 128 */ +#define APM32_SRAM_SIZE 128 +#define APM32_SRAM_END (0x20000000 + APM32_SRAM_SIZE * 1024) + +#if defined(__ARMCC_VERSION) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END APM32_SRAM_END + +void SystemClock_Config(void); + +void apm32_usart_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.icf b/bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.icf new file mode 100644 index 0000000000..8a71ffd87c --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/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__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-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}; diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.lds b/bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.lds new file mode 100644 index 0000000000..01fc272e96 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.lds @@ -0,0 +1,163 @@ +/* + * linker script for APM32E10x with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* 512K flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128K /* 128K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x400; + +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 = .; + _start_address_init_data = .; + } > 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 = . ; + _start_address_data = .; + + *(.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 = . ; + _end_address_data = .; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + _end_stack = .; + } >RAM + + __bss_start = .; + _start_address_bss = .; + .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_address_bss = .; + + _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/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.sct b/bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.sct new file mode 100644 index 0000000000..5f21bc4aa3 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/board/linker_scripts/link.sct @@ -0,0 +1,17 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data + .ANY (+RW +ZI) + } +} + + diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/ports/fal_cfg.h b/bsp/apm32/apm32e103ze-tinyboard/board/ports/fal_cfg.h new file mode 100644 index 0000000000..5aa5acced7 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/board/ports/fal_cfg.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ + +#include +#include + +extern const struct fal_flash_dev apm32_onchip_flash; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ +{ \ + &apm32_onchip_flash, \ +} +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG + +/* partition table */ +#define FAL_PART_TABLE \ +{ \ + {FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 496 * 1024, 0}, \ + {FAL_PART_MAGIC_WROD, "param", "onchip_flash", 496* 1024 , 16 * 1024, 0}, \ +} +#endif /* FAL_PART_HAS_TABLE_CFG */ +#endif /* _FAL_CFG_H_ */ diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/ports/sdcard_port.c b/bsp/apm32/apm32e103ze-tinyboard/board/ports/sdcard_port.c new file mode 100644 index 0000000000..4c81ecfb45 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/board/ports/sdcard_port.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-27 luobeihai first version + */ + +#include + +#ifdef BSP_USING_SDCARD + +#include +#include +#include +#include +#include +#include +#include + +#define DBG_TAG "app.card" +#define DBG_LVL DBG_INFO +#include + +void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + if(rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/'"); + break; + } + else + { + LOG_W("sd card mount to '/' failed!"); + } + } + } +} + +int apm32_sdcard_mount(void) +{ + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 2048, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } + return RT_EOK; +} +INIT_APP_EXPORT(apm32_sdcard_mount); + +#endif /* BSP_USING_SDCARD */ + diff --git a/bsp/apm32/apm32e103ze-tinyboard/figures/APM32E103ZE-Tiny.png b/bsp/apm32/apm32e103ze-tinyboard/figures/APM32E103ZE-Tiny.png new file mode 100644 index 0000000000000000000000000000000000000000..6f335dad5d801e0e8c6d5009883c3bdd5d7d86d2 GIT binary patch literal 676510 zcmV)-K!?AHP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGxhX4Q_hXIe}@nrx2|D{PpK~#8N?7e54 zAIEX$U7K@`SnMu#0W5M3B*2_AB}P$!N~cI$lBILf**@FyIi2o&zB}7G1uL5r6)EN% z0fIyza*m7L#pawdp5M26W&uS?e%{>YdC>ozotX~R)z#G%dU|>i&MMf2a3Nd>7s7>b zAzTRm*M-FBd?8#27s7>bAzTO-!vAIAf|9-vE`$r=Lbwnvg#Sy!1tonUTnHD!g>WHU z2>+Lc3rhMzxDYOc3*kbz5dJR>7Z#3P2p7VIa3TDEJRs)Jo}G@a&8DWNEFnP(KtGSu zFTOjgggAC;YT6PLb)S&vJ?H}1=jY)*0pI~-6hBi!Axeng_*HxnohVPa#Ka4J zFFs~df`B^CfMZEqzw=CTW5QlwRd!S-t@FIOHD~uy4kqW z)6+66Ej1P0>6&t4a>6DiCM`8J&61N6ZFFqZlB6_a#hI9xu=P;hE;($1=W zjDV!1UDrvLn3P}>IWb}B85x$Io^DxLIetzM?6cF;*4B2~M#rbE zsIbJ-g3>;B{QoKZ#!C8EWed@98rE8{f;=w#`Mujr+z_JVpCNV>cYcVY&My{%7{k<= zKVKjU#H%Z#yK{jyc%45}7Z*`pN1lscQ}$Pckj@qVei7pk&QJT*;TP))IR1JZBG{zU zj`KoXhVt@tA65{Lgaf$mkM8)xOnREHh1>#~jz|_Bl03*b~Gf}P> zZ~q_S;{P*cl>hv^0TJQuX~Yv1mGLYdp?JKD5Fe65<_OBK4US^~94d(8bVksePoMuc zfjV3;Ms-Ap`t7+YNc-9PW@zzC0%_;)J6AStIn<2X=akjo`DK0`>|Yjs87*QMzd4;dV0dfrCfWuJFKg-(VlwZacgbuwd$I= zHfPQpD=sRqlt{s%RFjjr4lq#c$;qjbv`K)w^L(tt^8g7H8-XJsg)S$0m2WoBksMpl;G{At^}Z?pCGjM(C(Yi)Mr z94ja+4!Gf62jZ!G+~?fK#ES1h<6NB6N%!YdQdmZJ^i_Z*Yz042IICZy;xW8m48)&T zhXPs8ReP=vf${I175I&mG+6>s5$r#UFdabJ)MV&XpZ4H~l@$?TS{+6ufw-YOmlI+l zhbI^lvZ`PbZavC#if}qp4x+(0C}&Sq8S0?!L@@w?mPFv98}0=|j1Ux!@DvQ{Aw6z7 z3>1o->mX0lK^>vZ$}c#y7knUipvze?Pl}hNodoi8?Zsw{3E*+!ABcq$anwm3FX!pP zi4Kk602>@Bz|YH(Ujjh2+O%j74an;QLS;iaU{Z{M!&&zfrjDqtFipil9?^&CEm_T! zcWYSbVPJ&zf(P`ORGkFMI&NMUFar�=&Il{FDYf$6aYj$x)vnV1T28I=P^{<0L%J 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
+0_JSFg&-id`1+?AX7ltwH6B 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

_LU`{IiWZH1-g-V!$}1V`}`wNuC>Lhe|D|+^|uj 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

Pn+xS*B2I*2!;>H-)+lQtdbI5 zXt&;SyYH2MTF%`UzVLf?+if@7nl)=}^%Ymx^0jNE5N6wJZ@gh^uDel65M-#=7wHvSic~Cl?GAW4}kShODXtHFEZaW9q}~`pC|N zz%W|}@7&qQbO*E|*D>|VIajhJhfnBfGhnH3)H(Q@$5^R08_?S+Bg2~|60Z9YU!39YdPDj5p|7~l@{40c1CMsao9QG z5hB6}23LhX&^jwvp9vKGq&kcaoC>~8o(2)Ddx-5tv%U`)7dk_`>rVzl8r=@4o+P4+ zd3`N+6wmdA3)})mFXt9l*&TPk&)$CX2@PiUSxHf)oXJ9wHo|62n1Z&zQt&W;{GqS3)fDXdZv8bU*Wd3ZyGY8Zri^2G6W?YcGgq5Iyi>sl#Y zMxDHOHp(~W2>QuS14+1KOfcen>+^Sh{a5YwYu4JO3oV@In&UbTlG`jP$nx4$FBwcA>|+U>?W?-2e0H_D?&mq?%o<>~IVIv>@S z`rfy6PNsZszx77@;5~QQl7)*kN}q3&WGKhW7)p{|I54I>UxtbB68chGz~3aK2n(Zs z?&;JROd6ODOq_dv;zzVeEG+7iLGR?_^|YG=5F7(c|51RBQKRzh&Rg!VeC2Hr{Rs4x z*Iet*g^nC+us7e@;-79~haVpSQ+C!VnR@gN%e8)_Wj7vF6F+mCj-j9%XiT_1%+e453)Xw*G*!k{GJ9Xlaed8xT3nuTHDXsBR_w{R$eJ1 zw`i_)_q54wvVU>6U8T<4(R{-8?cHVv_HUPhK5iFtx@^tbMV33V*Up_f;G6chwx06G zG5hxIuz9nm2yUOf{_5kl{*C8lEVo*o_}kmvCP$&d?!NO@-7AEt4BmBuB4{6-X(yDR8&q@`v7RgyiF1%CZVUj5+YJu) zN=H!>2OKayE1-kG<2A>jct%9@&v-`{l7r?DH-@S zBh^=r96q4FJkq93o9+gr;Z%e3C+gC1sGc;Zf0re8n}l$S|+kG3<-2koan z{js%mv`XKXSbkBdjmj(bg@|)z&#*(1^%tLc(pt{6+O!$7q@Qvf2SFuzxkL3<@G_!s z=R0l7V?btn(XDG%uacAb3A^v^JFEiZ&!bImqj>y+{$xg$M^VTqgQV%=^8+9Gpnd2A zcUox?10$Rk>M35R?O6jt+lJ}*RNe`GbT@v!P#hUz4@lf)<}VJ^@DeqM;9UmNafm% zo^F7nKB|SFqCKI@VcPC9V)ewyMr&<3FT4Z3 zu&A;5r0v?d$u_?9rtR6c-=C2(d)0KN$+y7e>t2sP`iP9lQUClSvsCa2{)RD((HVS6 z?co4J{Ngqq>7=Piz#Jrj>+tI=F4DO0WS2#650!@u(srKCUzX8Zk$hez7i8u-nRG3}0Z@ZHLshV>FUx zMA@&=YJcAaUwkznJ;mM*PNnj@gR8t@V8h`+H$fj|Q&*;uF@(@azC^w2TLow$#?u5( zJi2+#yrnj0=0y9ezxCend%X1}j($W1RtlqqqF{eln%0q^>wy#=^{C}mwYO|r}u)}8R+Qm?-59@efYy4^x0nqV`XK9 z{>tLCDULJ==r8jY^vGhe%WwqUK!?jjfIYtn_IK0P5_sK)~>c4$O*y7a^VWLHxN&NbxjJBy_ ze5r}gvjGG1_&~<-V~1_$&K+)ycfPyRI@{Ur`lL_ouZl`?M;+au&gl-4^MdA$0(ZB>0c+B2DHiSpc$Q3Xni#>&qx^jEm>_I#QiZ(UTSQ6jbXsVdc(j)t;eo4=Csa^YQN zXIsuHKF6j{uD3_zP@s4a^0E>>3wOqzdg^iO=^OOd#+X(+uzS1h*71Uj#)~h!C?|+T zYN2dGQF$XpClOw5UGViAR&qN0#J`vY@Mg-|ir7fwq%##!Y(S$ZG9gAOP$wO*|#(pFU$#=C1OsWE)N% zwZhU$tDP`ia@T9EZQXY72R~-l-*mk_{q&QnQ=Uy2KTBnvweNlVTXx-bH(HTKtuH+P zvJ~}2$!U#EoH)l$G&G7&h4%h?KV)^|>tvXBT5(ai6lk4fPGvSW*_g4@?f&~eC>nT8 zu-m3gn{T~RTnF|avuRToDDQo?ckgb0RTHHSKR7~;vpx#n)V2g~V*!N1#o1@d7(NFt z;W5|rWlsZ#62dt{!Df6H6b_yn8_%zM(&_7tEAkOMUC~3b#EoFw0aYG%#+1)x#^a)Y zag8yCW{bVc77sS)6LA2}a8#P_EU`r8|f z;yXJ#?Bt2#8i}5EedT@Jctj`6Lc^WcSLeK$map-m7{Gc#?UT7AgpG6Jfp+7=YRdwkhFDKus$ClZ% zPd}})l^~w*>DwLK-WBx&lKV??4!296u9t&&(q{_>`nzr4uAT85U0G;b-h4n0^1krd zmX>G_W-)}%XF#BgIB#?Fk@~GSUn@E6x7OAp_QDHqs65G}>Wus#Zy=|wTy}&9!@h3q z6;@MKVdph4e0Td!JFmeMi~3l|#Tz>9EvK!qslg^qn`o`=&GzaW&)J4|HruQjGwsFa ze{TEb=`R`7N;?NWJ%!)7lgUUkjjF6!y5lp|o zOBroJ_0=w-2cA0LvNJydZ5-_z$lNQ`;c@yoq~j7YW%29Ccv;{E$nb{a8MdTE^+Q=X z9z_wG3IM!e-XS;00 zk{R~k55H;O`@zHZ+rRslcKvnB{Sncz!)>;3*))6fv7cF~JoKBcU1ueQdG__MJ!E&? zd5b;&(xdjEM(DrwyT5NYT(j01PBh5LYqYDbSYofQf5v|AcmBv$uDa8{@VmcbFFgHy zAI)ER`}^&;f8*EeD}VcUwtmyQ_V<7LFLF++?byi%YdY0t3+7L@@Bi>S_V7cG+L~+c zv_JU$FZk5m8*gs1sS~DIUO}II`EUNlX3Se_4}9W-HsV5$9Xoc)>t9hk!r#^IXglZf z~dV<}yGl>EwMU?wrR&dLGFQ{0}`6%6HgN5)Q?I-<7T3XF{w@A(x;E z;|mV*4AT?+HU2qdMh8YXX4#Ni;*y-XoB#oC@Oi!nL2uyaa5>O@=tbZIS7cF{k}XB+ z04ERIVk$kWo*=S*1MN;%I5eb0zlaHQXkhj(*NwDzCA!P2s_n*`Z?R5hW?pzsBg1+t zEiJY)XPV_~U$71tKI%weyt|7IWqKHb;1jgu7Zk|IRnR!T<5=p~?!@>xYZE_58xS|d zQvHK&(pYrG7pcy*wn~?KF#)Um=&4K6>#>s;kL$=I{)@grIS1%B)!b2Dl0j!@z1ef- z+m_86ogd7g`rtrxF<=|wpDuWIy-ow4ynkbokiW!EqMJeB9r=I93HV~qC-fY0O@STgC5xJIMI7;;yvR^61zG5aUL9{4mz!B5P0I1?#@3(Yp*33^^7*4>$TM@v@pqE2$_}$*?#U!ciB#X&tx6PV&{oVBeh zPQ|&g=N>pkxFQsckA6HZ+6fr4xDgkhQy@LvAva9%<7h$O{P}bJnu6%K(bg!sOkg~O zq6`HTWq5LS9cTXepF;2<6gZwZmGD1LBd=cz7@lzB`N$s#hRy_6V4{_k*F_bh?bX*` z_eUV-&YiJG9(mkK%gX)nM~TvIzGjvE^pOYc!o^;ztTOwDfB2I9?2+$VWo50E6pyt3 z_qG3P=Q`VM$+CL;#y9@aHg4Ktvu91QuYKp=Y_~>7AGrT!jgo(0PyOu2mXlv(QzuQe zAO7$scKl?c)z^=t};^Z>>hkyJld-ka(T_z@vua%`(vfzq>MX2U*PVM;0(g*C;fulN0AWmMkU(Pw@6} z-iLuA1I7Tjz~exk#^Fkw_9K^M!tv;jc5ryVv%@3en!2$Snx)0GCV)HI3jSL>c~N0(+ucRjLSc> zX`DUX^G87E$%3G9gLi`Gv$^O>c1gtGa?k7}enjWxBu`-+qikBw05qItD9_-rc72E?S_nD%Pv@7SCC$dFC_UEIqx$kl1N{UOMXTG3OVZC^cDYj-$T~cvJn?9tKXmzj z6;h8&}7250t z3$3WQ%s2mVfmC|Dx5h^|Vh?X#zV8-ex;VP~G}7*q_tY=N!zLf>rX#paNL83@yo{GH zu@M9-uX~iISLe~AM=MrzQxB&RdZWXH0MKa^seewY;{4e>_0XRSlTv8N+z~R?awayc zf8Du z>PKe{-h$8N4LM8s6c4?O0NBsmM?0P#08Srg;)k+1p+QCl>LUZEEogK)l}LH1uF-+W z6ako_Ix0W3cC@$Ij2W}+8jVD6z4gPkcJ&%-Z*B4w^XR?&ypdL%S85{$N7~*!hpoRS z&x(p_{h1nzWkzYV&E^NkPn@um$4|?N7=URJ8kdYMmeC8Wwq(4h9fqnqTKGf`y+PGy${&OKJp2F1L4%ElNv3Q*$6p! zIl0B6&Ft{eV^YqnZXK;U=UAEK=Ax8mdm9Vd25r;kT~<^&)`|*BL{Fg==N4L7L9xI7 zc;aNUm6uhC$H7PV$-*hl!6P}F#3=+{;Ve#7D0g@8lOE77^oL-S$>DXN)F=Qnqz8P~ zPM)4%iO$YhnaBXY>_*9%;f)yGQyA)jOx)`X0g8-kVl(}wKjJ)IVdz?i<8(PwKGlhk zXrh(vd(&RC3V8K!G@Z3=;eZK94Mr(_U6;B_*Xk5TV@U zI5C}EURL3o>6Da|`E%9clK5axspO%wyxd2Ev^Rz<${W@VUO(rH0+kRz+{Z|qwj`b; zXp05L4y_RIVZcL2c~D(2HI7Bs)CKv=(V)sxL+7> z8_}yXZ|QVPzw@3m3yfL!!@(>9_2XGH>y3D=6~peY!6JJa)D@MDvk!ml)4o-1P7ZRQ zV$?5b-;e|9&Q6o84T3;LxvI{1MUA}j$N_TBKm-18Pnu5ri>wYRbZ%c$Kz71m{N>@Y zXVNkRs@T`R@iiYU_-HcgkiMuYfK(7Aa+j5SSxAjZTDpz~j7B984+CKSq^VPFu|}dL z8YS`yR&SR^cal_gG~#P9z+p7paH-*QB%I@?PP0jqr&@J&y^XD^vAPM9tg3E;O`JN# zrpO~I6|SnPS{pl7imz<6O`bBc6nGuRg-M;^!YY@%0gSQ`bwKQe};HhAbQ5D zo(pXD`~^01)?AxAYo;AJxX+a+9OgKk~|JCj+ zu}~%Bmcs}Ay4N50xh5V6N?@9F&YZc{+|=ZqhR|}h)diIfivA)G@M#p!sd8+UJ6Ub5 zZ5dwAs&pkf?O8cWNL|2b$*w)#k^3Jp!?Y4~o$iP5fEW0LL;>%g#agA6mA2}NH5xUq zv-9Up*bjd2O>1g8YwQPn)6KWol!^70SCsGjsUs)7QVu(J?68|}zR4F;mP=`ls~%^I zm#(l$lP3AM#1}1G;Cl+F0d38iHLBW0J96Zh-EjT2HgE1M8#AWdYLw^N>uyxuN_+nK zXEj>sw_;Y&7Us$D57_(fyun_1?Qwhgl~*mdbhKS};|;b>!RS}n5qT0qM$>Kxv*7t002(3= zP~yA{zxGszB@D@;WZwIP(t`&2N5Fc!J5&Vnc%nj*X~(BO?+;lT{h7WO&UDbg+55PD zj#dGY4cbFeJw2l@&dQ^cN{akCJXP`w{uwi7+LQ_7edCi+>hmhd2Qv(!_#jU~eu4K} z99kBYVa$0v#(T)j^cAYDA*HOW+M~Jw<;Kn~%QX)|n8{wQmcV@N#`kHF=ysuw(nHlm#D-t`i!2tLOs zJb2G5v1z+wcu-L}&T1x1wh0qv+HJR7Z|B+??CrN+mp)>uTKx2CWcbB%%82TCh5S0| zA)J0ztmpB6o`wVGvyBc9oal2_Zx#nu=)2a;Te-7_?Ce4mi3l`3^e0lG_ zZ@0=I8v=}X;7rb7`B8Y5-I;-);5jEoab(FJ0yYR?+503J+`I1kfQ(GJ19r5v*~t?p z?R;;yb#`g=JE+PG$}{TfwC2XsRyt<1-G297Cf~~ViWMVmj2oLjG4jl3gjp;HWAKvY zjm)#E(dAZIS#AYmD*V%Fl{}}GVfd9#eo7;llX3=V5P4@J3tC}h5;SN$}I(1S)iLV4`qT}N%VWizvoU{sOoDsEa#cYF~#}Ds7#NbO!B$2psp69W=)mk$egVWcs5m!0ppF z5#?-4-@&FlykzR&?{nh(DK6+iW>k)H;WMN%$xj`?O}RJ)u7Gs|40$QX+XXyX2+9MG z!;q#(=oo@i8ufO?t2#pqcziXj(+!Lcoyo(L+XbE3kb`%dCrzGY^^;3&%R6sd%b8wd z6QKNpLYq8wqTm^&T-2zgR9^p}wX`%@$Jq`WKV_n^@eWQXP6K7Px1SSF3N;GiGoyo+ zqv{nEme|RYtm-~z(`U}If@0O*7>Vaud1<*FJ9@~rzq?hAS&5a69uo^sSbUQ=XeS%^ zn8$#Xmsi`|1q(GA9$~E=osOTj*uHI#ooQ;d+PYesF@1t>^n;VsGtjG1biQrhy3J~8 zCtB6ma-me4s$U?}1AU#gW&KvQ0sSshJOuco)6nW*=Q-_$E)Z{>pCLN~%y{XZgSPdx zEOcN6>Ze$5Z*kw_7%YGtxr~ttx5ylA#q&}WtIF2d8%@Fas`m8$3?Yh62A*3a#^WIx z8Zz35N1l;CV3R>6oj_f{iQ-QAF&d;(FK~EJJg~%Hj>AW3B}r@v4ZhXxgrU;0#A zYpXlUq!0Id1zm>I46f*Jgk+THn_LFIpr16y;}A^O0|RXlLvUR5a(F_E7f#w78ofQfwwZczO-2+A2@yLYX(zx(o+#Xs6CWCq#@v?=--w$he9pi!V) zR)WKCL{v5R@|ivH>N4};+6=jko$sJDhZzR_E{#IcN7$U1bL}tx;!iYinWem5gZ~uX zW2BkJTex_E6&8;+*+3B$jpB+C6oIqI_T3wSyhl2nbQ_Ux#@z(%~ z3av<FpoHhb)Sqh@&O?5ffaio)X&TK4 z+(xO4oKg8|@K)QgZJP{q{*VBMF~B2ZzvNI31j*?u~*EGh~zwwH_`PyqLAA<&uWq74{ znK~AF7eqods_G*_Vj-A!KHX#F=uGec9ug1#&v$kB2#06rbPgJU=TFMwyhAA@MdmF* z;kwFNB?Kg*9RH9a@(3UTCb&RfNW!cX@MqZr2UuyYcm_y51UzI(qN%)0Tan+(C9f;6 zEN_a>ZUIP&*Y5=gtmpSsU1teicj9y(^uptyfy1BKJ4En>wgor1Jg5EzrYwM09TTad zGnQA>+4Sjitfpq1Z^oeN*rkCB*3-?_tx}{?HlsE29K6)$+rkzIci)9xE0iPJ*AwkH zDwk>&j&KY#yuyCK z1D(BZIdT}`Z{U=am3m&D*S4HJ6Z#&WfeW0THw-kJKOwUW5c!rfPHeoF&yHk;8bz~4 z35!5KDYUWU##y!cZdvshD=RLs)-$JV@170z_N#ma3kRI9WM%TIHh>olDh8N6QiytS zrhSFk9m>QXlmYD;d?TKNPgIhGtg?57N6QoE6PYun&$7SzUw>+BP850ma~LwxgwD=( zjil$xYp?KUW>k&R-D}c;h^5gDl}KL4FwsB|KnbBiI29u;!60xDRHRI&#d$ zR94w{zwvE*-v{ndhwHT;fA708%<}wbaFxsR_)<1qfku_?SB5Z|HxJ@ool5sraj%=)+|)7j?>& z@7RfxR$E(bT|IreuTnW(lDj_t26V2BR)P8qinXS;J{BBGE(#@!IIMigfW=+;1;uv0 zr`y^)yZn2>>`IlJGidGSI%R;zXp}t0_U+kgqsvRJxw+LJA)Rb&@Tt+N$_gpRMmy8e z?vIRc3`fbBvq4aCNtr$L{qNY%9)8F-A_^YDF8}8twM*hP?ZLIjUy?IH9IIT_+sMlz zQ_fQ3`WHF}g_aB+hMWI!tt3ax6{pZGmzRHe@H~R`^mH$J!eFS6sb7#pTN8c}o`l28 z4KSUcML*(IKE{KZ0pmjm^<6h)!V7&qDpo+<`RH2rK3e8bJT>%tmt9>ea!>}0yrblF zVazW2y)L~>47d0;a+JT1%*y(AcW$@&bJs|h_1OBi->}J3r`yCSvur~B6e}&xvj>0p zZQn1OI=eimUHLE%ya?w&1PC|fqi=myl)jv`AMwmj-Tr#!TZ`9ELnmIh*O-YtY3Ozka~Ft0)b8N zL&S<%>G>*fFv68%w3~-ujDld4EMeA&P#$4nNx6g`ymYYeYJ7iV39EZmy7%_y%JV8S z45JJgf5+uz0GT-nZq#UG1Vt?KhKJn%f(KN@(FpnvO67CZn1YJR27ORuv^lNV7+S4;Q>YCvB?+$?ivJ> z?Ae!|^i{1RE?uxOs!M5ppS}6YGd6MRENeY`+O}-mC=q4Rl9Zp6-Z1YIUy0W_IOvVx zJjF^y#Ly}FpZCDP;rvDc13-QO?d@{ZF50}MizJ`#+QEJMyl%7$ zi=lAzGD7@JIjALKpf_Vr7P5Pf&v;MWJ)VRB_IhR+6ON&}``{~JvnoYi-DIrr)G)L$ zyMk_KaDr1yKxI*f0qMwe#&|M#BA@5cInCBUV>sZ$_QrMX1!kRMbv2I+fgs=@5WH;# zhit&>R98>Q>XT$5>gZ8^9!hs+f_a!n415_7y1rBl>xuXn&$#NbL;3z=2#T`6PBp$= z9CKvK0N$u*RF2?ibR8p{I49(3WE)KOC_l#$MKL<$9-JQUBrt6g0zQNfiP3@JuDD|YAI_gj8`kxgE-*zSAa({{^k_t@ysm5>toJui-g$`NKKTXA%ZfQd5) z4MlP?R?cw!DBq93;6Fkbe!q+q6CGP@!6*} z(%tQgjE)>W=pD)PL#Kkz5=cl`z0GqMzwT$>@k>@WeuA&W?CfY!C)+2FxL%4eR~>Pd zjU88KH998L*I5zI+C`dsy)#Kcw7C4>&xQ^ z;B`JKJ8ejNIxRqf5@6?PKwo}J#?ifN{h*gRc&yVE2)Iw>dK&n25pfxAB6N5b1vj|R z<(U+(Ytm9Wc|DL%KBPUHBUIjxaapA2rEEm^qG+8PhrhV?SWry8u`=n*@xZXP6vqtA52Q|v>wFQ$atm*Ip z>*(mUo{kGPPNV(XCSByBy@rnujMGiRNrC$@T zYjGFOiq)5?9q~PM3;cJo{E}(zfMvuT?FkN-51Is6#kq_LpDWXJE!pvrF*IgBmk*`$ zbJ*Q1l_&;2H`}hZo|pOnDQ01gbn34lk4bsF2F^88XM0m8n11 zTM8ldQAS)VSDb`13QGKSIvqBQ3ExIIaA1e0G5TY=d(xD-mR~f|HovppS42l0;W@O@ zA9R9|`U`pYqTn}X6@&LPI}dZZr#7uWQQxQ+l=vQMg%pWR6q82(oEFA75?!>p`KXD%Vp?G@FT z#s?Bvp6Gn4s6ZN5Jom}T$+rpP z#@gX`x7g;5uiDaOi*3P@#dhO0*ZSuqr%#`0bLP*_$_<>uxPm_LQx5f@Az?gm+(Va_ zm(?wGTo))+LQq1c|Bg7Ot`@ufE#qCQh;se(V7&Dygug zOIKJyewlx`pmtofO`1K!rq7wa?z+RSzy1p2L8x~UD5XBm>%i;nkkJ}#!@c-~;6*h(E||@=jH}A_Oa#S& zi~i_JF9mRN%E00-V5viDQ$GXaMDV9L{$GZQOX}_$n|QoBh%0<4{sia+=~^ep=~2`* z1l{YzeFhJ73V!Y7(`i`DMNB9-;*eqRkT+x@Iwq)D$qlq(tfaWex9;ng@hdJaw7GNV zSzTR?N$l<9v0Zkm>3~MGIW}6O&RKJ&S=aeXAhr4WTZlW z2t%FtM;kN6JAyU@Ms-3u{RhvbT5>L;6va5z7~aBjWp*5d7=hA0eycz_O^1{d&=0gZ zNxBj|bO4rQAx)L1exGD=Xr!bwrROjZP`tyqphJq}Lj99Hn7uBPr)$TrA2hK12N*tt z;qC-*;Kxww@S1V2cwqUEhTnrmq%wugf-vysP^RKW`YUZW-6i>jQ9swW2n zDP|WZPnoGvG>ZyLtb2fu5DAY)mic+CismbWWp?XLSKHa6dwksi?W2DgPf}S5D$e^F z^%MRqR=2@R^q%WhUAh5P8g1$jO6TW1^qAnE-zyLOILajJWa%F`x#k>r(|ufX20zy%c)Whl==uahp=+_HYr`v zQ(94FlV?u0jc>hX&prLT)oTPiZd|QzbGK~iGQnQ7AO7I`cKqN0n=PjzItlryKVQsp zZuuF0+o@CgqhQ zrx9;W-59GVF0dUN-jv)Nwd<~4XR~Hckm8Zr7JbM~SJzo<)5yGf>}abSKh8$WAYUBl zvfiF9J8|%!oo#Hi)vH#?NnB>NwN+xkD66apIQr7{S-O`3KbZ#)R_N4v1Es+!NuO6)svhHOo4}FXKGBqZQNN%KzInO22RTSyGsh8#X;((A*xuIvEiNo7iNAM*0z%??GY?QaRvICc96QIi@ z6@VuYhwgJdr>Ll3CO@zwgDH?h<V92rt@o`E;cv?!QAx7rrNLj45Su>`|dmL%6z50r6-L~0^ zOUKyz?!MQK9@=Mbzxk%)@eZfVPP3Pj%H~knjyU2Y%}WL%JL`W&N1Q`wqA9pjUSLVo zi4WzE9aC-7MO*FoT5D)JX%p%v%V{xt`Q;b=6`kobrmC!qwrlr3yY<#vY|A_ESo7)A z&NE6Kenb$ZAXMXP>s04e*4BL5_rPVt7TzVFHf5snZ;&v~w_9$y*5=NdU_bc5w{4%4 zCVPb=yo9K0@PcajN>qOE-_tmNLueup7oKexCUB7kJ-!gkg*2)TPvRb4W@r80D;IPq z1Rho)H4!K?+9}E;m6OAHn-Jq<`+rxQ#AW4pY*r3skP(`r!$jRYc>1vH#W9S>p@eQ2 zN5B$>U=u$7_W)l!PnCRAB}PlsK+&||&l&)E6%9ro-CJPU5KoxAt=hZDAM z-yu18#dhq}Nc;E+JAUN23~RT)r~J&bFWJHU$Ly6CUbdr0kJ_1*R^NlYr{{tlK6J$1 z-L^||zS9mIKH}>XNIP}B!QOi7ZQHPEyB#@p%1#_VsnOC1TR3-`I(oOYx16xH(}(SJ z!x4Mt=~wJz;~8s{L)Ut?)n0w=Ra^hg+qQKp--18p-%w|DI@?Gd7j1j??zU&1ddha} z*k$|o?Xfe>&Hl({>y|C{`m3+WFdtH1J8tVY${`W`&XG!IU|6l=da!#j)~D};7UCAb^;IR6yXX^_;b|ODGwq;8U9CGrXT>nPk;);QWyc5 zVM2@1F2r(Anb3<_=Z_r8IrX#0>rj7%u1k^|V7wNJPX8T(A{N$aK-1LNU?U51tg5!!j>u_l z6MshV)(@}uxD-(ieH~s>ujuzqt?0mDqH_iY7_df}=rLa~tdQE2fX*O|IG1?^=YuZ& zUTx%(l-^MA`T@f~wS|r`6=Uqi8?N(xCo;7EDFlUC0EH6~w;mEf&Kxg;N(N&wER4Ju z83V;;?xcCg5du7Wf*xcH3Wu0al=a2Yo+uoQ6bUewEA_5i?bj4`4p_Ky=j%-1rB`KHD1!| zFTZS$J^F;b@yaW7HyYz4yT=X(zCV;o&{gxzXEuiApdh1XJrNuaq%zlEIm8&d?Y%M{#2eD zL5HKBTt|EWaT0C1C(Y}S!EhgPpfozNgL;DViAxWPX!qTSSr!fa7yH z)ggR=KLEG}&aWJ8JcfX$7iFkN4Dx}A9xISD#>)de{e$-E8waeZrCUb0&-&D%ufOp& zTe5hWEnT$Ky3g~4BKG#ZV53KmwTTm_S^1c;Hf`EW+k4=Ubu&tDYqy5eXKe2Lg&IZI z`zAe%t5`78*WG6&B^5Sh`g|K#i?dp2&CO?>o?|B)?d{E*t-rU^axV5*Zce{hf0vA5 zpY;fDS4W@CnYUO*AlC|tDy;2Xhw&iaTi~+8EV ze#YTXfG$7yr*y=?(>zkfBU|0;MN=j+#*K^=R1t>abPBnNbF{9Kz^hB9ntkR5TAUsd zMVr!nYFcN{-)r!XR)?FiucF$H5;sVSp#< z;177FCy1eq6zQ~ar85SNRnRmE1~7D5Mw{|tS7MfHl;!2JSxdfEjw!W{wllVO_YU9e zXz#mwtSrCWXB5cev!5=H=z~OKoSZ%mo;N7K8;)Te1HDOV2=I*~;L>cXA{-xlih9R= zVU6v*taEM-KeMuiBFxHkwQFGSagcopbGDy_DzE~ZNq zNoR4RH$4|Hyo$4=Oe-sGx!V!Z;NLRx8HV)Enl|O zX3kk`tFK&Z_4V}{g>>1u-KcaaJK;XAj(PG#qv%v4BG_4eaC$wRRQ>Zm{i8^)1LY3a-MxP9 zGuTwOVfgG?|6Dc{lF>~3910mYxWJPH)`QO8(J#vrxB4f%oQG)AFFIr#o(8<<30WeL z)u$kJ;T`cZ_@SWabo<^iE(;j|Cohxh?A{#;SN`;YXtO-t+oX5#o{Z&K`RHl3?z;P} zu(-mX=h7amE@eu%thiJLE2h1Y!tovACQq@ligM$tZE1CBeqoVMzq6BExnTS=f+~Vi z@}<-#PMRWPU2bJ%6?VR}OR=WW#6%k_gPuPsUoym6k3t(&z^-MZ948y8loXfS^y#zx z)hkxC((UQ8%*x^%Tu_3BZVZ71lld~f{%ZS%k&8u zJ&xl2Cg79NgAOtR!u!ctio>dhdK$EQZ7+lO`jZJ*;p0BdL=m6PgFJuf zO1tB(`(%u(WuR+q(b8o$ci{p#L-kftUS`+ae3RXJ$DMN67G$(%#s#7%9o$}OR=mn} z73}n=n#_DfvY#EEhT|SRkrEX=yVI^n{h`Z4=7+&tZk@m3oKYw^(M{eb^n(r#a=9Eh z0^%tcUZwPihi2yw_x$(ki1&2I8Rd98dj6=lo#t61YhDhA_Gg%8tDXYA7GUieZ=EIPvM^q_~tf} zTfvb(Jyu|rGHuTC%Yrx(!RZi2rq;ZnvP^UYScCAn;&i1Riai-&-FRi2WJFR?^Y*B2~GmEBw-;EMsXhiE^Mw8{5I%DFcjbg=_FBqXRdG)@IdD*m}7i` zZqt^{cFUbN`xNL8zyA%pD1|m_=49Kv=^a}zbDAxlGu^)T-EYYAeb-laQo8fjjdld* zuOF`ej`0U*T8vQynZxzc!N|cc+WvyQweeQPN?`aQuXvq&^(aeFG7es zU1^l#XWgT`f<-7)^1`b~CqKAToU__N;XhMmitsWs9(cUYN$&hFqf7AI6Oav@89_ya zhnNx%1rng1P1k9m2-gu(S-NuKV>ZOGkx79&r%%CY@{2GU9+YncGe$aeqjr$f)YmD8 zX|If3pN$+P`ea;p@7ZfR_wThHVH{9?+ReWPWCM2k%xNoSH@vDU?{B2>+0p7C{@@3bRF58J9$t9{>mBo&&N z5~R&Bpl*$!QE5Jnn;BFLEA@ikUIzyf?>Q^*F&yWwhTIqB@VMv*C(S}rFs1FPp7zq= zQ`|grg$9*768wtu$7ymXSg7U;xYQodmu8i`3~&fBG7{88aD|-79B}$mh-*gf?r``K zIH-@qa1W>g6s1vq-~mI>O&Ab;?A~~3R4!y{l)K#@A>@y(v^fhG%Q+gaHteyj8#mjY zy?d;D>^M1OrPkfsYgJ>%I$tkpxX&UZeiRHnJ_C@^O$fsUwBM+1^v|Hv`??cKk_XM~_RM()@J zWI$P=MYMVybg;qEC8nf-Rbx6GPQL#GBxFT=NxF`_45++Lx)z4W=ks5F=Xoy=E`OK7 zqr>UP=r2e5OF~xTAm`E`+s7e@86zQ@!uZPyfRZSP%Me@uAfU%TEylfA=}ZrT0yZ6~ z;nm5UDd3}{vS^AGpYIL8vuVVD6kifjcF$>TKI^-OoohWOA(wJ=y0b?2vgtnD!^o(M z*GD(NUCv|zjN+1e&Mx4dmd>HP!$~1p#!`v~Z}&vwDQj+Swj&1*+7plc)Xtu1vk|Hb zG#os1z}h<6?763(vg5~2N|93tq6S_X9DISFKvC3_GEk-j>O@E#0j2HUGBmo-guv10 z2~X6OTUrp>;Rj`UA_;EP!&q?#uIPxM0L1xC3NT2w0x|G_=iKB8THz&-#OUm0M1F@) z|FR>|8+1k6r*CD1=@Olp&)F5o5EfWZf4@62ryGw6h|LjltgN)uN=r&?{_HuvP>LOq z*h882~|?!v&sx2`cb~^C7yW zuaFNf!|5VQvczB|qtW42XIcoJL%Y)q4*IZSh-Vw+q35PRW&JSn_+`{x7qoNe$^m&C8Y8QE?=I7Ji7K<{jxgK*3GAn+P{C}>ymA9 z2pBYi8@$+KPd@Rm9X)i!%i>V9!-OtXopp`@1oTH;y>w`UzgY;y5nW zK0@#u+S56U7KY$U)Q0az+2LvNvZc0q8(%-(_j;Z+W0o3cq=c&}gi}}$KtblC27+45yJWy%aIE*)*7^2(GvN`|<|_VGxje}vUcsI{)nHam6lgq*h~U!c|1 z)#Hfsa&wf{ZUr*jJ9q7{!u)(|YHsy?hNn#!Z|tAHXZKFQcgpZLT5DUU=o)DY=g)DP z*=_Dz+gZurMQb|U;#(cgo;BBI&R*;v4#+DRV{PY0*yimAjG5~>^XJ;>h6atAd#$CV zSx2jnJo54iZCp*YO_Xe6kWV!=*kFI3HJ?4JX2^|r8Fo4PD*vK&$k9C4+9`e%!eBI^ zs1ZLiCrHfo*N!ld5#T4>3I?bRRQsbLQFk&Q2>TD6)fx58C9Z zlWp(5JuctKF6F1~NFBYGjZTQN+<>br2FAWHPXSuV?=x>6gJVpeNQNuw;P`cpzCuaC zk2r%zImrj!RMqUiR~@?iI@%YyNCRKc7;o~V%-s73SBKjYl^FqeFlTUCe*GgU;<(_? z%kox>ayW|z#P#;{$}!TwjtBZm34Kew!N*mG!{>+MrzG`rIntts07jQ5mG7fq;R?f+Ii(X^JDw^To86Ga6(Ls{?{FqC!b}6#sPyV}>$SELPEF71bH$ z1Z}|J)e`SHbcCQ07xw`d<$*h$13xgFB7dYOC&XbLrOrc*r=Sev?eFjPy_V0OX|mI& zrRXlQ|M-BNIC{wUW$y1eZ)c=zyQP>53rG31eUpqd{0RI}cP~cxD9_8x4!@_a`ip`i zE{&jvLU!rZ$zTPUaU=bUIM44_gea3RgpZRlIxfG}1!+3L7laGhh&q4|_;mIRmtiMs z)G?w`N~EO_9&)4()8i+<2wF0#vw~87WWn1}@uUp5{VQ#r#3_7W>bx0w5Oa?rZ zH|{yRqEy}IFIjFiH8s8v@X+A{cKGmN>*(sWnKP%!Ah%fW#XS4qz4zFxSu^~*xRWML z^bhh64vzHE>Y7z6ZOzIRHe<##8TyGfv8viXKUt|x`oIGpx9Kw`*xcDOd<5It)+SP7 zQQ!yfzt?v#t1K_FsZ;B%x4%aQwOxi;&S6El6yQiH`15wI^PHV%Y_jq(Q~llSYp=c5 zmM&drDjHoYapDp={fLIL?`O{{blMq9y7&K{>5 zVBMBpw8zXzyqI(1St-K8Mrcg8(N6c>VJ-xC|Z;f)wsAZ_7Ae zZloig0Nq(R9^xYL)Z4`CrTFZKMOp&NP}9d%_E z!^Y@QKZo^{NY@Emq=B3G=n$ST3`>0!4@e|~E9&aOBRNGGUQU)ocJTXO21kg?3|0YD zC}HpW;Ls0Ryo@Z{5PolOBKQ+bmX^rze8j~qiJm?bKnwlN1v`48*)HW)+Gig4 zkUjqRqt>KRX=i7LH8!7?SD#~3CQq>$GL&adHQ3($d*#IS*m)WD=9Y6-Dq}l!$|T#g zne`WEtgY>w?b~an@w;a9OZn??Uzx9d?euK4ZG`3~icFP%6V%6iv+saj|Z13J( z{(b6m8o?hraopGm#tp4+_x2N)M&b;^{gE@ddzb2O6C3ndM4swCZU6SABa$(1bA!a7YvPBj%vzD2e|Ibr3v#aEM@8|9B&dy9jbyanB zRdr8KPkDJI&YUelO}T=>&j{m=3l61sFeJ$Ri;R=b)WN9tC*3$&b!7-YFbOUw-K&82$faB<;C_V2YoB?O7%7#cXu~ zuYfT;bZw2G>)@>5dHorLcRr7k00?fV5EUd){^`Mhkp{~<7fXjAN6sRa@m3!pt0RW> zD3ed^SPTz~8m`+3_p^0y2H_LJ5-#Djg04k}%Gk4C!J#u@Bl$4h^6PrgUaRTp>a|x> zdb@kj+1`Qf&Rz`m4Pu~IX+7v;dT-YNx;uCsZUPg8;b~anCa_Ae_mYW^&{fuct@0Iq zys`Rut;J(@&-_N4&MGBXY*x{wc;W5WOea4~fK@U7iB306igB7$MpxEpEMp*KD#wU$ zO3iuZ=TP{s zy0SW$M=PcE3Xnc_5BIQZ@u(~wX9wG$OXa4TGMk+k#EC9r3Zg zK17)tq~jB`X{3IHVRkunH0WwHFtt_JzBxRZ|w}nLN8`2kspZbZ*pdl(4I_t#4w*TaXaryz_$sYM-SwYCONn>q=!L{raee)`tj^7Kp09Xg4#D3v`sFesZ8w z6=29vQ&Wxk3+5p)C7X>z=dtqESOL=f zXC2v?D`Layy%J-PuI<+26jaVSIJ1k9I*Y-U#v>FA1;aZ`Gn~C4JddXfw#N%!&#SX= z^WfK3Cu=Zz1VeWrETdm>qkKv#$jc}*w2@kssnvpB$`qRFbKV%%Bd~%)21APql#dZ+ zC}e2Opct-!!PP$o!SZ%+JQN%+Zx_W$cx+LbIy8S)#(+32VbEo0^c0j9)~^w^Q`tz=ZcAmwW&w#bL^$UeBSQf2Bev=tZtKKy#~bgjETd8k9-x4wUsz__#ir3 zI?0PzeZ&dj&#vA`+;;1&sHi-KJv(>Nkz`#7$%r8BJ#-vr%v*vxZ@mKF_{x_N z8<~I(!b(g`Mr&&$@(L&6hMTX#OV2-xdXDI&)Z>#fkq{Y+_{2d6SS6fqSbt!1kmr-Z9If_P;`U$V~ zsHb0FQPaEALAsxrPMFs3l#ze>RBBXYj6c&2XbN?Vg8tj*UI|2e7T=^#Z9$dSEQj=o55{!o z^2t8KKCahw|NRHw$E=w%hRghI7&g)p{`&fQ%$+wE2}$&hSi&n6F zK82SMk0yG4AtH*`r8ll%G1iKEyy0_R9f~o*wv3*pV4cTcSz(J--6GuJFv0{yWj%`( z7c9kl<2oz_UE4^NXOCBdS&1M$m`Pxo>hyf#58(y%D!+t5KOrHSLp&XZ_6V1EC1*el z7Szw=;e0`yu5G&8;5c61xx8N8pWjI=J}9S#Hlbt)%czo&9_4ZTmBu*z1yy@aKUlHl z)guF=llXXMo|w_F%q#c;5JIs(&*Md$PnMS_Q+Poc)gxn@I3wA$KvACxuV;g$1G&W04V z_;c-@4`AusImk>&w3X1JMH}k$vH!$VfyS{j*3>m2HX#;W1D&?Vaugl4NYby4uC~?! z{~p$x#I(-NPDBzPav9OARPQN^rs$X`!!0^atG;R6y4a~nQx}y-ybNk*D-G-rx@pLp z8ar%3TT)t*tq@mVltU6tE7;lD!;ybKok-#k7h`p35FC{hgTD4IIs~km3B->| zoTGx2&$Sac%V~GWw+Wwp>)8i(s?A@giko-Di&(w=>64Dv%Fz{Ro#ZS=wrJIUoAYN%VcSSZ+(vR+S?jT zcc&w$m?7l5CC;=Fb;*H?xUcu@W9zn3WcyIKmE}nHi zq9a6?(`vW`=_YmrBS_kB!_q8H^>9}PC+g%j`kslNqRxM(`x zoe;-cz#W3~L-py_>6hLY9F3CMMiM}J@iNSgmw3Sx4PY2oP*{Zj_|XqBd**Zl{Yl|G zBRz=n@-i%4vIGe!nQ|Yj0nK|*Mp4aRnS=jAMnvfK5{;t6d3w$j{u%m zZ$agZX_o8_c76~JZV31b(!wk%=WxR~nU`tk*G+dWn>{IJByAf4Iax6QEl3L@5EioFOdqgpO!B&ItERx?Plbx z0{)2~f~}wPgKfq0;GjmD8ktB&Bs0P}+GK^@-14iu416CAuAB_LlRY>7M4#TQ&>I$|)L}C2YJ0(O@Ie_B5AOBnMp~2lY&*#z^Vsw|^B5m=W?M)q z73667PYM1{tW{n5g|B^vcuJn_Ijrs?<8kq&Yfx2l4tsWQr~JfW=90yTXQS`hx*Y{Y z<1u;iI2<{!7bR!U5k~Mjs!$b-fL^=i&t@BlkMrNBQuR-K4C#}RAe92Zgg|cySIfs6 zLyU*`U`p46$qdtNU|`t-UR#ff@3u6G!v zSOSn-yWUrw;b>g_OKEHq^=}Jud{n>6v9C)HSPVFlrjh>f|G!3>r;74YEMBw-$>}-t zLJ33!3K^zbHeQFGmk?7yC*0%ZDe;E42GWT)V#HvJv3Ng+@w^UTTMDlg9|pT-oc#hO zdAiDaefqQMTn3w3Wx6S6o;{C(%7pcYL2&}_c>-3bIulTx6&J>bhQQ!Rk?~IoLQFSB zC>(>l-hh6s5b|s|FwMO<$4hyoD3l|lS!dkLh8j(m!2#9Ue7&Wj$)f$p{U_#l`rsrn_fMH+()R zs3r?aSC=Ln!^J+)#!^B^L>e(xA9GnLHG~^xG20cfcN$e52IUb96KbnPL1(YX5EE$L zDxWjW)9g@L{dlRmEm)FbJxJ*)(&{HL<@HPoUV)*{C>Ol*>+#??dY5Fxo4)R4)3RHmpPjI8Kxx`o zL;b^`1a*24ExOks17k3GI8LNzD3Xw50GZA_f}_5#X=%evbF9ok38UA~(Y5k1u1gCT z^(;|%@LsQ5^|OKOU>+@6>?g89MGG4xj=hA}&uiJ10p`;)Xse6&{kotV6A3u^|>m$F(6&`NrMt0m{ zd7fCK)obZY6HjelX{MX*;=R{5Qpd1d1VM4O;R^vKB%~uddm6?SFXBjkA`|JjiGh)^ zNY5%lW@etXcVtuoa>h(1J~4=jjYVX1B9COGb6^vnlx+L9_mO5zwTp6QwAn4ueEirU zM8(D8x;t*hN z%PZHN%A_c}vYHjPok`bVnMBDH9wq^24_6s%5_vD10bRYr0p zSa$1iI*bmx(Y0hX*r100#J3QP;j6q>#*za(ESb3a?3C$TOLxam?`2zr%JOVZEenTE zx(vC3KlV|!QKoye?qV4DCxpKqNtc#j>EgvmO3Sg8Y+`~cloC;J1Lww8Mp;F@a(PH> zRJ$iEA~#|T10s20M^Kju5AVHkgu+Og@>#qQDdx#II}!2#&4Xkfl~cV^pc+98FO*{1 z--dup!z*O4>M=oQ_VcgRNz{PKrxm8QixJCfOHy0$Yld)cT*zbX%{VnvK!(8-EayrgPXrOHI7 zp}>1P#2>=6Q6cjQ7fON2z3!Pwl@0U9@G(AxIH)ciejVZ)%9zSU2@SQ8FbNptaCBjR z!(~;s8OESJ4F=12dk6JdouXZEJddDznk6aK@f7eNC|&$^dGI{a4aPtItSI9(b73;Z zL+Fm+sr&*ce8>yN8?V@hHL?!nIpojz!5kwxAMr`)SabEAxa6vfke!vn_+Fenbpk*5 z;g66qdJ68l|1+38CIxT2{xaTr_d`7X#MkiTlfOV*Y&veb>Ce7GWiR4m`jig6ZpOshbyp|j|PAVsdoQ@NX zn)sp+>R{C;%9Tf$Di~i3w}2J}0S(|OSf4PwBsKPjB|OnSh!wY>PE)rd>UQ1g?) zF5oJv%1z({#01Zn6lUN*?+{{KfQa8QzcbqyDq@3hem+--YFIxzNc(Saty3B-S6Wh7 zN>*MOXT^)@7F16FM;LfHr$yI_bE*~G;3~MX9l1BA@~m596JaQa}=+^&v7Nx5WjcnvCTReZ>Ifb7KwepyO zBEHtqES+V8w$^{84|i4_yw`OMM=^R%Z%T;i_S{J5DJYL%@ZRxOl;X%M!DAM|uv%27 z6>{+QPi@6t$VbURIHhXCOyNe}nS2db>UBv5EoMm0kK-gb24m3Q00`Sbv~k?RzDB6R zi+SZ}k#Y8ljs`N!C15|+qnLkHQ2NFkbPtO$v^%P z*WPd|n!D>Uxv&6-4j!S54546b4!-xTZz5-OJ|;|>j@ZOFq@-tXRNjGOdv>Gr+!^DG zjUtJL9GYm#^4P+Bj@B~~%Mp57S~hBG%dvO&PRh7e8OM@;)DywA?c#t*;$&se;8;fOB(n=l+JAZ7%32#C&M5P7=S+4BVo%u+|<48ed&h8WX) z9$xWb9(htORE+VnU7vSvSDrtFt8|@R2`DuPOb<^|Qu1DVgT*lt6fxhY7XqAu!^?yn z-%g&!dK4=MrH|zV&&w!>*u~7e357yjIUlCS3r@f@mKP458pNr*35x`b^-)LaRv(NX z7?AN5ya;wsde#B%QeY-%s*7ipmm1YHr}hK44{|7tk}a|%g|r@oj#|^->H;0EINei5OLCUsYdqhlu0$K9t(skzAB%KwEl}0 zUGiSNGr*gLtRoXkUNVDc_t*W%6O#!!SIQd(#;GbZ)XFTF23K^t92qhC&p4weXcy)2 zIM1tm#vj76kxiiJysY<^@KCVl$5!WvjC<#I=TdaiiKq!D!(jUTO;4*(Br3c;X;DOmVS#)hZ*Y zKBkeY9BR#aSem-E)uc1ym@e{0W)4In6TMoa-CkQUy4>)q3^B07WJkAxp&v6Ce*}ko zRxTx57K?L!O0kXL5gb;pxWXe)bjl~0v%r(n8MLYX1dBw8#=hQmG`BRMAa6Vhato0^ zrr7#kef=4fl^jG`QXERop2W|7{xcL6jX^{o-fXxotPb-<#$%{b{Uv+P7rx0-8{)y+jaV9CnK5H^@Rt=Uw6)LCyIX>jR){F3!9jjXuP(3{0Y9w zDulR;Zx$EeYIPef2Fla^CU_a)7T{qhcsc7c);7bE`ibGMb{uPNY{c(=|9iwzAY?EM z2_7PGn7Kx%W2JPPTGk=L_!A=DVRZzt$|oR(qhV?Jg#7sjz&Q_LZA*)<#ioSS1Js#$Hc@XBZA(mzWC$c zW#tHixB>L2tZbl^_>&;Y0}`mPVeK$z3>Gi^b=E}?&9g=|GRFEw@c0SZ*E`C-_d9vY zT#Oq(1v$C-EHi}mc3nD6uwckeUa#*I6i>&}r5D?_m6a7|Ex$^Me0$!+v7esz4Grk^1}YoEmn4{S=07vg zmd~%f{k>CpP`aP&9MWL_L;7^7e?dpHKgFx8+KDIfG$_QNxREwhd|01@QAXxbS`gwW zbNYm;;2S8WNujC3YoxE`*UGLEQYKN+QYe%}Dkd{tlux~;6dRp{c=AJgyZ5mTC0{x? zOg4GOppP;HUvT2%^_o=-dF60KjFe$abS!IPIki(jyLhKE(a|wPM~{Tma^Ch)jEj$n zH++WrwO2QJE`AFHe;SGD%J?LBqA{q;g6{3Yc_Mi=o>@L`2ggFZ^qgt~Yfphwlrq?@ z_wQjP%QQI+nrgRrB4zCp$lzbW_6n8B;Dthb+f%D*Vf*Os+w9mO3O~++^JKjD6K_(O%2MtHq;u$Ue3zsa!;-!n3Zy749Dp6fgZm%5~b)uCF33;Py zlOYCkP|o9laoU)t0xA>gE^j+EkIHIxz@n698SO9lr_%2HD@~4~%4opAD|5t^&+`km z^WI8Hjw$=9M?RvalY{J(ceSgoyuYh`?BgMZ2vZ0s9El2FqtW7&&vm&wCEkb3cr%3Q z3PugnZ9j3g_#fQK~2rT#S~0ka^Yq8`q#gXi^;eJOP1OzFLg~_xZ}PD zvGBqbSh#!%nrrJ(S6AmS7+fiPN6{htTma=2x={JqvhytC6M^2rNG!kTO8ouTpP;c_ ziB+pF!qJl_@z~>!*+JQ)!q`J0(duL8l}0{V7&Lq7YJBahUqnJm5>~PNf`#+& z{@RWB=0E;3u3U2omMmL>?Ynkk&2_io3tzYwixw@!@ngqPQ>Cx(sI7<);e~CcHnxsw zOm#)5=ipu4UBcRMS3aYK&V^{m;^^axUwQ)b=1oWOqzR;9C61jY-|znnCQg}%>#n&R z+jeY4qxhu`!glMY;$L#fmH70Hx8sKEZosTr^KjzSX|#5BVEp9ySh{SL?UdEt-GRCD zFT~C+ZoKX~^19MKttw-hl$42^Z@Lw? z-EtFVP1hHXYUx;YV$D_8;&Tr?h%2wS6f-ZFgzTI|96NRjY3bRx?bgrWkw-p{)|N(` zJ9owua`E_y`0`_4#*NoskF?|jTaYAbQd80~ZR&J<=Ud;g_id}ID%h5NNKa44(nZVg z-GBTpnrJL)sw<8DxWptZUA-C)efB|IxMC@$jL)Tk*rDkF5pITEe6TM&8DISQoUgwS zA4U|dX0en>Tdn;>VNnNM*#`v{Wll~sskD=)<9Gp8|q`V5RKF5pNw2S<*a z!~FTnjEASsl;cZZ{stB=o{J-gj-s-%84rK)G3?!c5Hl7m#F}f@V8XZ}96odmb+xs0 zu=7w*RLFK~wvUxW6Zwfn1-93FQSmsWrlwGSGHvI#oZK8b<`dD;*^03Rg*b7h#P<0< zdh{S2gnmTFr{L1duS9HeG~0d*-hKOZWM<_cCo2Qnwtb9fI&x|&&2UH$neiaarhmi{ z(r*0LpV~(J@Efuz=u7JJ%BZ~jSwA;^IqOu;bS~qKcb1!FsdqE7@{u!k5)zXV(A3mG zT(qlL1~Rib$RJKV)F0ly(%q^+up(`-UT)4Lq^6Ixg?HUO9p>1kX5^60nYL+5U45-N zwwYOZ7&mbW`%_tftLhhxe{(2a?J625ld@}y4DE%SGNqfIvp($`&X`T%PeJ8$We0IJ znPgdAD_9*S@1E{CE!GZ?^Ro>wc&Fex#rdrueXF%Kmt1@?^68|7@c%Z9jHC&vy1EK~ z_`@F%pO|7%p@I_eVHoas0YFt0UR&k5X9E~A%o}!IM%vk~jiJuGFsSS>9G;aF5~El< zf_uR=ry;;g9^33CEAjYapT)*4A7LmV))v5(l-JW}e}M|LiXCViKK$qd+q%#vC$>EN|71v&e1#_pN zg@$*Haw>t{c~#0$pL_)Nx@jho0{buyvDe>zJh zj0mX={Zs}28?L$wk{Qeqqem=f!BUj&S%>qR0^r#UGJk4MWwP0lpe^;&v!pLS{zV$q z3$W_KmFQ@%!5KOlYNI>uxfiSH(CO7&Ygixn?6DpoyIG#T7w1i z=VBE{Q~BAcIJkEwS~@yuK$hW#8*aqqS6o85D8z=%AF&NuFni7{+Xtq&ko9WG!~GT8`gb@T=s*)f+F;> zKc}Zx`7JHQnd=HbXeA4x~i z5U!*goH~67+qZv=>auoRcJZaCYdD8p+jj(xlj|SxPka|2!cn8>X5?@l@z;49oXH>K zJK-p(tlH0JRd{bsm%$C-hmAr9D>rW}aaYn4oKm6AWHhyz)y}$OwyaLhQ^$O}!~i z4ACJ4KETnU<>Ai+LvVu112$M4dWL68RJgIMw!K@u{35i|2>tPw|A~M9m+#;wKmH*a z%8%KWYaQ(!HWJeFH3_JDQx4Cc6RIv&#K;5+W_L$7Vj_|-NCBzk2rxS<6|vC~SU7(+ zipLcb7v^UvDHsWh@C|unf=)Q%l_EV}`Bg#@9w|J=6y>sUGVt7=pT@o&yYa(+`xmT# z=WU!hc9!v@>9Oy|q5XS|P8BjiBJEyYa0aPNa`3Hhd<{2Ua}7=&JBHS}3jD+0Jwg2A z*;aixa(F+=%FB?NmW(uxxZ5?VBMccUJ@5A5%n*FFXUH4Hhe}jZAlg)|uB8YiD+Ob- zP)bErdb%8y>|nq9_5Yx?wjN2$yOJaOI65qvHWz;doxl*M-K%1Nn!0*yt4t6ue^--q(tciL)F@z@Fk<6T$y6mFXX*~RmXfp zT8Ex}sUw7Cj9%j{+fTF^TycPDlo#`^brYo970U{Sw*Bnu?%;?h9yvLw7@wbwSc;OK z!B&=(pr^AFu`v-yjOxcg4;@2N-`Uzoh0}uMqq<_rEKpW;!uJ3D1B?1W%_&2)=-UJ8j{G!K2)4K#!(q7BaPO^%%g8sYlDv{k}sXF zSFFSeeF9L=#RXdqpm<^ibd;vvz5hnD!R&P?=8d5o=B_(IjOTCdnBU(XczpAzlQSmhLY}dxtCOSH^F(xG$O&sy{ zvYkf_^dmCHXVqlnrc9WM3l}Zqh`0j{Ev@KhpUle1W}TzhmOXUJJIKdw9(p&Lcn|a% z&$T70=oU{pDKlHPZl>Ogz|liz=;ZX^#My&*^Q~8GgC)tT$quhgepybz94el58_Krv z-;>P|Qko2s8J&P#s?(;8gN&BWa{4ZLN@^0D*LpJbZW89rUxg*}CgYi3{X1TG>Q5Ly zVIro?n1@wM=Hs2WUc!lUr$}!mVX3dl=^fA&@rXiHERdcRi?tuVf#3e_H;f&H$y28y zuP_O3t$hjG_wL4|8B?)v#bV4~F#`icF`k{wEQ)j(@sfCi{aNrupBcb_7eZ9{D|p{k zM(L1{SJDrJJN&ubbJzmvF#H_iC7i5EoM791PW6` zxSOp zR#s!)f`#@B)H|#pH4NWrQB-hN2zWn2Cl3ju2%-}2?(INsejbmBC@j7Jx8D32@@_R! zl9KSk8*ibOifQ5E1?Zy#CKy`rO~=)YK`}>fx8HgL=F{7L>glI(aNizm-?kNFvNKRj zrFdw^R=o7e+n6zZHVz%x%g*Eb{fepLL5QbNae4F3CX_{=l$YVn2*W-&D_DM>!;Yeq z0Gj_UZ#^H*Zl|f+Uqyx&K^Tw7nQ8E9`Q;_OkkdV8rc(6>?I-=JtVr1 zeOl9bedwH0VXl1AgHbNQ4L*d=0r1ADyId1x;I&1H_(V% z{Yr6CDSFr2m$Vm$qDOp?b zkSS`aFT=KtAEL9Z6&;QB80sBBdTKHb9oml_TeqOGwiX>t^*D3lIP>@8@P6{Jx&&{( z^%`25T2NJW&ejq1^mgH+57(N05@hM6J-c_H;>=l`WZ46U_Mw(W{^;SOIDO(IPMtb~ zV{``2o-4zF!-sLU^o%{5)fxmnj*`BT4vdLQAl@;UI&}dae)MtNa?7XLX62Lvj!p+8 z^XwDGrQl>j>bK!2(t=Lnq4+`kyaaJ&e&e~yDJHmg4XX(Lu|JK;8*Pi^ZoTDd_G3Ds zG}3csOu?v*CTxB09c)|w0iE<;BR4%2V^b55HzwCstZR2V;Se6eL3*IBuEy35EnRdG zuD)sw>Fz;Q`3XG#?4Pk~$8jVirQsa!ckbMbSDt^7gQqUUQ_mSS#8G@Uq7)GxcG89V zuI|Da8pboiXk)x(=Y{dd$z~p>*Q}0cw!2Ym+i)KRhphf@4p3;H2taU^L(Yua%niI? zvINr zWM!ALJiC6v?`s;aZ>|rQu&U*~ZQgo0yExeC{zkN`VRM007%b{0nz(I_pcB(Fz|vT72|B8AP4q=ZB&_BuTK+@G;y#|~V1^;KB5<|f?#;Jxf1 z8CZSs6&O=ogtPV47*|w)bkZRup&&sdk{xjqo_gj< zG_^F_vzfx8DY)wLt593hfV_e{dLbFO<1_aghU?aCL3h^xV(6Ht_2gf8E1nkup4+o; zCYdL#T*g1oE7F2XyRkGL7VN}-%pln}7VuWIsy|4vC^;d)-_h2*k7g5^X#m@Zn=LS5 z<8=3QQ-MX>UicNYR78}!9y*L#R41>zxw#dGk5{2*D4I@AA6mOQ(bL^&kDKai8|_0k zl1puhA>-T7(15dL)pS5ROb7-z+Un}-=IFZx4Ye)ioc7RA>kCTp@v&y;&z5r3PQM{C zGLEA-8fEs8UgjyUXhCbY-uaK_NO}NWOp^>%)OOLK8X(>&l)XecaENJMs9J zzl3l9<2Uh7-~A3Ae&`GM>}MauqmO*SwpvwCUv>o;v<+eF80lZC*4xaSFtrogL}pQe z+QzPIFkpJg<1J5cZL(mpPJ9VRU$SecCvQhZp@mLyL`(`tjoHZ0FD3)!aK%xUr?Nkm zp{=PC(7qVc~*h><_-5J1Ip*W-eB*UPb4j8oRf>j}s?P z;HDcsg=^MaYwcikh4ckyIjg3710INE@rWlH3{6P|ys#MYM2GHl?{K6aLcZ#ir0S|l z?B2H%58i(pX3v~x4tji2BvR7T5fzt-q~u~up1c@o>C|7bQ8=Z~v9h1%kIOfhAr5j7 z6goR7!|k0YtvHU>wl>?Ry}GW+HjlaTx*I6d?bx#M1N-2}@gt|u(MRk!h*Ed8nNjPb zqA8%lQDtBqcFlOUv*?nXiWi>Blt6B!2aRopT&QdP7;)tN-b&Kr)3ujj{R+XgvZ#zg z2wxdZSFrCZgSCwpwm#Fx{vR6f|113U>h7i{{O-3}-JR$}Gk84?z>(9n&OW3!4DDX| zyn~FSiwH5%8_2GC5fblUy}X~pYcH=L#;PL?=hX$X#86Qtr{_^Xa(T|O=Q`OLDfS$< zt+@uzKJy3ER+l3yC&Q+McW&Lu`$i-r=O8m9!=}LFlTwhGTfqCV7}D-RG>j=pi5vl) z<*0NYnp>JsR9r|QDnmR+y;om$DGnbwjP>g`7#+P-lnPFprtn?(UBOEjg}3mPk>j-l zB02^!iByE~NoM$}D$7h5>uSpI#_O-((EfdNDh6$F&#|LNNq;O20R?j~5;RffL?k6= zAUmfBF;s>n=Spbo&!Uv0Bz?IiVyF+@oh^(%W1VQ*&TTk$suV3$^al?f#NOQp&_<&u zCb~ccLP;JQuXSzlmctC4jg;82V&c;=ib^XwCYcQrLu1sA*5-PgJ9Pprjr!!?89e{| zGgLygsI00+BkNha_5##Z1k861)V}yZrM$N zGdhU(YZZ04gH*esSEJqmMAP7#vEpb(k5vkb=}266Eom&r*fC?VWWju!<~(-v7>@Ah zVVQ#b(Y8oWi|#Z^j)_U4T;?M^Jq3yJ@%H*yQ*#UA*w2a!Ct!S05$n*q|N69K3-RYj zG`|3a`9+AOytKAx5AZ&ur{&mmVjnG?M8krlqCRz{DUSKF+3TW9YcdVE)0O zF7);`+hc$f;@jF-YujI@6Gu5)(b05@sr<)`&cV^6hiR~?1H-`f2--+@YH2l`zmh}a z>O*6TlZ&lu&qs;1(WlZv6Q`eLb(sm$bk-rc9$hdIx7=|zM`_XI*KB*eDL!Ec8#a8v z5&sHInLY)hsaF=Tt&7JOJyrym*cu@p>4R;|ylNF!gkGaD+gEMI{oSl7i)zuEAB8T#liBeS9Du$tk1o&p-SjuDSINESoutw5j%6<>}V>@QF!*LC$aXew}=~sk|X6vefWSL zWBQm$xcBp)LvBJ8+S$RAbH-rLu081OjKbY_(u*F_Hjth4%IolxpZq&JcBwrF)M`jm zUlDzXPRhjhzWZ;;PL8t<8=shn=bw2NPygvp!+f?5PJG2{_1#eLC6G2+A?_2W%*8{G zehHb`2~^B6#5n)OQS|@-|MW>jK~%7A?K}3d06puI($+ib+1Z7->ofP#8Q~}_ zH4Qz)_wbQDc>CS8`1;qsg;4`t7*mjA&-tHz>QC6T%CB=1+JB;$j_9Z6SI>BW(wT&}5Bq zqLDz5k&%vBvu7hIHj(X5FTbtDR(4LBG?B)z4>@D=QPD!8nG+{bU0G=#$;d0pqcc-!PDncYVMWOa%v!t>bLK5Yb!|0TnwwEoRY4=4M!EO~ zPMkSMr-+7)24R3`3dcyzda-Y59ZD2Yk__AHp<;$nzzg!jlp_CJzlb7U^JIOJ=V3Vz zy~@jAdlVoNlcp`eeGlA?SKfXV_uPFC+M7%8qks7p+dK*PKlC`ttIlA@zJvJQ-~T;c zfB6|~rsLTgor>@M)4$;NPyP>zEdoYGy?aUJspU zwW)BC!4u9Jx#`(;Vsfe(?^qi2ND`+N(fT+`U+)mcj+=%b{qXzv@T2vpsAy#QC|t67 z3HrNh@poVQd-lCJZ?7PPvM(yla9Qwnw^-we>JHXuuwLU)fRA$dwew55Ti4P9xdl`3 z-~$h_KSraEay!sZnblhgl$ad^M zd>V_FEJ0CG0Y~0NsIEDKpa1;lEHe$$r_C~XPfAWi5(i9@b&jBrm=sT$N+n+hO?SQe z%FEW)qQicoBP5(bhS@$g#9;Xt)R#qFsOKc};)&DDAG3)kzDSoTjCWaao{5)AcUe=N zu6I;kZK|LoM@#sG{Yx-Zlj`()^<(AB%^i&&{Odns*^)(OLp~`CkE8{xn#SqLr=DVG z*GM`*jzK~Z21nWnQV1C{67PiBErSTs5o9N$1l8E2+=i@;f+z%T=mbm5GPVV9L)gyn zn1mEueEDUFrl;OgQ;N=pDy)6`b&MKp$E3n6+Y}&%20%O4$0x*bMA?Hg^yW^VJ&m{C zdYwvl5=W}Fm~+7tY*_a;Hf>r*L%`8Wa}$;CX&U-opCV`7{d58}LLOpVEfq@sn9&&O zZblk~X8YD{Xm4vbqi7x!X)s)gr#&wtUEX-UN?46LXU;-Q8$TM|9n~DoH=v$Mth1#K zv2-z$@*f@{l8;3@Weah<-XE%^aDYWG9H=2qv2fKaGOiisxT^7R?PcR0@5l zt}4R-M{%+2IC>=`feJb!H497T&qHo{0=@WFe7totM>`4R{2(@O++c<-6d<*OaFt-{ zXK_IqH4UarosFeS*@3$15YgYsQF{|RK{qnknc4}vyGvh5>LcGGke@#WQ>RX#GVMS~ z$yv1Y_hMX8G3v>yn{K=c2M+9@tevJZFGCYY_~*#;%F+rp*8oQ$H8%2^H+`~wF-Who zoI7_G2TvTsvoq#t_J00T+#!{h1Ael-vg*=GkNHKRz zE}e{gTO`%g*nmBI_98PQizC{xXlrhybJ0el+Dn;fMk|$CXL}nBcRi0fG_V~z=oDz$ zTd$k7GQPdFl`_)Ge64gkTNvL&W!Qkm`Z_c*y@}Y0&D?!g|^p8g1cb6qRUNN+L(@aTqslJnE_{k(ZZ;6kA+HT01&1wxGzS z;HAX$#j4hp8ho&B9Xh-8071&jN64nkY}lh#^7ac2hl1;hpj~yt!{nD|Gb~|)eb)KKQ5$h$$5mQ>RS^_Y*x%a?cR3Z(E9z^uqoWSS%0U~X zaq6W(Z?mai=LHF&eu>304xXk>orH-OOu_{hOh9I80#2MhjIAHpbl z1JCx+2k|NB4CZw6TDXXB#v3J(&$jAbRq9s!Cl74~(C+y^Dh3%GINW^u_2_Odr@rb( zN_0P(>#DGC=f~K)Z3~?U%0g?4t(!P;>@Z6XAU|&mA~+~XPEW<$`EwA%0nTKOxN93u zQTD5dV>ca{4s2Ne0S@fl&3>~RyLN2DmMxp@IesT)zp1Gj`}gm|DC*h_!qNJb9`ef_ z3}P%YL<=t%W3r*M{!15oyDO`xlT9O!7#Heg4{mIg*JQ{_DEL|NZrHsZt3+1;Oa+zq zK#rZ)4hCB|2sVq#UPwk$Q&Vxp<(J#@`;oGL9c&~mgjDB&J$rD)RaYS~E!zaiiB^!e z5g4Gq3hEGkwD7{BB=QVw;7hN%0kba{hd5AqlIE#Xrz3i> z2hFu*h+*fk4$j7EXO2vc!Yb)Z%$z-o0{k9!A1=e?S6u^bN73KjLZ6c2eOMMB0Vt~|MIHDr+=82Lya638%@|)?gqL4^od!eCnK+7zia=I+ zA`Sg$TRGd)H^k9+7M_3OJ^cOO{T&|u?C0!b`7(qiEJR!monagBS`uSt(O`6Wn$g8F zp`ur(@RrfYG#VGonuV|b-PdTKy3p1_gV@r5mWDbE^mfs4h{5>DQ?PsYE-YTW1T_^^ zs>Mc-efHQxz`Z(kJ}Hm#${M6+WMWKC8VzG7^MzY%`dL5k!0cPZM?c?6)p0aO)o}I^ zq{fXJ?fSGYOAXO6Vi~>q6E%t>8_J-KBuTe6645AIo0s^oQ}vK$U5W=(o>IzsyFok< zd&CprX1FlBl)qr8Zs%7d4LD_$Bjyy2jECraiG%txC&_5h^(ZBuDEO}C zjvPY*9p#mC=i*d(8O9eBpscJEeLekn>E%~&*S&Xfpdi>o9O)%OtKD}|K3;zAIT~(v z)MH}ek)54Q$FiO>pnc}adDX4L?CONcld)mL$E-7&j!GYSr&-20bCf4do`_j= zo=zV-f-~hcm`P{pSHJu(8txX#v1CLxMzm`X=!>2uAJ)G`i1;8mKaV#36Zz6P3f|W& zWmv`n*6>p0jFTqYA#*|_ZgmHd78CGVL02QX)Pvz7CyDZ*k@Sy#@O>Q6 zf;JRz0%AQ9R8e+5So6lt3&KH%DHCKQWIj46c?ihjHs+E!E%n0 zG?guntdqhpHm}g$bn1*%yxB}LrQCkP{M`vJieij9dbx{%Y(+Er+KNXY4O~3>i z=w%BRVcx76xcH)r?LA(-L#&wsjh1t=Mk66kyE6^ZNQxI)IOmcUVQ} z@BFmjJ`6#dgs{{})N$lArf2HA(Yes3C0cYSMKVC%w{Vo8Ddb4XU^hpe160iVMzcOI z*x%i4eCeh<_jPr#ZPVz04WO#D5;c`oXsYArw}zu;I$qV~l~ghuoz_%aTD{(pZQv-G zPC-4Dn66tIIXa~yqjM8Suq};E9ARrz(a3zfZ)#&4@9Q+WZa_0fvkkR%9N}_gO#Zbp zt*wQlYAtMQYUY{cn;l+93rESV9C-)l9va_v=Iw0nMhEY^TGf8tbb@)`#!)p#!1@H{ zKyNpa*+&LRI~hYEA^*rywX1HlKY%Zqp@TrDLEP46IJRvqr9jj8RUBQHmX^{GHj>|w z$jlmpF=O+YUklRYJPg{icum=>iPScs0@cZtt@kP2Tl?vdQnn_gQIVV|O+PPcL1l*r z98~Cq<1WDR)fbbtP8u7n#P*^8TPxJj0`%BiMZ_YOX=9R zqnrHD=((|}2_1w{Tu_8HYp%BP6DLi=@?|UV{eSs4{MS$a6ZhVAGsYK=cE?FL5Em`r z8_kjY+&S~`?SJ?d{_`jQj=S%?9m$DtbTmX4D1)iU$SlN?#mlk!qE)!;vP*Fd9i2&& zXB$7IGsQE35HO;&jA`Mmcl&VD*GVpx6x7|tutrwjQn8XyjrF-RUpaPYF0rgA~h zl^kya75o%N90+$5LRg*0Bpg)=GCsTdm2$U@tJ zQaLbR1oOm4$J+GoKyM#vs0h1y*clV!X~@PSGG-J#xN%r8cOHd@HP~plpT;d8jkQ(C z%}zyfDg~c|HqlyDMFm^mNWrY8qGscfU-nGUaC1I|4J{?5V0TPb$1y?R=qENN4)f@IrT9$3}py%}|$#h&;x0Iv4wX4yCaMq}lvG(q6dq=as_F%97*v?VXZ@cecN zgJj0q!=mMA_`Ss`I%p%yK>W20Y#bdseG+fRv;3< zP>JeYT%EPa0|7FAh>l=CdX-K^PH85MMAhJn-+FdQ$Hm+q!X zx7s4kQIz{5M-HO0{1kcELY}vyxxIl#yo>!c3C9lY$LYfd=zR6rL~Cykv(isX$xRe2#D)N9tP z!R$FRv2^JYeCe@Av1-KvVmZJOdMXw!T#cJ=x|U933Ys_~*LI*0l+$}2xE~7^EhLWO znfC>aAZ0jga3em55emiwe*~uwdU&sKhsF78o!8n}XX9TWKVrA>mw6*8SNiUE4t0P& zf!f}!uTn+Yl=KhS7PhY+)_{N)`QrD7&?1B)KR_cXNj0HajLxu zkV+%3g_EkNhoheX3Z2#hNgt%8CeeUL+9RR1mPTZyCsD+Ruk;mhF~{HN7R@|Jdw8uN z-pB}Q7EAPmd{N(*t_%6&{luLXiHP$~bXyNmg!3qfQ?Ve2{r5XR3=gYE{BS%}UU)gL zeIVgDxV$^iPYzaV2wubrSt&plW)DJKIYJ^7oCf=6@a1)R9Es$AU4}3`+OIu$ITH~5 zh^&%rWXE7gGm8|El!^z3tLadA=-T5rIVI6nv(B44oy2yay6PB-XhkQz+fEwLmVst_ z-&7kvG`6rau~Y3lxQ_zE5vv(NiV;Ty+CV|u>UDHc5IUQ%W7|%YoIQ(|UwRqqKll*U zHMKP8F=(f7l~ds~YXOKURBtrVtp=1sVn{NGA9l-sI!jO_>@p@=-CA5U7E71SL04A; z@h+i)Z{TRG3BBz6S_0WYJn9>2P+MPveFt`9DD_wf<&K6d!9IWF~el{k6o49W=4#4_M78(RMyR~leN`{;$7AwBMi zyW=##o*Bh@bF$KL&DGZ+J0sohBiI?EVyGA*`lzru3L?L?>Rs=Q>e*U(c^yultz>(} z($K}2V$!qIEb^eet%@JWe=FXl*KK3FlEgAFY&9g-#GOOAuF*14(WAbxsrKp5D zhDJ=rLP9To8gI#5k>gS_64WWI!>S$l8@^{yn}vsUQn7_;dOqDt&s|$KjvhP4rgrm- z#!*R*=E$iZyZ7wJYwxYYpP%~+cJAJTl#Hyu>U3Jwt^0oF)zod+xy5VMEu|)WB-?5R zEfkdFAv$EFj2^}--KL|}kyV^!rQkfcT&bP34nTcIv}wUoxE?~=S+WrGdA*uOSAWxp zRfptJFj>$b+Kyg?D_DX}BGmaU*~;mHaW+z>5tgD<{aU#y2TuLhWJURelVnPZ%6Qw@ z(Sg+L93&^FP?k61*zuE;lL5+r7I}7ARVo{f!fWelY)V`~_{cCYi*5{03ye29NsEH= zMe|+@-^5SLC0d9}7+gs@*_u+-f~2!&j$p@*k2y-t#0na{M<2Kktz{*6>eoM~Gx3sb zuUeEh7MHGCf(sYS#EFbpCNtFOKk zWfdn;Sy_s_>~z+bjpo{NR9BSZ(>H(G9?NMZv<$RlT(Ti%xq)E+4P?r`7Dz^`oz&08 z3vVj&mxnv#9=uNwj{ek^f~>yXqxleE?3g?(S+oR+aa!odcs)}mT+=OrM~78)baiwQ z_X@1rv<2l=ZRAU~jrgPJ)n{epV9o_IXyDrs9TSU;%ru^d= z5{$;oIdggDNR5JV_`nvlwwB<9=bpx%Jx8b*q9`;ysHA7C=VhIp-5d>eqN1wG_Ln|$ zt^yVH?U+qNa$xr^TQntMHhhVqC^LM?C!;Rlj~ZGuOreLJoHPn84JUEp*mk`1!t-o;u1)@?hmc?=gxqOtZA20I(DY14YN6aMK_$5=0neDpY?Q?u;3Qe|l=4e(q%|H6~>w%f3G?*W?%ef!;au>PZsC@U+&wq4tC z_~3qfUYVE_ja|ET*+vqTwN02Zdlue*?>*Ev)*(h8mym1_OJ8uvE8UQe(2)%3(qXb{ z^iZ)&F;bCh^{q|GQm$1-TYYM~&Ay%voH}_F@o_Om+t#h*Z%wtm7S_R$Ln}uE`nX9q zN57?1;4Ll9HubNWD7_=A)uD2ntRt%Jd8a&*iN62nohwvn~ICH^y= zV-+fA(#1Y8NChRj25I=M53r1O+mbT0M+gGXdxI%Hu%zfwpVM?Pp%KXg+BA}6v$W@(&3WM;};e!Za z#{}jLb%jx3g*>=n5zdTP0S1!?#^_!$Gl%k+qi3rnC0Ma+35pBzke-@~g1kih@%R5t zW0HgwOP3-yC&k`INJ);s#t+{^Z3EkUY(5q)n8*C_m^`rnEp_LxfA2BOT(Ss_<)z5Y z$|Q!A16tvZ_C}m3IgPb+qEjY~Qh4%9a5o&73Q*LSl1SS(+$)IKuOP+!FX&|5UXtvEy-p;sLD z(D~g@ouK{Bj~_q5*Y`B zNy!PgWc9@;D$vK2JkQ?-Gt$beLVES+*=L?bbZnxk9Ih-x%3QF&I}kfd-}%iLqmC z@y)(NhtSy6Or@$7m;D@R>p3Jny5w{$UU?P96->eGSqm^@>O^c>zm^7`BRwf);-v-( zgK!th3Kma($slS4@#HB}uxI~a8q{_wt_9*${0uqESjiV+(57 zNiMql(=@VEF>d@+EMK&kov4u`?e!+yAy0*{J?5~s@OH4akYeUJFTWUb>D+Ancsq9Q z-j8;U2;O^dJ+^Gyi~R@B;J~4C*nQ|U_8dNks-_;yTY7~(?<<-#1G5$^qGQpABPUMU zhd{bIdU5V-J$i`u$J@5y%$X8;&CcgGJrC{fLsM%T2C1ONlHaYJ9GMhefLYV0;gwfj zL_6DuOf|lW&n|=1=cGLh>KL|3fHj2LLdHgMTBH+$tjsKqZnWYyq<4slIEO}h9y+x; zwWfl2Qi0H6ICZMjJ^(N#cdU8O;&Vz$x{X@9Iy;a?LsL|!=kR*1hE*CKlIB2ZP?m&; z6rbucSr)&EpNyq_T2e~Uj4b0tfUcB>eMO^4ZDM0|sMDKaHFN2>+ga~fOToKJ2r`d2 z(}JqH^|L-DLn|D7jf7BAym+KGm(jP8KJS%RIGclEycWNNt8n7|Fg!X3ylkaoyZ`V} z)Hk)+-tosyon#+tKu1>>Vrj?=^Yf9Go@O&j8d0&NIb$WI`r4X5Q`Ho@$)0c*DgKXn zRaKyO?9QoG{WgN)mENOPtfhqIh@-)y_o>)7ejCvo~@1r{z`XloQE zPnt>^`s}M(wKbLa@WYLC@+(nVR*EAB_Ol=Dq_JvXyY<^{kJ`go2K(d9>v8zd36z%C zB8K&^T)q-Vj_$Q}HxuckYYj?5LNrbv+KFz&ZCcpD=>hw8Gn=%R2wY4~1Qi-;<4#GP~zEsfg4p2_C zD!vch+MtIc^0OWY-wq5TPGlys;cSRW$| zl5^!z8K>3hcNl(%XQ2ZV_7~+fUC*HW;)-SU%P>+GJOoF5&aN!Za5GT+=M_Rau!*G{t$&^U5$$%(n#_?Hv^IW{zY!P+wEe(QX|_CmfX^5`EMbTHMu7!<(B|fUKNE zboDf&xw!!cj_ksY9h=Zt--r$hh@J-yve8<*J5j>XTrZ8YR<@e*q5x3xF=^T~j2~Bs z1bUC!=lCo;9Od2nQv+mWn=HW7rwujVopuQVDAdN=Yr_Yw6jidKL zMB6Azlbij6QOL*{gNaioATgDK5!pkdTZvseIpQFW+7LtYWC z;QSuJT(TuX!Z=G0I;R$%Xc3-eV2B_u^C%~C=gdYVM{(LmUUAwFT?SnrXlZS1vXSW7 z@^Zu{CJ|pf`|Y(&aK@1??a{4DH98OZ=#CI+BVDS>rm%S!PReUYI&Lzu^1QX8+4~*K z^WH~}j;CM=utu`x-35FL>Ajvm}})2B^d^h%Iq1eBT0 zn?6EAojze%ht%|BoI7`%PG1Ac&z-@E(qn0q zXWwGKXlUhtDGAF~tiYi|9I=wll#~R-#}e<_V>ouY6#bFO*iSvw+R{Q<2@Ocl);x?& z)`la_nHt`wU_D-koKIh<=7*J0o}m2|%n4(e;t55zMx&W+ITRIP3m6;fThU9M*3&l% zUF=rf{iDz~5QT#A7hvMFBE%;V)~F6t*PO-H?OV+_=_5LcbZ{eht$od<2S#a~g;uny z4-hZCKfZL?3f5U{IxH!E2*(cZvM-Tow?1=P134BwCW}UwQ1@#EO>u|e{CMY$UD>_! zC`{9T@xuE^Xz)W=p&Z%S?k(1f^G0Px5>$`#Rw1lK-!;%;z;Q)|p8peqy@KT(7}&dK z7p}bGN~GoH*+^0VL+?Yu4UJb~UU$&p!(hmgqEHwt#VIuf6dE#TjH9XK5avkmbSW4o z<-9s{O?0#>QqzRmq(LJUZM)XbLxLp*pPHVFl;kX1^wZJPj*j+P^wAU6^9|NY_%XKa zpH^B{Rh7}BkF$j;+TE+OqmLuhM0)*H=5z*H+Zv=J%uvbb4D=15ue;x#rJ0cy{z5T8 z)#=oYXcc{)ra1eqFY%W0C4t7n4ozi}2Jyu*^N5SnR-}=(fWn_mN)U$V>GzYFQ5=ON zQBl;hleb!>txei6A%jke^0XM3*n|XV!<59tSeptJ8UuO;%+Ylhdy>WQ&!)BvNr4K^ z;(dUNrf_2u;^`3Rqa8yWVRoBL$k26>Kl11#3R?7}9nzxN$5Jyg>~Vr%Ynr#WOB*wE zp_q}PJ#jp<5t$K+M zaZ?`K5QJGYRjqpkl?fHIJy%vb`;r+x(%?L_XfMMGk$o=%XY zPi4oC8&Ah&2r=<7NKH#OT=nsZ-~8&gIDYaRVGf z-L-L$9!Y45y1BIjSFX7l#l;2e5A9~OhS(QBcyBY#RMsIbTAOdsaBIB?>lTN)NozZu z@jf~Ll1mvlIeqH;(d37ok87tg(cIS7NxjoShc^q~`S!Q*?6bc?YjYbGE|^V)o=g2x zhjZ0k7&Cr0UVr}2s61C<4tnUAo!>rYNc3Zru}S~L5DR)7A_E@jx>P*k;e1qC=9R%D zuM8$B$tv=G&l+pZnkaqV^2BRy+0nLL7&6oQb{S@#NlugdJ! zt_3HoNYO$*R4kf$6d{(!u7#=xDO7n@+PhVemd3-qJrBA!#_%WN{ev93Q{B!06Gff} zA`|h%_x=qlW=~~ezZouV0P*x6|AcqndJDM)lkwPBp1{lrh0wN-$4?!@_x|Nyar?dZ z;hIY?rB~WXe3EF`#PA;c_($Kz&h0yF0mtn%rl6i5+PEykckKy z4qA0@MpS4JFBun8&ejOb!ANG^5&9~ixsQxbdMCZPpJ6NID?}~)@utS>x7Jh~#yFc55sdhHmVWMx;qLC=uLO*7e zY=*{41PUgpwre>COK7C;y7PA8+ix3+^w0q*sj5a_dj}?u&O;N8a18nWmsegfN3gW4 z3=wQcjlw>4%@uS4+u5OfQI_nn6nZ!kRJF!mrpXv>_BYfgrj@zqfaJGczB$BX}J zHqA275Zc-SZ$tCynMd!ut17jxZMVrAl~unKd^rjV+L2D9cfC_>ip74)3j7r9BE16iQsDflKMJfu4Y2}7Iju;mDn&NH*i;hZpKs*RdI-0&ft zz9j2U9UYx0E2%(36GwxDrTW!|s$VGBy=n_^P(AvoPZ@tgU1Vwg&y=HX_@`^}OZWY1 z5QzXG`g3X0%cwjWf=}IaJu=f%keQl--~HjYIC$td+bEVsx)_f<@&&A0_dW{p^YH2` zucEB9ile)6xbgaH344_76|i^PHdNAaYwy&8uTeHK)*>R+rv9Z-Ukn{ra?D24T9L0s zZfZlV8Bh=%YD>*1bar&mSxm#%zVUVZ@lU_DH&hZ6V{GuC1%#0a*|_xD8}QPfeu;{6 zWfE}GqxKZhY8(_;#**Ax_|^5TDNOgxsa zSc94Kr{O0*{sBkFW3lF{n=x(r7;O1?8}i1_#MH_8RwkVTAK_D9-$p$)3NOF-XRLky z9S#5zQ9Nl5u2^$Djvd*B6Nf8s%~dxcGdCLVz562e?%H9S1*t!nQ$tx}4X2$9z|qq0_H8f5Yr|V;MRFxnxBMKjEd>hX_M=!O!!tl|nHP-nxy3nYROw}_W+wn(e zD38!GBHSp1Jo2=F1_fS|GCRg{bg_U&S|9S5I&~4g|NVbKXO~t*AIGd&(~w76&XpX) zp`&|n@aQhQz4m1sKXU{ZuU?JY@4S}^F~&9vnKUUMue|yUJ>4;Q^pUUO{=4tA>E%9C z>}o%%OetnlgyN$+IvS-5ADeyGrQt_~Ph;R6!J2bKQ4?Nld@7bMScKfsW007VgB$OE z2#-B>H%Ff(%804cCZMUU2Io%e+52(SRF~ky>7zC}{?6hT0$6UrLk{d&p)=0@z#`$ z&#(+DY~mlvoXvKSC8i)H+l;r3LUfy1EUQ#KYJcBc!=D*?XVm-Ep@DXzD}2~bSf;m+ZAMHZ z*|sv2{-G7Z85M2ss{5#kv>3iIJj*H3bX>F@t{~*xXcez$)`&62U@|huBgc&fnRN~g z5gtpJ!RA?bX%U-7(25CVT735fhW@-;i`d8r@6!t6F&V3O`6GI|5Y3TN9QhQ(k(c%Y zh+tY0M^;&snHb9E>j;40!NyobBd9hl486d0S3c#j!5LS z^sYWh8mYmCx31IA;H;xG*oAa6<(+x;_`;vpia+F#GD7?11Pp z-Z@=5pC3GKBwhIxLSq~TFU4o;X9iQ6-0M+LyxBbUdBZWl zfw`o2U3PU(hpV^O^8R1JS|Vh=;Iq3KfZ;Q<)xwrvWBF<&UBlEAKX*N`@I#h;_66fgW3wQF5jn zr%sijrlyWcu^UPBWK(1M(9_gX zzXAXHum6C?#(LH_h!ZDI};dS70& zC=UTr(dr9V1JFk}HuJ!<-rW|KcCdcc7b-7nGvekva=G=kRhQ@4_!FFU zu#CzIFHP|aimsi%h7kkhgZ~9neAc&}_043x($?16q6G3K+V;^-Pe~(>HA^9dt;cM= zHVW3h=6!TXrf+IZSKr5K+k152( z7hlf4LOCWbNpuY5P`0&p+6FZZ4T>YKDx$X5iA0K)kUZy{$E!ZutcPdad#dwA|5Q%$ zq@eb7UXRG6%OCkCUaDX5UT|pV=y-4tN7z?fcP$oQbOCm4djrq>?w9Cn?6zIQPMkb~ z4QoHd+Ber>-Fxrioi|^`tFOOAy;_HV_|~^E?Si?OHMJ1iw!MxMM-LK@CanGNU3<$V znlh4`nQlhf`j;6w$);icSHarRWZG$P`S3m_SrERu_I$1zJb1pa{P_b?&mZRXIQMXzVZs9V)c18M?fK{ zcli9*K}f1m9f>fHh_iYXK{#sMFkU|o%HTvg45h0RIk90bPbU-9IKj20@vQu6kajI% zu=*%aGy+$yxdP)03pt{jWg7{M&dS776rAJ7j-!X2P4B@O%pC&x(ut9uf&PtM{U3Bvhr%o znKKVd7tO=T6NmB3|NbxHtM?WAaOTV@j43X*=VeI2td%_zbpg-eS91?ccW#dJXv6Yi>kJQY@Z%`VY3++eS~s!Eg(a zu@EQ?@?O!_PReV+@mG7;W-m%tyD2H4QD?hkR*gpFplTPeT|0N-@ZrN8=^e&_{rl`% zMq0aMO_@9yRaMnkvUnNx@7-fxUsGIGda5aIP3sEJ;YB#&mlOnLSF=SDQdb}zFEnfx ziSeck1H24ZA*Xnrjb!~3p2Am#kq)YYU_{BKnC328x}bJY@|zk#1~cJ zcsj4l*arQ~_!{uc>SqW?6v9vGQZiPK_wEpgkNh!BFqGc_@LKCglG4&SLLEd^Wi3vf zK5Nsq;mm??Q2olT5Y}lp>vujP40f+G>sGw(MOP>f3gSa}t)QuRb9x9*P@PXhbi85_ zpBQaUn%>>k)||EVjU2Eh7+!kSvZJjPrRPfQla>0AOlD>V#*HgPV^gCUkg~E$Tf7++ zlYr5=qtV>hK>8(HG8{4#8mT(3Y+9MPh?i2@0$9ehJ}==9T;@-nLiGitbN5VXN=CO-#PC* zQ7JhkVl7MRp9jeaPX=4}bXca%oQK&nryy@^76yBo@zgK>AL?s5IN~3RMawS2jOkPC z!x_t#EHizpJ?Xb^+eSSdhm|XqW74DvXlX9tAmlIPZ6%JLIF2srk^Ant7dctU*z(bb zC_P(hmD<2U_45#I;-xSNY4Ll>uH9PjB+{i0U_ptxAJH9Q`7odEb%bS%M=TcRb@*P1 zaYP9WwsuI-mN$gS5Zs#%wmO}sa`0DC$4{Ct!TZW5gn;{j0O>_>b~<@>nu5{u6t74X ztL72Jt-|0?aOPP39aDk4wGZ=mclF@N(Nc5|Mj&hSSZv?94bQ*y2W;K`k-c~KzyP=ArlO_t6-tZni-m%dZjp#F(>)v@A=VIO;;G-gC^sK`vox$WR zphbD45REqBZsk1Q4+aNp3w4g4JY%m7b@gZy3VrXl%Jv%8H>0)sw7p&XFApIhF_y*q z5f>Xtha!PE$T+$Jv^}Raoy<53#MeINPbI7cnOZQ{E1cLaHiBjrZvi5rzW_(kB&DR$ ziV}2kvg8D~jQQ*p6}QT$lgk0%p(j_jQ||iEgBB@iv6y`+jp;IwwnCeL-B=J8 z!V3GGoCm3W=eO$jIC=lx2PE6-m#*;G5*E)$t6%l0A4zu91{53eMYCfey$;vpljZEq z2S$bP6jZlzNn_|auImUx-s)FAfl+qhB6&~&!4U6lY-M@8E|oQTB3}C9SYk>#vT0O% zdq$zV8>pzM$54zGiN@GM#`y~to5MM4)?Cb+zW`IGPNjj2!$qqvLD9Ggm@;j;EjrXY zz)||ToeT-_(su^LQ#l2C>>|8dv<)jOu|<(fYW`20dYvUht7_Z14W0AAT z_!Bx%inP3hYk7HZ<>V-i(j%iD96fdznHjm5zTiSM_2_Yp*guHc>XSIUe*^aJ-Gn1Y z_Mo<=%4YXAZd{K&2M%HEm`rTiyq1H+deRbaufFQjrE5Q2Z!qRAUd$1Btkvr>CyE?N z?P}*Clm%Ufbh`|PaUNV&6_gg*lQ0OjEltBkke9#H) zOhn9pi6Mq1GXwzKu&I78cRtgMXl4%;v=L`G28w{VXd1+(LNsL{LYX&~N-2q>wX%{@ zZ2a&8y!PrVNKQ_|ZTH;63ZgKZqoAcrSJ*p^Z@se~6-`YX)#cGJlTNZE4$(FuVkL%a zh>_|PFQjmM>Q^aZfN*nxQ05WApn_m0Rq#=ZQDJ4(iRBEb)1<`3ps}VJYu|YjZ@>Kx zrq7y&haY{+=#GhrLdCfXyz%1OSo_8Xtb27G8f%-ZQMIt-)R~j^{%Kt`1>9SFkPBiLjt{(XDdpEW@d7`?hV}h~Gc?8J=A$ z3ac+(jpv?z4j;XVaiY|UNAjcIO*{Q^#Jqg8{d*YGu*sax;@k7{rPgle|{!horjf;rTJN3 zk_+oH`5|1NdL@mDWJblSK9w0ouf#`%-mXR?>6X82yP~O`l~wo{TmdF5n_2Kf<;|(* zouZ|`go7T>3Z_0{qgu1Zj>GbcR%6-)({S7Ex8a_9@5O!h-iN#Iz6)tKJJOF!D3gm9 z%%_o_h2_haV9vZLh>wrsNH-hPrcA}0S#vOV-aK5mY8g^eGO+ZbOOQ8l91@a~p%0RD zboS7&c46H3@mR59C5j63alwp9_O&>Did5~by$`fnS}Vx)YSOf6laZVdM?EARpzT9_ zN?bdOHMO)-KD!aA9sDR)_Fg#I9=5Q~!+ho0*~5QKHksyOvpM{^p;jKrlsj%ZRNBf2 ziukNZ3oH}B6_2BMR(p1KHRIJ+erJnAKljk1wg-hq`%zJYICl~LQfJiDA} zX2NmvzHDR)e?y&okgW6CWSNJ_DDzprvT{n-waU1W*IDrf!Rirjbm#mM{b5;8mwuqG zqD(0eycHK;)G#6M9HMk5@w5znFDF(w{a?YLs?ty~n1`$mN~NR*^~Q7XI-3zEaO+SE zLSW=jydz}<^LM^Nk@qaztdlWFftV4Oaj-NJ%_H=j6&!hwSN-}4S2e7z6(1^d!`15a zg)~wqJsh3w*TwX$I^yEf{H%(eI%((G zraS3fh(A%0?7;L&6|`E}o{cg{Z7C0%k+?X%YG>V;Vl*BKp0}gZV?`NUPDHA{iQG-N z`fhh!Sp{Br@=xRk@YrKtLM%s?h>gMnU;Z*4c<^g@^r7$Kp@+YPxr>$=U*uF7Z&{s; zj$YlGK642kf8w(ooOWZvq?x$so<}hGf;lvDQt*zSk5FJT8V2#fg7HB7be{0f@Rq!) zj8FRp21{*B`ds7!gUO$+GcvO56*avpZ_jlpM_S3P*QfN}raq>UoRVT6x)2^Q39+cF zZ6tpwZ_2J8X+oq%h0a4EB%Yh1U}x4d%szegOK%>C@1((SCVpC!rT5-7>IoO~$d}W1 zd;58)EX|(56m2&4CI03F@>0)Vi3-cgxQbTsS#_u_HGN6^SfA)MXP5BxB`;Gb(Glq4 z$WAjnqr?-519?KSXxzkq;wgSI$XF;S-Q~o2D}!ML6ttjBCnBUiqI7NCp)DkJ7LK9f zv_37qS>ND2;fXIY`kJEdBTo9Zw6I|ftk>Jv(j}APv#Peby)7jRidMW9=cugV$SO2& z7^1@-MPr+npGRl+6kd4#8NB)W%eJ6&f- z|A?!uyxwG2GTAZEM~5eoye1u^qM^^GjvHTyhaY(apSkx7$ji+|Ma5~Wm(pT5C>V{7 zjGY}f;Yh5=OV1|R@_UneqgPIz+c4{QjMH_<2ZyVCBk4}7&I*zu{hVuRQw4{qnKBK^ zta9F~AM=`L!BkNH_r53`9Z%)f`Tq*`OxjkrGSg`a>Ps)af|xk1Obn1>X;;jS_z05% z!g%Y1hVjbhd7VI}2~oT9d;Qn6mNA#tQW%OgubB77k^p9S4n)Y(?Z1PxVD<5A(~B&u z)r|Tm#pX>L(bP~c&Y-rk%BEV+oIZiF(QV^a2I_e^b0%tXV)%BE>K#CVFD1q6P;2diR@?tgFV>0caM40 zwH4L&9pl!f8jkFm&^yqBcCT7u&l3bdu`V2YHrwzbU7&B3w52XXq; zDb&@}qMZgLDLo0LrDtq9I3+$BX=%|&$|3H_5vZyt#o5!R4R%sy8hY6wj~qT~@TSa| zf}GK5=p=1fnaL<9%Au1HfvsD%n36ZAk3#ME@-SQ+PswWk02R7gj`+#|sCmK;sS=`5 z?cqgKUTkuu%_~NEo9I#DE^- zh8BzovXxVsr>j0e)ki(V7#m6Rr@ZbEdz?N5B0PncEoNd_qb7hSII2tca!Le2L3yMj zj4s~DvDCF*HG4`S6mNxWs_oJo0gSw+18KkA6yb9&iEe&++Iy>Zm0mTGD;~f6zYsA{i_!%13>Z_WF-x{wdhAdo!Aw+MPb}L4k7PED;Ya!VmIAdQ5F0 zC&}X#oYy|Xp&2!mcjGqf*!5FfzMt>;x)MSFQ& zhaf_jO0_y9e@rvIME+{9bJ40*m^fja&6a#p7{!7daO!!Pwt0LHpa1;lk(i=QF$B~y z2tEbND^v}NQia2YiuZmF8Kb;bY&freBRYk!!}ED%%t-TEYDv%al*tqw?@gH~Ey%Ag zU`?Gi&A!Cc&k>E3fu_P%%=4O~x8yD2YClM1kTVYI&X(tlSEA=A@lS^`~e zEpXGTG^%ls_(yXjo0^e^F}d{E=gh~6Bge3J-(DMe`KVrkD#aR}y{yr~Kee}THX3;7 zTHnRZ9X;B3sm>g&SAl4F+FBZLmi!i{;}hd;n?&s-q!F40;w;12-rP#XqP@!Km@r*V zi#`#^3hcuRY5J&uSq5#Fbfkk+i;P zytEILi8a8#{IwX>ZWGr|%-1yobJj#VJ@ypqg| zR*j(at!h0#)>pw4M2&Ju);K1#axAF-G$1{`mVzThb1HbmdVx zGYX*P4<9RteoZY~T);!MyJXo$uFS8psyWmj_O7C}$Fzx~Vi*rwI^h|iIYVy67&QF)kgoLyRch#Y{7(%*6g41QPNwi0j z{6h5DBOTIWw!!jwUJvRAUS4HG{-_?$uN+EqT)ZwXXAU*XsI2i!<^7-0s(9&5<+Def zyqDhl_CNk3)?B{Y_53FUGtx40Yy!OX=9_r*kw+1qoFOeD*bLs#LRgjfy(I()N|7^` zk$;30)6@A3t#v=jSxp%Bu>Jmtp?SB zcWm2+AOGav(QVHIL-@SlVJj91PuE_9<6_Sosh})|5n4s5ZwVI`6|$4&;m+Idz|3ir zITAdFr=NTs?|$$aI(jK+Qf5+mgr_Qm=lOxLR+mk;lF!L>DsH>&ZY)~7fJQo&l?@?| z9X~E6o=EiJt4}UZzsO?)vutOoyuVnUka&SOR;xxjsGIm>v6b-wW`t|m3o9Jz{0|Oq-SQ* zySxZDT)oCtQh)Ee|Aup=XYFfd#!ur0c|dqtXma=cU&Nf*RQ_$PC@L7kkyfH4va{$_E+1exH=PqDQiZk4O3E*F>&HVn-%D^uQDm445Q1A92w2BTz~BvOd4N| zUE8~mVZA=BYjg`|888}FO_`1wlEPp;nqp?U z_@;8M9JN|nTOSe!lLKMR@}i&D);EZg43!xy87{WJIiJj|{w6xqf0SQ}L!<9V8vRkM zQuyct7&cW-7;0yIPkEF^(JWwkf$$6`9=4E@{jZ-e%|Vddn7lY_;T*P)%Bx=CY%3?ARHf=&gUb4;*2T6d{MYur& zSliipCDx%0c$8Q8<&Q4J-+k@xsVgJ#^fND@uwcAx7_?*SLA>_X)0E+E9+EBfC(0h7 z5nHcC_a+-ID`7qMD1||N-Dl<`8?O7rGX>FZI5{hfb}#ErUwA0D@yqf%J#uQjf9uSC z!l1mO+fKqSz)ctG+pSZAGDi&cbk*g;Gf}|qWcut-zy?kva7>o|ZG8txb5~Q|G zFsba=__1-(m@sLAeJo=3%$b-temp(jR0_c;tY5zlE$yww8w(+d;;r%6gR{-sUe}^) z>5?UwFkw8s=V-?_A%UaHWb!-_Z@&H-s`N=ujYe5cdmd}YsX-bceIwQsI@?X{psg9@ zuvj}=Wjq+K9jR7RSXV4thKb|G+gFmt=H?=mJUX~{^aw@}rEOX~w_n^MI z0!NM>Wh6&6?d_OYT!alDtsgd6&M(npgxOhgXfmcV`KU(?-925VEPOguh^Zqx{clA_;pL%xAwP6BelV_~ zsR2ihA4hp*H7aWxP+ePxvg#TnBqXv=X)kM+FELSd2>vjRys(is(+p+Zt8ei}w3|#Z zPJLEe)TX9o+6uErZi*eu-fs7y& ze7eCAav|TWKiCxmFGRcObzUjXbz5(H8x9}P9toRqc;8O!*|i;q4(`SNeLJvg=T;o0 zq1>}~3-<5b#<=a+yJxG(;=!GJaP;6I967ijd-rX_A;z6KeH?pt@5Jeor%+v4fr<)! zPLk)cQhU23g~nC-qo%5cd`(6o`%Xtk2Vw8C?`^kJZ=E=zSN{$e+%qRjYz>6oQaO6$ z7*3r!NyB{zr;i`Nq5V54@4IoBIJDF05!IqyG#S0*qdmF^_+c|c0nG~1&34UX+brei(PJ@r>SQ`0>B!B=wAsw$)Fh8*ppKv(@O=JGI;9j@**UoBQ`d2Xo{h^dyA+pRvdT7fx^UG()RZ5@(G#aw zo=%;>1T^dCL48{KIB07Ioh4%_DXF%eM7GZ4g&{02bVpd={Y~4Orl+Sv8)1dP`6MTm zH4=u(dR-B=2vCk#Q&XdI25?98r}bggL* zO|%naot&LbaaN&f;$ciuAu1!q*gK+P5Tleo6axEMxgdWK1WV~sCfZ0q<+Yf{8N%FR z1`VIedwo=_jMG-1+Vi=WidFBZYSBS+bE6p$DO4+CxB&^tnYjDjhw#v2U&Z|oe-RhV znvY(Nb~x5Ua^ZBWy6V$f$1_Zen5*4}x~cH>U05yjQM^VPrKN{>&4y+Nk^m}LevYDS zl^^j|o!&9zXh>=KGWpYobVEQLwM-pkQnM{5fWQad_{Yb)ts#dLNC?KzyFX^~ZQbRw?2 z>K=|#zKWY}xd-DXPp9`AgRI9FxP&<3t-XN(_{|@l#;597N!|4E>DsTb15kYgYtUR zzQTnsT=F39Q?8CnKIZ%V``CKX~QNj+&O`S(o9$ zy8Ee|Rk!I8X3;8m@k$0dCN>_Kqw|rLHQJ1@zRH))dutc91K~>+2S-uiN5&vFF&R;G zf;5$F?P`2+IT5a+-E^3S^csPYei?gaW}EhKgj$FCnikYnH=?$xo`$u?_M)z;s6>rq1oM<4lVtZPIom9%t&UV&8G_R^oy z#zy*V><4S#$6If{!9m2^c;Wfyuy*ZQ`&ympK;qNW-HVonHrCsP?q0SJby916BN}R} z7+;5$#(Kl8n)OwcRkt6t4G*Gs+;ZJ8r3*w{t5EVH=X!6t0|w@ShwHE7-~jiU^djrfN12L$pgc;Rt=nhBBadDv8@lnr6H zN9{!Fr?_@{pql>FPDwiAC`kI?yYN+Gs8a~OB|QUk zR$PLA{@%B7_bt~@cvwdG@sP8iO&~M^9Zhdh(~ezT?PzJLMP+HZD?$bvDOgZF{7=TK z0TkSmb^3JJM@!gy3o z@wqR24%glIDU6#o3txER5nOi7rTEA1eiy|YacV@Opl8I|-c=(u!PJzSUe%JJuBs|A zArh`G;KECWiZm-$Lc`xkXV&wZDDtz{rmj0U0`KbXBn)*#@{}X!OnTFL{-%2tHzg_| zjf+pjop;}eWh-W4;ljCi;_)vdzn}>BJ@^IOcE`>5%;z4&$_p=YS+Tk_^6E!Ra}!6V z&8(BgTJQ)^&-=O~A@auEOfeZ@`6@TuEnQihJ~`On+4BS_dFQ zu09Y)!`w~W^uDw@dmEj&F=MmYW^~x3n5i)JWh`>hcq}lQMm~7x80s6_X?#Xw?t+D+ zsn3q;#tyV~c6oa<*zRs-ROB(Tu-b`0%uw3d`=id{vx4DD=F@Mn;C)U!75{t`p&1VK zjc{}?dPJY%=FFaj;-X?I%K`QQz13hgnT}p36-2ZxY9ms#dun6K3l*UDR4_dFbH~8@ zUMN$-&%U9}pZMad^jVh5E-Hpj3}FZ-X0}89RZfs(XzYZUc;Y)hz`y+P$5?ggWysE( zgl~TP`)sQMli%bN_T{T?!vmjvg8ku6Joc4u;tP*{*}m^=3-E}S=AT5XWJ`ofR)ni? z6K_o7qhgUWw#Z~vd=l+(@o9upMEr;&kj;0PWp<*s*Ib_U%7{Z9Dej z!;e13rp?>Y+@b}CT1Q|_%zuubR%fSY<)diARHE#&1=?raJ{&@iM2B8=6z(ERGkD6Q zej7SRVPDo-32ShJ>-}FrJYi)Xta3*}QDJ+kZTneXpLUh88yt#4YI>T@vglExW(4(` zn2<0hn`f2RHnxdut6T253y(kk5We~MU&oKwrsJkeL_$&qF1qm3_|CWg4HG9$u=W?O znn{wrdgF~Zuxs}o)X@>rb8X2@bJGEwJadwehCDHL5{9)4`+&~c(<00#{wa&(G3dSqCt$JV z6Ylz4tIOpl2gg1LR=JEZfxB>foGAeYuS`W0CuGBlJ)a?GX)@{(St1go`JtS;_d|KT z90?*^d$y)%(Lv^lk6yo{$=p^>@P(gNaCg&iVt}JVc8;{<6#HacGe<;5heI=Xdf!;a zrjcp=^mz0fPSY9V^K(&t_6XCutS%L?Q3{o$UbvTsr0qm&tIJVWQ-#v9b5yKNR50Qb z0UNH4lW4Z;6dlAXgLMQ3DNE7X%<}RKTQ~~srUB}t@zYdCPnQgLyeWK@5WFaD*EraV z1N#qAc(uWPBES*m>(4)pXP$Y6bVVRFHI<4tpp_{27mgy>d1B1-t|&W=s>(AQ8I%lr zgx0Hd(!m%h?vTIYt(Nq?GV*b#3#K5qz{v%rlue#C(Al$zg`W}tbh=g5+^-+ z>`+rv3w_LA(^@P-I<{g9M``+6Qg*IBiXQ}4C`X{Bsfjpi<*MF8_5~K2z3AtmotuoW z#5MG2#ka)^R$|VKg_t>Y39h{Sdd!)#5Eox`IpqUbMZ^2GZ+sh{ee{d?{1+d^BcFQ! zciedwl2TIWnWy3Y2Oq(j>#oL%izD}6EJV#eAgkwQ-EDxiEdZo9=vae+i{8Mxch;J2>((VXw85{Vs!pg z{M|o%2jeD8!38rH;hxVvf?ICC8;?HvIKJ|=uVccLDJY&i7oYv&S8(6M599NXJ&rFu z@fEC~!x^sD7Y+%jnYiw@dra=`yZ3&4@k@{6?)yHAoG}IH>=__mIcnxWjRR-)SB>uV zilEwsd?s!-TR_7-YyJv+>8oEyeo>L9^HB4fkv48fej;pisuLE4YFES-S+gQMB>yCEz1mUJ@r`amBa&9Db1OOOBv$dzCc|FD#%P)K- zOX}y|5A`@l*OtbgmFL-Jb&cl+)`H=ovIHjwR$%|HAZhiA3=lyFjS=8Ke6||+XRvto z&B_0o(2!9Iir0u#Vx&>A8T|keFQdbW79$meu(Bw9 z)W|z7D9E#CE?qRF6=fwjaqJk%t7^!6wSFK0{0sTuqi5Bt;DTqW(FpK((Kc!FWcw_h zz7Eyf-Gvw|$KFIw29OdQaoo7&A9XNSDV`E zOh)N*j`j7m$jQpK*F$QmPT|~{J=pNk+wA;4dZYju{x;%bXB$l;K4D@ZViRK7PQBRp z;Rc(A*C!~ojzD$D@Yo2Hj*+IfyL&s)-Q9umlH=%TsYFfr5#lYQZKx6_A>(+f{DK9u zaMP!*LPlBw9jhL5b~Lpr=b^EwmR>(cHJK^I^%NQ!>hRHq^)}O>5#7w$lX3RcS=*uQ z@Ui38$!5%$L0aADxZ~kQQ1vAyB-%$5WRql+Cv)U|?(Dfhe!P=wPil>;3_mhX9a!xj z8y$=B##idxZU^Z4QTY}Nq zS@wKBlv_=0o9b1Sfuc9ZK@`h4s2;*sy3$n6bc$spH-bkdB0&@yzPu90Sc-XE(W!7t zQv)*D4-OsNjSoNk5DVu|V_&5Lq(u`wl9A~6QTTY*`*`}fKVa|feeBmMOp{I$x>CgA zAK|MWqk%X4C+FSX@*pDm2u3kS#QHLu?R(C`G4aWmG;In-j~R`5a~ERXtclpN<#oLF z=JQBSOTmQ~t)gK`L&3y+RMZ{gi0}8PX>P>rcioN5>>Sn+jEdO5#^mSG$W-B_SAUK7 z-g^-fCr!fV9(n``9872wpOlu1jGS@AL-z@oK4%${Xx#hA-}LN!%$&0v?H&EpH+o&P zi-vzRX3SfKxeJ#gk@$Bh&R4wg#34g35vvg4Ab7VAM*YZDr3Do|fd=fCVY>Z(goUt5V@eN0;HW?KrH{txsGV)WS2 zm@rvi^GifxQl_mZYHhAFJ*9WcC7;qCat1XEAg5S^u*%93w6)YT9}P7-U3ZTGHyky! zZ+IKYBXldy50^7{%KTpZIp3KH%j&Ey6_z!bQHq@z!Qkb>I|cGXuo>yF#2W!P4;#jZ z4vs-0aP`k{v8EnXslws>pAZatW!6vAe9A0kqkb;1LRhs5IileX7!P&8|7DbU=|Upp zok3!#!&fG+D=h1T=}@BT9U;UE$oUT7^Jh?W%g!ia({4LyX{j`#sZ_}RWtraY9ve9* zsKHf0jjolsdhWG*&mnBuxSgFonZ_oa0-$Fp9f%_=DK5{iXO9#b3W-)OCdO-FS1i-$ z{nBV^XDVwB;mKgL0K(nq2x+$@2B%MShWzT}=vl9QCD3pUQ90;YjP?p{Xl$eqYVU29 zv38}>h#Ej^Ycrny^V3+nZY{=+9gDo;V%+ul&mkc;3jgurpEA8&4MLnK5bRKLjx-Y0 zD_wn5v^^bdXl!VqC)z=;U5ZMt^yqoIMpHu6k+tWS?2PU`j>MUvAVTtJW69^d(S_to z9F1W&sw---YsXHG{37j{w6!7gN@;VDh>tdJ!0(>?1Dfc47mpi{dpWA8s;b0JD%KRu z3W!(y5i3*r3i`^_l<||$R#S;nCyv-OtTj6ipC0E0n@S2;PSG>Z{n_3l-M4Ks-hAp0 zcswfqP7?!>Qu^$Rr7saQ0BwmsL}y=R{-$m#9tzzZ)uPX)IOOP06MzK=JnsIJ!X||aHS4dhAr_rtR)?`D9hy00;i$_Lk zn$1e+QAggGTsE5=6ZgnvfHgCqHn8bv2DPU~?V+&|{WkS&*ad<2p*JtShhDmjxnxf8 z6jZ|do|m`2%0th=V-gdPniPu|_O19BI%bsnA$km2u;?3@czr4_<1YBZM}}FlA@tQO zqC>BY$wAP)cwi$5%2cGDyYnZx(`!zq)L70IUm9$k2e5D7F09|Q1yMuMSpUwO_{$5= zqpGGFeNuK*Kn)cY*!a;FoS}2|!e9Q37ApI5baIazKE`?+j@nDSw}bU7gfcBmZDxdh zL60otJjPItgkx8Ct9@TOJ|PB4DRFepyD)}^^!SO>`1vpX3%hsk<#3TSQMq+%qrh1&-u?^cdt;4(TzKQ&TLW~);cH+2C;aoj z{u93bt#2W7bRMq0=4O23AO68$%v!J#4?p^OEL=4YGp0^MVev##oTVtehY8tE6|q9A?z{`z(J!|(ry zGbLr1J8w3oOfRGZpJvAD?tAY+T82M@QeA2<>Eu4PjjBF(<^)b1-)En79q1!&0X~kq z^s4JzZ|Cq#d?|ZEA(Vf&O`_5Ji1O+>lnaw*^3L=5y{{9nPSQG+-#teE%uZzEq_3lpk;N62clL-CHF=ka{% zAkHAW590p%+D;ayyn1KNpDT!Yo^JH;a2%9R#4v%Ng@f?3=~HS*JrjwKi$!8$l6_=D z&mF=&ait)feeC+0TjJ$ici(}>zx;VNc$0llMCn?Xqp3Yj;VF+sG!djt3aFVzT*^C^ zc&4T#vrcUpNnz1wMuZSYUo7Uhn?P8{(3ueoqE*itrNAY;^;)RH5uH7|O-MjWS|$y4 zvhC+AeDqvR&;2w7-PGNM2#((V?jOF6&)jndYU?X7dG2(~o<0#d9Bn-Cz~?Yw(iG;k zn#@4UK*%%gqXUqfl7_VOT#Ol0j8ReX9C-TG>9l#gY{(*$MBbagU;*Za~q50(|N5 zFJi&0nW(9+7cy4ASS2Og(%6hPc6{-&lla?~iezPPD0`&Ol{*EW_gXn#cIp&<^UGgh z_rAku=pr7GN%Y(c=>Ta|-ixa8YCQ9&XR&VGM>ur+1TMbx8XA!}^wN>}cXd1|{KT3(kY8p*_fQLVaR(~5&KH`aF zRj4wTMe)-6OmLXu;Mu%-BgUU;J6~nUC=0|pW)w%+EFHzTQSq_pqyZbn`f1N>x?hK6 z)1FVODlJGdI@ubMamg*)N3y4WD4tQ84I?dt(^?NrrOUap(Jsqr4wogZziPvk_~>LL z$7bQqyY6ROOh9&8f%T96NGed4(^gzPl)IVJFQR;pV_gv(efOX+FOP1MZXlWgV($Xq4x3wcX zZ!AaTD`~8=uzBmp96cxF-p|~LL&x@GHv7foNz>Usrcw9Qp{KQlO%-V$s=02>ML4); zBi?-PO(dozt>uDZzrfdYrv>uL_&Dhh4(Q*7)A>F4I{gs-p%DyaKoy1Q&JS{k`NC@j^*8ZB!JHPR z880mZ%QHX!+r45GZT--cu?Qg>)F;d^E5`M%Ik+BShuO5S(oYDgmH9$K*Zgl3S@pb@9$*UUVnTvQj+43%#rE-y}Qv!?^ST^V+IQ8?pKnkfELrf;F-4vXG{%(%c-K!qQkzjI40`Zmc@|E0%FL6De zCu$5ejuyv+K^y9mY96EPxu!M%Nl%MGT1u>qDC=r#?DL44BDTQ%+84L<=uy1)#%tKV zc_UtW{?B;s&ws#)-Fxuv3ol~h2kTIJ_OyAOf-a>U*00^v^kI$h6N^w-RA3*dPomOw z#prEi3xXKLRda|)zm-=S`KGheDB1??{pgPNW;z+w$jQzkUlM8j^LXEgZYp!F#5G00 za)UkXSohZR*!l5BoH)D-e|qwlC^>!*zx(Ac@X|9+;m?2kEj}Xtk`V=0&=EGRcZeRj z7N}{%7ftUcCM3B$2KX6#=J)B-A4fXU6`}tay;~R-@u)B-)07S{P<~j z=+VdV#1mh^sWas$7+ZkLFIjE|GA%U|4?p~QJo3P@u_QX!@YOhgu=0-3D-@F zwW*X5m7Y4F7S3p2Z^@$`5A<`CAIDLbRy!-N@Kk5l*=2+DiKmnqTa!SX1z96z$%tgX zjqT@o*ok>o`LHkQ-bfacc%e9zQ&5Mua;#TD%0TVqZN?<)f4&w%GHS3GXJ^Js8qLu2 zUT-i^GHh>at?$r20o0t<9<~@!^btRaw5Ge|a7sokP5njf!Fsi@NqJPW^?%BP(?mSk zzJ@>Xv6ZmIS9l12O~DF}h^Sbsx#AkknWJqlfp2{8?=gFR5ng%q_h@ZuBF>{wG;Rv6 zTC)b1Uc3T7{Qi&enY%xWg8UTJHCEUtUN8xe)aZ(|3QyK+Gz7ddUBqA1U?iqYnU2Vq zc#MjUM)sIoz1?GrxwHe}@BZ*d{OrGeiq~F$4HL&t#_hM(Z>78GjiluJpC$JvL0u5PGat_;`ZNb~=7ffZt3}NEbafqS8*H*;4 zcWL>h@8nbJWEqa}Pos9{BJ_zI4ZfqwzC=Vusln=G5WS+$gUSeVb`=mZF zGl-0=Or)o$AtPfn8mR|tb0YKTn3sL1t*I7UHoT7`2lrBD+BhmchV>u3L1$wJ-hcBA zy!HOu*tCAD&Df}31r3%on9p43^&Nv1@XlcHr!_%lc=@xL2jOh>cwIK7&v@w- zIf>FEAx57RoDxB2E&=l3mHu^b;)J8q?0K94PEaTeVICoD2A+}XsH#JG^b5=C%F8h~ z2@BzvqBCXWc`e=2oH_k{U1)D^Kv#Ps6=eq%{3smUy8}=E=_&i%rtPXFxcZT4dTnU$ z&X2Ki{rlLlWh<(y>MdR{>oonkZL0~lF(jxXWXqN=hYXdBh9y7g_`9(I~qG&WSA zt*s6uJXTj6aW%)QMt(owwV^bzt9%1X|mrM?ao<>zciq?lNa z`k3wTzWr$J@OKG)!JnR`c9EWU@cf^j!pqP71&0qDvQc>HnN!%X_I>QzwUZsVRYGU{ zw)%P9+SZEtnmXp~v1fXPMdL6!D@%=Td=rVnML`(G#iww@btk>-Hslo+;qF_mNBPkm z_{(#DKzw2nF1lznYN|`n*xZEAKX@089@|BS?04iz8^#pTff-kX*Is+kW@09d&!Q9b z8@%)8>$a1UXjceMcGe-;(wYo)z^2*;GemlKT%Aw|ihgxOQ-HkJ>sk6Fqj+NqoN-bw z_9lTr_WvVOU+%Pq234|chSd({X1ruAR8F>Xn~Ff`k^{S!LL$FRLGT>nCD`Jlt_4Rj zW_?X{Nih>XsS6wk=BL7xY#S`rMGVX^E5A7;y!Wk28AQH*!h>g}ieZXV&|@7|Z*@md zaD=O=S<1UK&;Li-e*o%rlz0C4b9?W--z({=cggCqC3lK37%-+|NJ0s)KsF>HK$hK2 zmSmSCKp>$d5J(6K%^2e<$*NZG{Yv-h_TGE{e?QN>uk38h{(nj4z2}}bXXcrwKXYd0 zz_*lHSy^Vc8td&RKl`Pn%IH4ztDnh8|57w&21AVHK&$=mU;aT(bCUH9-m6wVMvVw~hAd=QPwG{LFEbrr^uhK!th9Fg)JeNicilgcI?&f{r_Y|X9XmEjO$^zwBZn1; zgs-g)@>*_WN>O*EEnK$KwrtobCqG@fXhczFr`^1HOHO{jV3q!WP?7Y?UdmS*6mLJ0 z1WqD+6!b50CcKGIM4eGR;Jo0*cg{LGS^Bffdo9Z68EXBWrDJQn?X+qc+I_gU9&dS9(UK zf+NXkMWvjn#XgXhX|M29Fjv7YAs;l2Ey#&C(C)StzaMxG*ul9w3BaW-JjFg7zijk%rhKf~j!yn{$;n9t2rsMFklf4EHCH-H zROrBX0+47!0`LJq5k}V?C>_(3Xc_wN4fAH{UsQ-ZMRuONk)F$+h#C`zk4?uY7=!>N z%ZS0|R&C8~K7stu;bV6C;uSl8>6%SWhbTJCfeng=cdK-3kBv)dN^x?Zg%u`cgm^E< zhdMx*N4=^`==OQZZEb^6^nKRS)MCevo$@FEMa{7*Sva>9B=1IFd}rZOgHnEEy0p6vLbGJa79!=o)=jnD_@VIIi=_p}3` zoi=h71OrCqz@bC-{GL7DQ_1TMuv4ZcUZT){Gp*?Dg1pZZ$O4qMn?st#wXgv%Qt)h zk8^S)jvl)pgFdVZ;9+PP94zn<_#Qq~LnRZLSvhu75fy`gqJzIM4Sb$Y7sI(iO9nLg zrv_aC3h%-N5rPWy?n4YN?fEU1m#_p`{}qgSU}gjPzf7?j{S-no+pp7&>> z<*QuE^g2CnkbC6B*XtJ87`hcQNSBB%S8PyJXCc)z{-z3;V8 zeBxuacGUv=@xRFNZEdy}5AU_AMK$)R-}$tCxukG{)3@SE?p4Qngx z%7w%JUHPT8HMVZm5-TdmkfE*@?Z7rkN%?+36!DG;p zJ)e|CZ#FA%_?Msj*y`$}XBA+u0%S&3mW+3k;Ovk*E5OkMR7W|y4(d}odL&oFqmpUH z^ynt=@in>e38r76QmNtt69L&LO3IX7OmmwvlV90W&}+rd_Z zo8G+8J|%ZRbU&Ie*sah$Qpm>jsM8x{&-q^!xs36gKO4&Ay7%+}gB#}XOsHP6CLB;# zqzWB}b9BM&>$l7Lx9RqZW6Tjgb^4?oJ9b<;Ct0^bMHCV>l((7O4H5TV_CP|u0A!Ro zLL)-R?tWZUh zqJRgygtoFLV!>c0_&UGyKH~We553kZ%F7iAh&9T^yDQ=OwDzi@G+7JdEu@Vl>(yzZ#XB>Bxs+Un&A=aj2r@J_L>Lp6P|J{ zF(Jho8awRZOXpR~e~-uUd2{aJ(ia zWeKL7;4$i7o+71f+qMY*Nj5wE;FA>qDUi0rr{!~F<9q82dDye}S=l01L$vgL{QmoHtcJ2K2tl)`6P{zax`jFXa5WGLl)4-UBgT2Ql4G@q9)nYIfGj?P{X zP5IcbbQlg+T$~&yv2%QUvdT)dB<(YD@+~eg-4c^CCI8u~D%FzGr7v_XE>`*C#Gm5z z(XmmFq8C)xNcYUzK;M9!Jax(XhNcv3g;$OkN7_Q0_>MuaJ<;|AqkY?ckWbgSPutkS zy{O*fUNldT74U@|hwA}v?tn%TdHf!Gl@%Ns$s_kd7B4$m9@o8m{U|S9LBf{Jn{DNa zWzrL2px*zT+ihZKJ<}~SXcc8E0ZBw zyJD$#OBWSa*-xL@V-xdyS%l9tieU2C_>vL>gjB10YOwE=_Oxe0*Asp6 z@qC8x%$Wn$Sbxp_@DG097B5;PMx2pxtg;{c^a-0z&9?lM6ib!jeBqg=>^tB2ri`N$ z8SMZ8A{GSjs6%^NJu5@|_TTuZWz3D+)JU5>^6={{M@EC_Aw9j&_8mSi*fDV062pL= zF~Ns^1vv?NewM*Zf|K`dLXaivczkr!;!&c)8S8xw_V(K0gD=?RSf{=3J@2rZ>S~{o zcJay$Yaf}D1Cnce2U=LS-};UB+LR*T@LmdL?5&oclWi;;IWRb8dk>wkw46ek?a$GL8jM4n4f)#BW+?)lX`lZ6Px*KP9ILGCVtf3z z-tGJmpPXQM8CjMhVINhL^p(H*8(Y0;i!EJL<=^II@Eh}xM}~&%7f(E;{2BJTM_wld zGiE7zo{`&(YJTClXYCh1`HAWh4+=K$k2jnoC+ow%^#ObFz+uTttS@3QIo@yMgT401 z>+e^?$9!N6tFmDrg90JqkF|gP$xp3)XwrV`-ESAq1?QGo0)O@G@7lI4n{D%kwIEK{ zgF}k~^2))Z5XhW&2GQ^!>$>yai-_D62q5a*m6pzla#^3-)sCJGP9zOcamr1ktW0PN z>+0#ZAO85~ws^&Id*f^G7mrPOkIW%C>n|QUV()q1d#t=5&*tTTfCujhpvwe8^I!CH z#jhW;Lx?xrFleI(hN(!r>-G8mGKxi|3qMt_(C{JPK=YGmP0cthkRO33U}cZgEq${ zy;$1Njnpxh=%3bPkrYOWkBt)zCpcfQ5*uQS{$$~(+sg{mgC{)(>^OB`7MnrVEDUfaHTgT3|5Z2e9Jezkj@kqFJYbK% z_no3gh-^=tId5Hq=#4o0_FsR^uE@b;wgmX{Ir}<@+6>wdZ6kVw3cQc~?x|K(Hm z_P4!J!Djfh@c*6MNc)R=F~m2&@pb!4jI<(C4_iYuzK;SH_C&oH&;Wq9JJKM|qt7`* zI0nKsK=(t>AK8Vhk;MIwFXWFhi>|6cF>#5u^Witx>+jobfBDD%-QM-+>ul4yTG4CP zDk_%Qr~lx8*wyA3Md~0}oodoPaNU{tp$!DUwuMAPU4{ zk8*@@h?wRRGVMJd|AgH*^1O}ox7tIm-D*|kjOxx*JJak(KT(t*1%OZ_NkL4Af!#>* z6I_fC_5~w^3*OtZxQ8yFXJiay*kLX)C(HB=$a`l{+PmL&pOxmO*|3EFdi{_cK66u1 zdWz-9*nR9HAGQxX{!Z)f>2X>DI|z^B9$b(TlG5!HfACrBlwcm*`87F`p>0}B@|v|BCBu3(79g_yj^e*IZBDB^zFeq%KEWFna{DV^V zk>I)xUPHHXpcZ*B!r&R>=vVc}HJD1T%w&U=AM^K-1d z?UvWcI0BaSWWW?lgt9o%m;UTe?E1B9-U|YNL2aU&a1vy+9T~!lV1lmTgm&=36CW%n z*nHZj+T-1nTu@@~eCx+N7u8iEMWZXniRwyF)X9J#0t6?TZty((9-W#rBZt#hw3DoH z-Swr??H&;Jx&-{Byu3UQEO=K-k;>@Tq5JLL4f47np^dtvQ`!-9bKntgy9#!lsvmeE zFJQ3`!4d7&rVHqv%-l-*)Mx+D=7!ttrGxve{zjd>{x$d7V{d(n9OX>WVcI&{TI`>H z_Dh?LNtZp5E<+cn9G?jw-bhpc1$@J!Bcj=`S14|m=muC^cM5jK=5t5-|j-Hkx;zUb(&qjvnn2?<`3kQRUpz@oItPU1KK0)Qb2ByRu=6CpU<^(x69 z;l6{U!1GT_@k%F5_1R#5pAF0C9((DuJo72u z2Ks=7Ddr<9N*WhaO!Dyqd7d+3@)=#5)iI-=X_xG*FDpt+!m@ra3`>osO6eEp<*3Y2 z?`rAn?6$oJjvL>SZEx?gveGgu%*nKUQf7&ah6T>sI0?sorhhmB3u?-(<;GR7OIk(n z&Dg-eu$V8#M|KnSvrOn1UwfJymq#w8KRsc2nR1$@6!lAqb6tUiWywQNmT_aQG|#cF zb&`xsRz|9Sv?C`Y!YNJE_-o@71(qu0kJ7H}tt=8MyWj$T(*45eO3#fE- zHmmM#>(ey^n9;eTBg1-jNY2E7jVe+Z8yT?SfnKK}gJWjZK1S*QObd{B{cqODuGQuN5SfB3ua*ttuWY~_j-_WkdD z$6`g(s3Az=#B zpTH5kvVGfTyMFVAM=P1xIgYn!@zc`U1>#rXjEG8@i>~YhI%lOYPo6#_qnKnH)~;4r zL?}T4o;-cpKPOsIUaDt8*Ex<2@`y}f98j9P1B)7zs8Pn)I)8BwNRT1v%7mzG#nSFEeM$8OwguvIHoS*~z8KZAo1_!)yl*}k-= zVB@1MI3hS^LUyLk1QtzNm<4(tT@t>m)Bnr<}( zIE4(yi#C6)$=-Dr?dMLwk+%vo362y+ztz~X6H+nj9N)y zxsT!|s;;hDXlvH26J&F~vKLbwmoHo4A99(T2;JcfsuG6PCU7eJdJCj6p|^~_w~J;f zg;u_N9*hp!mE&+Rx_758n$c7AI7SXorfu7}!4B^Ku|5CX(~{XCqw}yRH(B!BX(I!z zcH`O^`_aEVVP`L2v#U3*`v*sw>g(**%{ptme$DFZu33L~hqX2~Sl!jj*45r>?b08- z|8JKw%^rDgY`JB9on6w~!_seYR$h`NUD2rfm+kPr7wnhMNZw1TV@k58y7QyLo ztNlu^v^_y~Lz^+sh(olALD#+VoQ;!kfn)MVp9vdfV2nMBC(q|xhQkx~A@9rO0EgR1 z@@gNIA!bo**%Z3F>1}znblXTXn)bx;V~S8ts%5O!6*9PBN4iHyQ6_f)^yd|GMf>Qn zdoU41aZLFX=-!$B@Va02?zk0ECZ0mY{KvyXA$eWg)-#ngHFm41&azUH6^WM1Fs12M zqTrW-%F2^K6kAzwp)IVg@Ccx~yhMh*(rT(IqzFqS5cyV|pKFV2Dy*`s#HuSLINGWz zN~J9G<*{Y^^A%FkJLMe(YMOFvo%|(Pm zzuO8xa7UYkA&nROWd(UY<%;)@qr(%{(>*Ao*6R@_@8)JF6=|A0EftrSo#BSKNboXm zJ5feBEh!jh{aH$4yc=eYV`J#jG|QHOX7wc;58e}v4$AW$ny}>5bX&S|sa==wOv$6Y z|Ni^z*{7fKx#b|+m6d1=xDL0|j~nr}V$~XJxOv?YrRfTDax6&>%&2fOBqc(RCJ|Xl zagiG|7Jp%?S5{`46%^$9y5|MC+1|CEA?GS9o$Gm)oyk{oGAv#2GS8jsnNoOo%(=QA z7teQi2Yis%`7cWGky)=)DM6E?>4So40v)=+*P5?T$Ov%K)zTk-7(8_@y

du-#nHMUq$HSe}^x)gM?gAP%5GTJT8|g zWfJnno_|~?zi8>a$hqGLvPKGgiEObV+n|qEC@MxyWTaIV`T0uK#Y@+0<*Jodke?@* zr-CffU<#sYwacSJl|y8JeAAumb?E0xUuDq_HvE>XtZa9_SuXZwLt`YWg!dGErli|l zcik!Fe#O5yw`}1etEs564QtlgrK9`oX+NtiS*!*i#e9^_0$u+I#?BmBb@1Rrb57FFA=TlJP- zT54~3%iG<-Vpd6EVUhjbr$23pi7H3*e$PAKVf`KLav(R_JKp(bd-27+_WIYo$#Qd3 zz0A-2{%0&R3B1hPWAAu}HQu^rTeobtkA3u`cK-Y^d;IYa*s`UycBAg9-FNSU_O?gg zEFF(O+nH@4iRnJ>YY*FJ3tBUvGw!18?JPOd^mZ z`Q__)<-e_>JXW?15 zL!9XnSFu0fUA4bWHivGNKRhaKwGnob#>Z!U!RTl_t;QpyGj5^SXl`0j z+{8eSO%C<>HqqZ}BfUL}3|s7qJa+~|T&-)Aa9p;g8`oq^Qf=$z%>gD6hiMkB03w9s z8XmX515zIDvC&mMKR)ivMt5~nOS@gZUT?QrdaR>c(QRj^jCF@1%3foc(+L@$0eT1& zZ8p~5ltCY|Nf}fY!C){6E2S~5Y*ZfYw92K2V44rl4-Z>Md%G0xO>1iHw4Q+xYwb{k z+u3b%V-qrOEn-u)hiWcZDoXz zDON5gq*zM1oajgbIwCmFow;TE_FS2k}EA|XVp)a#CIq?~3iB=)Qy=L`Nd;RMl&^+HR#}m! zyz`bXCnP5`MGDs}GYh=W$S4)quALj@T+gWOv*J6mwA6Sh<{DdGlj}W4+qN#Y+zbXq zjtQ=5j}qhJW-LyIxu~>IGLT`5sxmAiRc)Ys!V}zyyt;F*Yq8S5v==9jW;$;`5#ci& zhMo_X?^n={ThIvHL?glQY%omZr7mXGOpeD`YBB@75-dRh($K)DWM|M?TRN<_tKXI? za9OGVXH8|Lt*>2ZcPw9Ot7;e6lIn6fU6odpoo+Ry1-4aA_1$-Evpd!-xBGW(w>!6P zuubb$+3qbH?fxBG?Vg>i!+(z(FXl&&jLgazHe0b`t^MI=K5nnMXRXamj08A=FS2!mLCBGAdn}!5sgdrhOM<5pW zsUTFuHJF@>^Fqd~lwoQ{zOCDMkNwx*{k(nq@4ju{{fF<^xBvEU?3;i4b^FFQzhd9| z_BZUS-~5LCm*4vX+q&yM|8ykA+TULSEIF@LoE5)SiF-X&HxDyL{=A9Xhbr zP8{8D!;?5NEw+E}(~8LQr3ltpMQNEOrl#6-VzLbDfbHA+q}A8g*^bt5?t2ONaOS*Z_~TLQa*uL^2r*@v2DSiUPxO+d&d77+eG|1qoohOuQ6^ zWK@po?UB?@!?1V0)3eTdI`_z&>wX_tLP;)X&Yv=#a@-hf$=HS<;eJbH&B-7RIv#=^ z2r%OOxIq@)8A%-+JPd>Q*I@-`VZD46>d`VV%=+R$vyzV)8x;>@Onn-o?!jkM!+q9r z<%~7ox?vR+r7~{Wat@QFFsE&J+-!2R&+4yV5Fe!4f`vH!sp9uB>y(q&KQU`p>d#wO zPnVnl892e^nnaAuATFP`D}3>OG*-?^Nok4Qd-pDT^pQ8%&dqCNcti_ek?~`3pe2i! z%1~xnn%X`lxCFe)Rm3LT56QXjXlwHCVUG@vT0>)ekjVmv`GCVg)&l-9#!aKYtpNWx?mp7O! zoYKX_B%tP{cy?SbcnRdlDfA)NCg;b{2yARR~f8)q|`yjPdK z9+im?qtO$R{bMN0*KD;nzwI~dt#5z7edtraXMgayFW7H?;&<(Xzx^rOx$6N1p9^IF zWVppUg2ZctZjix|OhT9~94jnq=5hK%nC^)Jt zsOz@T(Vk80AVraC3u~9#JKym>`}FU8%y!?u)rt!_NB52+{Gr|^mVm)3_PK+xiLs@BK8j&wN;-yKc2ub+)C>iGF(Y4*w z(J6wVfD(-_J=IiI*{Fnv5ygyjWGdB-`Ub14U2J*TnRfWV0bLKc!BdSQKj4c1p+H{0 z_6Q&eOU(iq0Yy)3itZ7l)YNpVlyOLvCw<}US;0OQM*V4ng%H-T1gR98qH7od%N=mT z|9~T}Q^(ZV*4|-b!exR4FS97$Dr>40g=Wi$U9gn2H1`gN6sbP&;DdJP;ERrXkJch| zMsQu(3Lhvo+La`yBuxf|RnbtcFd?6yTd;6}74Q-J?rvQlb!E;7eHG{M(w5+v2X7Fg zg0rH+<#5qOB|efw_&jX2txpcfnA*&U$J|_|*sY|w;-_B!D8bP1n5|m7-i{qPWG#)i ztf#v}@DF%o-6vr`f8o67Bn8^lZ7pp*cIo0JdH&;eReado(rCwy9=0c+dd`}fTJ7qE zt2QX7r%z?KceE<+1v~KKi?;vZVV{qB{YIU$Vi5Jf^K1oq`L_G6oi;kqtH@RH#q)_PP`|zQP_In}Wbcd~PV9;(hHd%E|l@*AWgZ$0QsT=SW+Dc0+ zY(Y(hcyrigkrH?=%5x-&j}8_D8VoNq4X^`?GUzW}4riL^IH&738XM&_w&|GwKZzBp z>aJY&Z#Yj)jrn+kOQPvH88Bb0L&o^niQ_)&fqCaRS=U9|XP@0;O)_@ZE?l&(&Q6B~ zpyJ$Mg}RY-PGc1nZQQiQKK#KC*{#ymSEn8vF@7b&8%EgEMR(Ip3lzydc+p^ud zdv4kB6DJix7s-iSZ>v_VlY>8M`(Hd@C1qvyu6Mu7Us-M0w#9bexl{C*w;OfWgTY~p z0Q3?1U&#XzuJL2`uA4a4{ivY|_o7>%9p%syQ&wIq99^>U(Mcr`hSz!MM#=e{Y|cER`+>#vv}mL}3F1@i zQBPm5ox6NR0ZoqrnlvjdukyB_#~J^EE;=VWFh_T{!%1%dy)ww4XiXEs9pNV;M`{e+ z%z^J-<~_boo~Sws^Gf`?*Sqh2gFXC)H`_z6eb82}T4altS6g{;zU39=T24ukEnB|S zcHOzz?z{J1+q!M5oXITfk=|j-AU5V@Jcgb%>H{ubLvhSH1Y}`G$>z;lZMn+hb>XWe zhun)(i)M(%RH%C$kxE>F>rlAyB=ZVu=I>9C+5g-zr5TNcH`y^ z8=sgm7UE!49q^&R+~)BzRh|oh7(m!^h@D|{A6~$Cl8B1NRX&3|GBa~*QU+_^b9?OB zr=InJI*g1aVk6<%l7eFl;JU7DM#S*xB+yCavfedHk&1})hKEOF{8Ky{?rLtg{V(jX z7x(YCaRf%NFbIbpfEcDN=o|(Pid~fjsSX=;^V5xaJa2lp%X!&9i-G?o0?bg`T zY(qrFlq0z4sz<y3BGaOPy^JMD%?$E~x6QN>gfx@&_R=v;fJxs;(Ot7sC1qG&^Wh9dGoU;Yzl z;v=3yDA|KI90txkxk8Lld+32-Iz~isf`9O>ir9QgoRG>b_sl&{a0YQ+ydK>Lhtb>7 z1bu)d3V(3Cf}!$_GIS5a%6JqMAN;O6x)(kHO1E^3oKn72L@6_(AACtU7~wh5nsQv> zY46ASv3L-55XJe(ZHFOJvGzDD$Wq`rVOn^0xs;ep3s++!qju|NgX&MV4AE_HVAxvQ zx?HY_RQm@;Y(nx+8O-0m)!6PIcAyL0c|!@DP`n>I9l%qZ3`v1K@S4|JZS5jO;>pT0 z=Zgg~ZsJ{U+97A8&#ox27#Z$T1NuZNocdXtkn`8x)}Z`jG9oiN@6_?QFCEMv$dr_1 zjUawOz%OXp6{D$?(+x0rYW9%O;RWGptrhjeBvEj85=lT$4tHO*zCR1yBn z%!u=rw35XqCyJKSatt~o>%%h8dG^}ZJmBA8X6h5Ky`~jWKK$@Q_Let282FH&gq8`x z9%u;{{2U)n^T2 zV|GW1W#;Ewn{?SYdO)~H$xN57O;k}ThaL^pF%5qxl1fm}2Cf)ClOSGZ@T;3CmCv{Q z>CNoy?zIUig<;8RVtTes2q!Ha-OewQlcTOz9BysEDeCJfA|Ue*0;Z8fAiHpx37KWOZK%d{~!CC zzxbkkkn)14MDJVpkgU5csWU_cJBiZ+2{W75A2N(?Y4_&_Ss*3 z`G4B?{`PNe-?J~+jjM{9y9aEjUqUlDZsYPy@c@~q-__o!2czOmpGtV=H0U3EYDu2paTUxEPwbgqa zD9bgY+Bv7^Vu(0sy`H6876SymqZ|X%)4srD0j|QrVoOd=b3@mnvTxj|_fe?O2&aMe zc@Kv2`tp%_6eW*iAkbAzL`lGGN;5LRFfEJdv(j5?T886sY+}r=)ya!)Z*fP=VNsck zNAT%qN(^j)@q7A);0&3i~24lr2XRUZg(%d0t%+oxr^-7+qompVZ^|$gd4}S-lM$zcT7|MJ-

&LJc@yLCv4=Xwy!4FOw48(H<|gauXH~ILyLSDm4GfA0WiT6VUX_lR^`$yn zTH0mQM(ynB6LKOu#EXioC5!VD^KuTm{j;~|B39kP!HyRWq=BrZsnL3*)BNKqA_}YT zT{?f^W z$dNCc`wCmWkK}_7bPm7Zr0{BjZ^`ri6@9>a+t$88>mL)(ir&cEwVRjh~*0RAQ3Xo+w=+X41pHfQz+Jb<$*|YWP%eQ9QE|+S;@PO`v>}MkAjWM*Xpdb ztIx*9XC;G)&VQkKs)sW4-*t?xdCMu21aE1hjf{N=N&G7OEm^kC-uceQ?VXQ3Vv83Q z+W9kk?Z-d(rhV_5U$>wB=tp+!z(G5G^d&og`lMYvdCIPxJ8vg-zUS#@?VrB?_xAO# z{)K)0Z@y+%#0PiXbGO^FcfRMnmX^r^P~v%qD(F06Pp|?DAO)B_7>I!RYKfN7#vm9R z2%-Kk1$(1H0%@^o&>P?MHv7a!KV)Sk`S!gZeAT}F?Qhr_R)OgmP#K|8M+U^!bAj+E zconB2SviIU3HYw>xsxZ<$nV=PfAx%I6y(|mKlDL+)0-ca5|S53e(FUrv8jH_!LVfK z=J?292Jm1UC&Uo_gZ(0;hzi`~othVeOUYp5($cMGc+4)>H(5h#hc(e1Di3Wyf;Y?a zVwR!dQJ)5ptf+5Fdq#=+oMRc!!M=WvMEU-4YGlz8SAtT&yu)?Hri5AyxC;uEwsY?9 ziFD3jA*Nr^#gUX06dYZyM0*%C-VITbt2LE9qUf=$yH8BnYlB1{GCB##>6R`98p|qP zsTr1)Rfe8tGixrIrLsgnel#)NE2ZmA0M+MA{hx3;~97+e2^jVu+x!pLV?=D zk5Uk7zb?DrVYJDEcOMLzo((#~4VZ4*T|0N$sufEF8!AdkU z(2^h1>{tqRaG=ZD+vV8v4P=$o)Y57F6LFTEUns+`XX0}#C8tcj0_z_zHX+eU%c_OD z9Gig@>@yt?$9Yol$0)j< zRvU2gaDIgq@n)v-qzd1RO<*yYG@BTWm!60Q5JShnCeRZ@i7Ux90j~B;y1}7rdXz#hQ&u(~zF-jK zgpUWfBFBT}cl+eHGqZu-FpMz7NO;cSg?Gd~BlQViuTnA3jS>PVxF_ zJ0qa!A>lPhdqZOQUG?2V7T z*Vb=ZZMPb)*th=rPwmG)`mP;)=_PAzYO|36KKIK)GqZApradT91=`DLkxm{|TbrAj zeI>eYedBNJI|^2Z6<|E_$RqZvO>Q$3d3@h#{ z;)wZav0L>}mN(4b7YJE*?6}X~_KvrT@kZ^lzxOHo`H!BmzOFGTQHlv0i1UvuKwuGq zV}z9Qd|g%yx$@Cf#%fvZEw}9HCx2@H_=A7&$nf3odWWr9zfnYB-~t{`ARNkokASn@ zL|%#rD9?^}l8nk69FkEQ8J6Lhx1!uU%ScVN7wtm*Et?RdCF_26 zX_ZwkTVr|U)iUDAmXwhtWQNtha%6x?@^aUqDWzIaKIUdcVKko z5wRCYm{`HdjgA-w zUQRG5v96Tbd;6?cN@sLx*2biv2E>e`>;+R&MuzAuL#=1P7pu38)0NrRZL^BJr^cq` zJh9d~1KJoRE5|~{J%KgJB`Cp(n6oqq^E)1U%s%qr582oL>YMiEzxWGVQoBe%2VvsX zOjSj-ZP~cRyJ(pP$CuBDCgE+m(EC&;pNV8-J@3)^@!kxiAY9SGH$=g1zy%*&l^ARG z%7oY`9tCGQCLg#!8z^D?Y8RB-(xu|JnJLu~>q-t7dC#>}_vVzx`GkU~U&@?Bd4U!Y z9IHrVf#>Ox_G{Xrd7u;WhA}1*qZFb|H?;b(9O?Mfgy=Z#=e!zOP*En@N;YYi^0|{E zcdoc3%hFQhOioX@;R80xbth7lx|gqDNNPT(cNRYg+)G>n`oO1QWNc#-v&8oamQy4rK>NOqZUG)+xjDtw(LQ8-1EVtBNtUhWiBJdoMlC0=)M^&5 zQj|Jm7tUX|Ti2WI#TO3Po_%|LU}Z|OjGcHZOOCM`@3H|?y5j+4SUFXtzYVY^iFH#<%Jn0|o7TBP06&Wd4j-$$^MtHtg!Qb9zpRup}<(I9osl|3|-)4XE zr(YCQx-S@UC~!KQCn-dC9DcVa0qR#vK5#5Fbk_FldBHASx+El|1mzHEJNvSQOYGyH z`nbi;4BG$tpMPi{th6LQZ*6JzsWbCp0_F}ct6ivQiSIJc*_ag5 znQPaqqo>aj6>-MNgC=^zIQgdrB}B!gWmZ%w0m{qwE>F6;lT}}u1O$Zol7;%Qct>@4 zsiiY_LU5;~XIf)(yDeU_)Y4NDCFF`Q|HdRfoH8~ri`>Uc3bRRs;-Uu>SO)#^jV8|(}o@5olM=a{`mF5&?n4J|pNy`gJP z?Gv)drwd*_*MWijenF)MVGgGlMRkr(-L1+8=TItu0c6Hu2jVH-IL z%8LU;JKYHLb6%h>wN|vg9XUt$D%Y2$bffA|xZ}V*;800^>`RZTe)f(N73-sdMK28Y z#Vc2Q6u+wWx|sO@&!bSOqfk7@LM6S7{=Id}N=u4-JjeL>lpF6%-NQi~>>II!*kn1Y z71k|dCGl1n7$3D2cm*H069g11`sMq2|6MZfXHQ?YOLaG`r+>(uN)&NsdbW5u$w!#S z%qQ6W_r6*BV%`qE^nzWva@{(*dU;zRL!TtWF)9NTK7NyxnIoqm+lC|~IEiU;ng<6a zY*E!xUl4_*D;MfGEh*1-?|i@>ee@lndpkz;PLKK82?cpM*4Ex;7o~&SIy!x!nGGxN zvfaDxlkQ2kMT?f%U3WfUGZT{IzCmkgZL;>xPGdRAyxeR#W5agr5;rKc13{6*t0-ToaM{Os+A6{tgN&Q;eC)mOV{J$(ZAv$ z9rM8s95#QICLPFFqNNLKEK3HQ_tsag)k*M>pL85dT)yEVH-2 zMtu!yi{_3lLVQ0@?mXNw+3K=1apix0N1x3Pj-Wzc*eBYD^Lp7>B2yJ*5 z1~Nl80E&5VpwC9f#%#SJX_oxEaOr~X5wU<=HA?wPN{i)v${QEKa;3cU6d{%t7Fcaf zg_RT)xDsT<_@x^+r5NHZAuYqbQ9bH|kyu!QuQNgTb}?L+1iM*LbBBzB0GDA&^O1*4 zF~D$^iWxDYNhm)lMU3sdyx%U>QCeATNpcQYrHws}1!qLit~k{~&e_8ttmqVv$0)2a zrHSvbvIaKmMUw_bM&+&dDQ}EmM&U9~IbtM~d;paU7ic&(+m*+*9Q$iwHIZn6w1 zekh~c^M#kf+*~Wn%k}6T9HvM?_6?5Mh$7p&@4d(NJo_v6P$@mY`^p6434XP=sJO_T zAPiH2V49Q1PVWI-hfM!S(LO}a!J)uFk4CzrCgecTO~yMn2Ac3*K1B+4>53KJjoBx> zrwXokA&q4_ljVW4LKP!CS#LWxE7MqbK1l|7XlTMG{lVR_E*Q2(2*#aqx zDqFPz#WG_tDLJ-$%?7)A@tn6G1wr(OMX4w+v#pyq$w3(iJuIRXvIEaMrG+y$&OQYT z@g*{e_g4?_x-RIJ@VG`VZL-|7Y_s@j{F9Br+gG534R4; zlq>B<;Zh$o@C66J(=lwhbk5;eUBp#WtZQC~aYk(9v!PQk2 zR$f{n$E@3X*>LFI{Khxhie*b}^{QpIa6zRdNwJqNSScQyRAecK3@B+Jt@8%bPSu~5 z?2GBpo6soZ(j#NXI2JxmgR*?{o8MyFw{EipdYx2OVNtH4t$S_%i~GgX;VXJL$lJGX z^3Tm?WoL;Ww%O}m_gc#rui5mtWuzoX=2TZ|qUGg?hqF`VXkvu5<)m3&ev+kU#aMB1 zjuqu)+1NI2wI@tj0HLOP5sI&TXqLJ10T%9j}Ny(^jrsXt{X_(!+}S zdWXf6)!wd|$!K{8^s&R*Q73a6Bx$5j-)VjCIyoET^NZ z%R1XS++oj>6V7a(-T@hOUC&lhUNzM-uFw^b|^73riq6Jn{UV^HY9-Q!ncz8YP ztwK1IoK<~~%?T&Y3S5(eP+qgh-th3Fwq?_D>5}K{=l}8pIq5y(LEP{N-jqLd`G*JH zUg^5OXZL%;lY$H60$hcpJkD(MHqh5+bq$UFL7_W$Y!yxC71&<5jblcys8s)3wQ7xR zT)+0$j_!WhNXr=R-MiPWUa7M<1YU(WfnpQwHLrcEz3Jh5>_`9f1Kac5URSsXImx{* zaF`(zBZZrS3aDNzD_Vn&FJ07s2a_)izdl#k9%&&;wlYu4JW z#zqNdvl#|y zyaVJDmAr@K9S2>4V~ULEI!lsQD-Gz~qRGh;4qfwirXDgVDwZhIIA*z^?QN-Xuev~@%S%Cp%3X|~OwQop9S`p?0_dg(7KJ9ZtgO>4cHR6@jvvL@nS zkj#J_oNhT645q@l=uk9(fYU{mtTHp@pb_n+t1W!^gn=WBfbAQdu#JkOPai)f=c?Zx zeCSPXgirHrYI)&pEsg#qBbFC!?ijSn1xw`^bQ>e|uU@-k=gyz?x!KcG^R{65I>8-h z%a_(lu^qSOmRr`^Qm^JuSy4rePwVojb>N0JqB+&Zs>*U-b&OsFJ_y36C__Yxq7&ZK zPBsS1flKGRh+u-=Ak+cZ!Km^a3IIOg8qQfTZWPFM&k-K>9-2TK$_)2Cf8-k3e6Syy zm3xtVTqmDD=lO6D#7|O0Bw(R82410Fk}D`>r&KD!afQI$seQaNCAPbxJ0=) z0g@*f69%82KX*ZnmLgyA20RRUlajLRzWZNm!(#)sZrvI?diaA$&rx(Yi+w_4L9mVi$U)ity#XtM)d5h>x!-fI8Fn`2Lm12!t$2Pv956kWK$H8!@pBg*R}USY6OUc4OkWlI-} zj}}Yzr>wKJ-bVU6t*PObwabZSL^SK;4|I3<5|}ryUbbsjFDU995KJ?Y+hJ>IxM`hT zJ>Kir)Y>5@BvFQp^$^Bvc}?|Nc~N<>Wy^UlQ9!`Tf)yo&R;3^+NjekRzE)Q+Jvk(Yh=FI~HLo8>4*eDeE~0Y@ zGCDdsz1yCiLuig(CR#_nOACvww5Z6+6)Y4h=wN&exTANJ-i;Yxj@T>84SFoXmwrgw zLoZ*70?y6b@3GfBu-obzF4|9i_&sa7)hYOt!5!=H5Y8?t7v4vwGG2(FlkpTOvOE4= zc%EM2nHe)o5N$Nu4a ze{X;I`@d)Jeb+nft&conk3ITU`|S^Z$iDpNU(&tr+5->V=TU(0;7W?;!3_-_QM7gV z;6W+-QQLj@y&loJGEqe+9=d&zXdqzAlJGE>nWg10psiwdJgZnCG+spXg$*RE9z6)D z!0BDn%0s0vE==g%Ln8Koyu1lfGeJg)2#Rl^PRV0qO=h}wfip0Ho)rKSI2;^Mmctm7 zA7$!FBril$G$taA|1GB{gBZ?e2p`iAWchX!L$^nz(0`B?H0^PXL5yWiKNRsmSJYZ)VACB*n08hCBym_lhv}S}cU4XPv z{}j#O7vW)I>>Wx)WZ>Lk()B*^%lPE1UA}U|o_T)1{q6UDXg~Vt9_t;Nmgik$y}g4H zly19ry~(cEwb-c(b$0&REkzLpd$m{QvL7NgQ5qSivbMOV|oI9TV*)R@(`(CH^Zs@qD=bb;5 z9~y?A*Wyko`{-0OHlCvkEff-7Ck1(Z8E&UNc_Zge7vvDYB8ltKyp-#8M%wP})W-9? z7k6BUH;8Z(BMvi>y#&S$KRiezLL$oMLntVHd{2_M2|P++`JhBS&y=MLm(ID-xp4WK z{p#6gt$%=S;V@Y1ri|dRqbKa->9hV3m6+sN)vLD1Pyz=q0b@ug!w8M^qt}lf0zSyW zn2mTvM?__5l|MOamN{@nV#?yg5bev&NvR0XfjjZct9~-;A6| zx?Xwz-lhDbHasxs-w|MdYr`!Wz@BdFmqS|LdXrXJLUJaaQD|#uxTioau4r>YY9}0! zz!UdWP2`+^^G=-{QDVPKfn|jM%d-fzR#`E%mUB z`jqo7jq-rO=^pe)XiM0`xA1vJevz$Ozh3o^*pL44Z$)cfEe8I>?m3#&R^*qj-tE}2 z-9G!7-?tzA!#~)se(`gA>dBwmkACod`@$c6-gfTT;jd|;vf>NoI3kfNfgxJoymrxk z{No>sud{5^raM$FUEKkvj7@Rb0dBAN)e|Uoq*FKy1VW=qhw9dE++Za|Irg(Beqp@> zeXbbjmW)Tj^hfE;i(S8Zt$p`f->|p6rw{2=@U$Ws!QTXy#BSzEZM#>z`795x2@&=>{{@h*_jc6>ID(YY`MQv=#N zyL_q=BP&5XQ6S7jl&nU1M2)fsULSEMhUPseh{9{c7-A^rWPnB`oLQ_lDO zmXV!nMMb4nyaV6-2 zw$65cH3$#2H8(juXXg}|>KawKBkyty|FI$8VZ#6+Wn6bza$co^h^(qI=u4t3_>l7A z2!6B)!{MhoXH+K1yxtZu@D;0_!+1tNt%|FB>{KJ={EB_>XE^xwP<%cJD1w9)#%*NGX5i5I#wO%R(T1w za>;62SYBiYk34U6*BiX&5*`N*e}tz5Yk7H&oW#9Vx*W9KpTe`$5D=Pf`Ija-C z>EVa%>tFe@{r%s5+ZNSS`tz(;0e)RhBs+{b;Nv@|j~=m$7cbj=cRygY3zrC2$Pd#W z8AKWCbqC|uq_E2WWFdNe*2IXKdh9KVGtz!VfI0BqAMpOfz!>R;cXjAZ}d6z4tGczaUl;}B*|y%j%QoG0r`^5# zF57v}UAE?qm2#+(Y{#8DZ1?^5*#i$gVE5er8oU4g`)&KKEtZ*=VXN1!v>m(ew)-A@ z(C&WV0o%EIt8KsY4$Ch}u~SmK=g*&aBS$pIxC+`qm*|=`tE9vSy?1~f7N{NCCeXv7 z^Du2C-KLpv0^PiUQ4+J~FhWP3fgaRLUN$$lC{B1lcu-;f9yRc9sDSH}&Fjdu9NDQjqMx2D#1 zyLO{Nk?&PS!B_0c)jBJ$sI(`ae%8*My<`J}<2E!r?$Oe!m8;~4pI7?=T;Pp1EMLFD z-tf8yY~#9(cF#Qz*tQ+J?9O}dvwO5{-nPN=%QCH23Ul+8U3Txi57>RLxzE<`++l0h zt`qMh+OtnTX}#icV28)l++g6ecbo_ptXjxxw63o1;FPFtWJ@`$xI{)$PI-p{g&7$i zrlO%6$5cqY+R8cvY*W({x;|n3eFM^&b#`Fi^TwCh`ntP)3MaUXQK-p4Cn7)B9l|>! zdEw`RA{mPP`|Z^E%O)Q{Jf>)Va#~UHg!2l6VW+1iY{}9^zQ9XXc80GQn3a{IGG^?^ z!GpqetAdJHA5gY()pDDi8nR#h@@W}6$)MWo{171}GMA#rFvuqOa7wGiVUJ35gRT5L z$K{|GC`0@x*vn+3Sm|q8fkwV`aE)-qdi>}a9)x~AVE4*3Z_}jI2wm{>uEfhR5eQx{ zUEeSjdd7KP&(UV5m(1&koTPL){E~W=F=d5vSVC{8_}T|`g@Lq;d%4coBf6=19vFa| zMo_NW#d%14fGO8@-+jLo6{pxg|I>G^r@hzPMq|krZR_INMfT0V{wv$CZk@{^umNK< zIlS7?xn*T#wqyGayIFrjj%16M!+rS5^GJsgR5C7#kHa)I-Lji?bq*VKAyY)y>({Sw z2j*~u%#>4+ne6>dJ+CfX9{Oz8jZIg08kz)manic$bjQz z{Cg4&;hBN{emi$Q@tyK$9?Zdo@V`tfdbUNB_Jo2A==E=7<% zrZ!Irxoz?k%Xud)p}T(hijW=P_qtRVo*Xs1^3gRSX<+ATLR`QJ2wj3QKJwaOI2PRq zMj2*9!GtIk=B4B?SVxCCe%bR1%7yDuMa!ZCJdvU(3||UHATgqyK^&uM%Z3e`?8u=5 zQVdMR(LLaFoCF30Nb1#@m6n%Ts-h-7py7k7t^5rvj^7K(VdE&U8IPsF5 zK7HJ->fSX)fJcuWu>E_Vx8p|++P>#su=6T!MoQC>1I`6I&Rl+8j&0kr#otNKNKpqI z3HNj_fIcTs5O$J3u4^8ha^DNnvHpmzUEpaf`TX9$PDIr3N|c5W3Z9BZ2KYJ6be$qp zj&~vIkbBUI@|iZ|ipG@?5QRs0)@dEdM;qDPkpSk%b&s@=rO17hC(WZx9o@Zl<%SH} ze7u#GRmxdQm10hoV&=mpX|{a%DxW#QK%tE6V$00RcgMP-q}XSYFfN3($bn~0vN0qh zaI4{_U9Y<=U3AfIHe9y)8yBta+F5J3aly`?K4n*~oVUit8&;?D6DJPZ`LoCDvS@!) zv}>$ykQ@uI!0aszvQJw9p9qFtz3Qq;(R0$5l}#1Q;D9c8MwJ)J(H&RRKP=sppzHL! z)hL2aN=&tm)>a#q9C*YgIf7pa0S1Rht+%7q3Kb#q3X0m1W!^J7Y9+^TG6o;T&G-ve zx$5s%)IP3YKvr#_k8do;_$OUi5>;Bl-?e9CrdvivhBj8s%aDPZQv|NIHg}5_3ASzf zomNp^tCgBrJ@3?2TZP~QWzVprR zSVv2%BhBA+>Ol+_isSM3y~pmo`)+UGzc=BfV5pyc{&@)t!|y>TcR)8O);4X~C?UOJ zJ)K?P+?Fg_Xi4xFQ<;PSpNA*-dj|%svloF&7nAX9j1M{jE|i+XCqjTg2m*poj$DUf z5IUHXML`%4m7SjE?~IZpP)ucVB`bnrNN455w2Be)5p)^3rW^I%-3Wlx zY>C1}Bu4oRcpDy_P!zdN2JWO7b%GK?J^n|nq##hxn9<#QB6ECr$nikEC<LeFX2==&FM?9K6t~xha!s(oZ@qOJGXC_A|6qsBL@fEM)1oq zZO7Sj>P1i)@D-lNh(a&+BRvBbdT~+0?DJJK_cnju=S4r+KD3YF-o>YDQvcTKb-`iu&O%2xA zpzY=jYtp`1TbrWTTQ_f7gN!iOn3ly_1MMwsVNCJsZIHFzrsc`5cDmqUx z$S^T6$#Sx@6;Zb+YC~s8J|uh9)zwx~SZG6iJvKJf?|9)WWz1+;FGX5eT4+mZDs9=q z8e6rv))%NjC*@|QSvsFoo1OG-PS7R=qrLQtoH2J)y`=(3b0& zOP1KGl`CxX<_)%XMXfC?E4GZ36qhHWaA3`*Yd$keWzH&aIbzLiy)x2qGSEfV+IGYC z?K@!OlSI*~L-oT`9+*UE>GY+3j>R!ThM&0s^=km_2fjIP3)XNc#!8CIK%|_B9{<#2 zt!SO(3Mb^55^n26kM5xn@d(kkqUXdA@Ua0mxtSS+;esE-*p-L_>UYtPL2twJEHj*& zlOLPy)`wDy-)? zE=Xr}IA8=-8#gMFUb{v-`RYd6TZBNz3z=?U02)D;p@t~4GF0tSW@^6QQ>|h+y7)|9 zbDFQD6cF+sOA92>i^c4LL1+|BQ$1=xS67E%i?sp?O;GGH682GlKb(*lR{!GtElY*c zWiFHlB_jAB7{=G%foSutMwNkap%;Kijxy<%M5%J!JvcqX3R>=|NeSceGI)*ryh{Qu z_tI4ctVw+|A0><+k|@`enBygE=t@QhGP0ff&iuMhS5^?j5Y5lvEeeKcIidW3U-nT2 z91=pLwt_uimofkkwEtztBM6|ca;7%$42qfSbm2N2epR_3uOA0Kh$?V;0l-aE$vLCw zIo?yc!j`e7y?Dx=m+NXrlxETBI@%sTS2^Izai;4qHd8d{K@mTDUb@BHffS8Upd{}e zCu$W4UWVGtYy$>*A^g0f2Y=Jd)z&d{U-8yG;z3yoF4my-YdVJZbRB~)9Mu^;H?MNY z>)mmJ*PjEY%0D>)J)|ncmmti&aG?+<0~Y3W3XTQsw~tv6J$*i} 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 literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_01.png b/bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_01.png new file mode 100644 index 0000000000000000000000000000000000000000..5640216ae5b677bc49e77e3995cdf3a00688723b GIT binary patch literal 47629 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 literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_02.png b/bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_02.png new file mode 100644 index 0000000000000000000000000000000000000000..93984c1a901979cc09743b4acd016aafb96c1d6e GIT binary patch literal 9973 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 literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_03.png b/bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_03.png new file mode 100644 index 0000000000000000000000000000000000000000..6280b5d664164903c9e7c8b4203306b03918d7bf GIT binary patch literal 3590 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 Vb%!*Mdq_PTpe(NeseEA(`hWN36S@EZ literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_04.png b/bsp/apm32/apm32e103ze-tinyboard/figures/JFlash_Leader_04.png new file mode 100644 index 0000000000000000000000000000000000000000..b133313482c10209e4b442e6affb6607cfc7d2c1 GIT binary patch literal 12434 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 + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 1 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdio.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscalls.c + + + + CPU + + $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\ipc\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\iar\startup_apm32e10x_hd.s + + + $PROJ_DIR$\..\libraries\Drivers\drv_common.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_usart.c + + + + Finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler_up.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Libraries + + $PROJ_DIR$\..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_eint.c + + + $PROJ_DIR$\..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_misc.c + + + $PROJ_DIR$\..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_gpio.c + + + $PROJ_DIR$\..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\system_apm32e10x.c + + + $PROJ_DIR$\..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_usart.c + + + $PROJ_DIR$\..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_rcm.c + + + $PROJ_DIR$\..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_dma.c + + + + POSIX + + diff --git a/bsp/apm32/apm32e103ze-tinyboard/project.eww b/bsp/apm32/apm32e103ze-tinyboard/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/apm32/apm32e103ze-tinyboard/project.uvoptx b/bsp/apm32/apm32e103ze-tinyboard/project.uvoptx new file mode 100644 index 0000000000..fae23b8704 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/project.uvoptx @@ -0,0 +1,865 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 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 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0APM32E10x_512 -FL080000 -FS08000000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM) + + + 0 + JL2CM3 + -U150710805 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0APM32E10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM) + + + + + 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 + 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\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 5 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 25 + 2 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\arm\startup_apm32e10x_hd.s + startup_apm32e10x_hd.s + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_eint.c + apm32e10x_eint.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_misc.c + apm32e10x_misc.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_gpio.c + apm32e10x_gpio.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\system_apm32e10x.c + system_apm32e10x.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_usart.c + apm32e10x_usart.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_rcm.c + apm32e10x_rcm.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_dma.c + apm32e10x_dma.c + 0 + 0 + + + + diff --git a/bsp/apm32/apm32e103ze-tinyboard/project.uvprojx b/bsp/apm32/apm32e103ze-tinyboard/project.uvprojx new file mode 100644 index 0000000000..a36db0a93c --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/project.uvprojx @@ -0,0 +1,693 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + APM32E103ZE + Geehy + Geehy.APM32E1xx_DFP.1.0.0 + https://www.geehy.com/uploads/tool/ + IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32E10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM)) + 0 + $$Device:APM32E103ZE$Device\Include\apm32e10x.h + + + + + + + + + + $$Device:APM32E103ZE$SVD\APM32E103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 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-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 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 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + __STDC_LIMIT_MACROS, APM32E10X_HD, USE_STDPERIPH_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, RT_USING_ARMLIBC + + .;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension;board\ports;..\..\..\libcpu\arm\cortex-m3;..\..\..\libcpu\arm\common;..\libraries\Drivers;..\..\..\components\drivers\include;..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\inc;..\..\..\components\libc\posix\io\stdio;board;..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Include;..\..\..\components\finsh;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\Drivers\config;..\libraries\APM32E10x_Library\CMSIS\Include;..\..\..\components\drivers\include;..\..\..\include;..\..\..\components\libc\compilers\common\include;applications;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + 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 + + + cstdio.c + 1 + ..\..\..\components\libc\compilers\common\cstdio.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 + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + CPU + + + atomic_arm.c + 1 + ..\..\..\libcpu\arm\common\atomic_arm.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + + + DeviceDrivers + + + completion.c + 1 + ..\..\..\components\drivers\ipc\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + startup_apm32e10x_hd.s + 2 + ..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\arm\startup_apm32e10x_hd.s + + + drv_common.c + 1 + ..\libraries\Drivers\drv_common.c + + + drv_gpio.c + 1 + ..\libraries\Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\Drivers\drv_usart.c + + + + + Finsh + + + 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 + 1 + ..\..\..\components\finsh\cmd.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler_up.c + 1 + ..\..\..\src\scheduler_up.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Libraries + + + apm32e10x_eint.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_eint.c + + + apm32e10x_misc.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_misc.c + + + apm32e10x_gpio.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_gpio.c + + + system_apm32e10x.c + 1 + ..\libraries\APM32E10x_Library\Device\Geehy\APM32E10x\Source\system_apm32e10x.c + + + apm32e10x_usart.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_usart.c + + + apm32e10x_rcm.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_rcm.c + + + apm32e10x_dma.c + 1 + ..\libraries\APM32E10x_Library\APM32E10x_StdPeriphDriver\src\apm32e10x_dma.c + + + + + + + + + + + + + +
diff --git a/bsp/apm32/apm32e103ze-tinyboard/rtconfig.h b/bsp/apm32/apm32e103ze-tinyboard/rtconfig.h new file mode 100644 index 0000000000..52433cb937 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/rtconfig.h @@ -0,0 +1,243 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 8 +#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 RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* kservice optimization */ + +#define RT_KSERVICE_USING_STDLIB +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_PAGE_MAX_ORDER 11 +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x50000 +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M3 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#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 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 + +/* 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_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using USB */ + + +/* C/C++ and POSIX layer */ + +#define RT_LIBC_DEFAULT_TIMEZONE 8 + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + + +/* Network */ + + +/* Utilities */ + + +/* RT-Thread Utestcases */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + + +/* XML: Extensible Markup Language */ + + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + + +/* u8g2: a monochrome graphic library */ + + +/* tools packages */ + + +/* system packages */ + +/* enhanced kernel services */ + + +/* acceleration: Assembly language or algorithmic acceleration packages */ + + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + + +/* Micrium: Micrium software products porting for RT-Thread */ + + +/* peripheral libraries and drivers */ + +/* sensors drivers */ + + +/* touch drivers */ + + +/* Kendryte SDK */ + + +/* AI packages */ + + +/* Signal Processing and Control Algorithm Packages */ + + +/* miscellaneous packages */ + +/* project laboratory */ + +/* samples: kernel and components samples */ + + +/* entertainment: terminal games and other interesting software packages */ + + +/* Arduino libraries */ + + +/* Projects */ + + +/* Sensors */ + + +/* Display */ + + +/* Timing */ + + +/* Data Processing */ + + +/* Data Storage */ + +/* Communication */ + + +/* Device Control */ + + +/* Other */ + + +/* Signal IO */ + + +/* Uncategorized */ + +#define SOC_FAMILY_APM32 +#define SOC_SERIES_APM32E1 + +/* Hardware Drivers Config */ + +#define SOC_APM32E103ZE + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_USB_TO_USART + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 + +#endif diff --git a/bsp/apm32/apm32e103ze-tinyboard/rtconfig.py b/bsp/apm32/apm32e103ze-tinyboard/rtconfig.py new file mode 100644 index 0000000000..7b1531669a --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m3' +CROSS_TOOL='gcc' + +# 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'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = r'E:\IAR' + +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-m3 -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' + + 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-M3 ' + 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 == 'armclang': + # toolchains + CC = 'armclang' + CXX = 'armclang' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M1.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m0 ' + CFLAGS += ' -mcpu=cortex-m0 ' + CFLAGS += ' -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar ' + CFLAGS += ' -gdwarf-3 -ffunction-sections ' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers ' + LFLAGS += ' --list rt-thread.map ' + LFLAGS += r' --strict --scatter "board\linker_scripts\link.sct" ' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib' + + EXEC_PATH += '/ARM/ARMCLANG/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O1' # armclang recommend + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # 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-M3' + 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-M3' + 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/apm32/apm32e103ze-tinyboard/template.ewp b/bsp/apm32/apm32e103ze-tinyboard/template.ewp new file mode 100644 index 0000000000..62e3416ef6 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/template.ewp @@ -0,0 +1,2144 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 1 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + diff --git a/bsp/apm32/apm32e103ze-tinyboard/template.eww b/bsp/apm32/apm32e103ze-tinyboard/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/apm32/apm32e103ze-tinyboard/template.uvoptx b/bsp/apm32/apm32e103ze-tinyboard/template.uvoptx new file mode 100644 index 0000000000..208b29d80d --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/template.uvoptx @@ -0,0 +1,185 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 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 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0APM32E10x_512 -FL080000 -FS08000000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM) + + + 0 + JL2CM3 + -U150710805 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0APM32E10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM) + + + + + 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 + 0 + 0 + + + + + + + + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/apm32/apm32e103ze-tinyboard/template.uvprojx b/bsp/apm32/apm32e103ze-tinyboard/template.uvprojx new file mode 100644 index 0000000000..fb5044d404 --- /dev/null +++ b/bsp/apm32/apm32e103ze-tinyboard/template.uvprojx @@ -0,0 +1,396 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + APM32E103ZE + Geehy + Geehy.APM32E1xx_DFP.1.0.0 + https://www.geehy.com/uploads/tool/ + IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32E10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32E103ZE$Flash\APM32E10x_512.FLM)) + 0 + $$Device:APM32E103ZE$Device\Include\apm32e10x.h + + + + + + + + + + $$Device:APM32E103ZE$SVD\APM32E103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 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-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 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 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
diff --git a/bsp/apm32/apm32f103vb-miniboard/.config b/bsp/apm32/apm32f103vb-miniboard/.config index aba19cc2e7..5f3c406422 100644 --- a/bsp/apm32/apm32f103vb-miniboard/.config +++ b/bsp/apm32/apm32f103vb-miniboard/.config @@ -990,5 +990,6 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_TMR is not set # CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_CAN is not set # CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_USING_WDT is not set diff --git a/bsp/apm32/apm32f103vb-miniboard/board/Kconfig b/bsp/apm32/apm32f103vb-miniboard/board/Kconfig index 17e126c1db..5fd8985607 100644 --- a/bsp/apm32/apm32f103vb-miniboard/board/Kconfig +++ b/bsp/apm32/apm32f103vb-miniboard/board/Kconfig @@ -184,6 +184,16 @@ menu "On-chip Peripheral Drivers" endif endif + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + endif + config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n diff --git a/bsp/apm32/apm32f103vb-miniboard/board/board.c b/bsp/apm32/apm32f103vb-miniboard/board/board.c index 65d244a571..f2c0048735 100644 --- a/bsp/apm32/apm32f103vb-miniboard/board/board.c +++ b/bsp/apm32/apm32f103vb-miniboard/board/board.c @@ -84,3 +84,32 @@ void apm32_msp_timer_init(void *Instance) } #endif } + +void apm32_msp_can_init(void *Instance) +{ +#ifdef BSP_USING_CAN1 + GPIO_Config_T GPIO_InitStructure; + CAN_T *CANx = (CAN_T *)Instance; + + if (CAN1 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOD); + + GPIO_ConfigPinRemap(GPIO_REMAP2_CAN1); + + /* CAN1 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_1; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOD, &GPIO_InitStructure); + + /* CAN1 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_0; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOD, &GPIO_InitStructure); + } +#endif +} diff --git a/bsp/apm32/apm32f103vb-miniboard/project.uvoptx b/bsp/apm32/apm32f103vb-miniboard/project.uvoptx index f973ad1ef2..2a7fee2929 100644 --- a/bsp/apm32/apm32f103vb-miniboard/project.uvoptx +++ b/bsp/apm32/apm32f103vb-miniboard/project.uvoptx @@ -187,6 +187,689 @@ 0 0 0 +<<<<<<< Updated upstream +======= + + 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\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 5 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 25 + 2 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\arm\startup_apm32f10x_hd.s + startup_apm32f10x_hd.s + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\system_apm32f10x.c + system_apm32f10x.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_rcm.c + apm32f10x_rcm.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_misc.c + apm32f10x_misc.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_usart.c + apm32f10x_usart.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_eint.c + apm32f10x_eint.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_gpio.c + apm32f10x_gpio.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_dma.c + apm32f10x_dma.c + 0 + 0 + +>>>>>>> Stashed changes diff --git a/bsp/apm32/apm32f103vb-miniboard/project.uvprojx b/bsp/apm32/apm32f103vb-miniboard/project.uvprojx index 09854fe163..fa2570f701 100644 --- a/bsp/apm32/apm32f103vb-miniboard/project.uvprojx +++ b/bsp/apm32/apm32f103vb-miniboard/project.uvprojx @@ -335,8 +335,13 @@ __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, APM32F10X_HD +<<<<<<< Updated upstream ..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m3;..\..\..\include;..\..\..\components\finsh;..\..\..\components\drivers\include;.;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\posix\io\stdio;..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Include;..\libraries\APM32F10x_Library\CMSIS\Include;..\libraries\APM32F10x_Library\APM32F10x_ETH_Driver\inc;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include;board\ports;..\..\..\libcpu\arm\common;board;applications;..\libraries\Drivers\config;..\libraries\Drivers;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\include;..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\inc +======= + + ..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m3;..\..\..\libcpu\arm\common;..\libraries\Drivers;board;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\stdio;..\..\..\components\finsh;..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\Drivers\config;..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\inc;board\ports;..\libraries\APM32F10x_Library\CMSIS\Include;..\..\..\components\drivers\include;..\libraries\APM32F10x_Library\APM32F10x_ETH_Driver\inc;..\..\..\include;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc;.;applications +>>>>>>> Stashed changes @@ -454,8 +459,11 @@ 1 ..\..\..\libcpu\arm\common\atomic_arm.c +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes div0.c 1 diff --git a/bsp/apm32/apm32f103xe-minibroard/.config b/bsp/apm32/apm32f103xe-minibroard/.config index b5353ad261..197996094d 100644 --- a/bsp/apm32/apm32f103xe-minibroard/.config +++ b/bsp/apm32/apm32f103xe-minibroard/.config @@ -118,41 +118,7 @@ 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_RT_USING_DFS=y -CONFIG_DFS_USING_POSIX=y -CONFIG_DFS_USING_WORKDIR=y -CONFIG_DFS_FILESYSTEMS_MAX=4 -CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 -CONFIG_DFS_FD_MAX=16 -# CONFIG_RT_USING_DFS_MNTTABLE is not set -CONFIG_RT_USING_DFS_ELMFAT=y - -# -# elm-chan's FatFs, Generic FAT Filesystem Module -# -CONFIG_RT_DFS_ELM_CODE_PAGE=437 -CONFIG_RT_DFS_ELM_WORD_ACCESS=y -# CONFIG_RT_DFS_ELM_USE_LFN_0 is not set -# CONFIG_RT_DFS_ELM_USE_LFN_1 is not set -# CONFIG_RT_DFS_ELM_USE_LFN_2 is not set -CONFIG_RT_DFS_ELM_USE_LFN_3=y -CONFIG_RT_DFS_ELM_USE_LFN=3 -CONFIG_RT_DFS_ELM_LFN_UNICODE_0=y -# CONFIG_RT_DFS_ELM_LFN_UNICODE_1 is not set -# CONFIG_RT_DFS_ELM_LFN_UNICODE_2 is not set -# CONFIG_RT_DFS_ELM_LFN_UNICODE_3 is not set -CONFIG_RT_DFS_ELM_LFN_UNICODE=0 -CONFIG_RT_DFS_ELM_MAX_LFN=255 -CONFIG_RT_DFS_ELM_DRIVES=2 -CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512 -# CONFIG_RT_DFS_ELM_USE_ERASE is not set -CONFIG_RT_DFS_ELM_REENTRANT=y -CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 -# CONFIG_RT_USING_DFS_DEVFS is not set -# CONFIG_RT_USING_DFS_ROMFS is not set -# CONFIG_RT_USING_DFS_CROMFS is not set -# CONFIG_RT_USING_DFS_RAMFS is not set -# CONFIG_RT_USING_DFS_TMPFS is not set +# CONFIG_RT_USING_DFS is not set # CONFIG_RT_USING_FAL is not set # @@ -183,13 +149,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_FDT is not set # CONFIG_RT_USING_RTC is not set -CONFIG_RT_USING_SDIO=y -CONFIG_RT_SDIO_STACK_SIZE=512 -CONFIG_RT_SDIO_THREAD_PRIORITY=15 -CONFIG_RT_MMCSD_STACK_SIZE=1024 -CONFIG_RT_MMCSD_THREAD_PREORITY=22 -CONFIG_RT_MMCSD_MAX_PARTITION=16 -# CONFIG_RT_SDIO_DEBUG 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 @@ -1035,6 +995,7 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_TMR is not set # CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_CAN is not set # CONFIG_BSP_USING_SDIO is not set # CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_USING_WDT is not set diff --git a/bsp/apm32/apm32f103xe-minibroard/board/Kconfig b/bsp/apm32/apm32f103xe-minibroard/board/Kconfig index dbdac5f190..beace4e596 100644 --- a/bsp/apm32/apm32f103xe-minibroard/board/Kconfig +++ b/bsp/apm32/apm32f103xe-minibroard/board/Kconfig @@ -181,6 +181,19 @@ menu "On-chip Peripheral Drivers" endif endif + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + config BSP_USING_CAN2 + bool "Enable CAN2" + default n + endif + config BSP_USING_SDIO bool "Enable SDIO" select RT_USING_SDIO diff --git a/bsp/apm32/apm32f103xe-minibroard/board/board.c b/bsp/apm32/apm32f103xe-minibroard/board/board.c index f2dfe1259a..877cf300d7 100644 --- a/bsp/apm32/apm32f103xe-minibroard/board/board.c +++ b/bsp/apm32/apm32f103xe-minibroard/board/board.c @@ -63,3 +63,52 @@ void apm32_msp_sdio_init(void *Instance) GPIO_InitStructure.pin = GPIO_PIN_2; GPIO_Config(GPIOD, &GPIO_InitStructure); } + +void apm32_msp_can_init(void *Instance) +{ +#if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) + GPIO_Config_T GPIO_InitStructure; + CAN_T *CANx = (CAN_T *)Instance; + + if (CAN1 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOD); + + GPIO_ConfigPinRemap(GPIO_REMAP2_CAN1); + + /* CAN1 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_1; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOD, &GPIO_InitStructure); + + /* CAN1 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_0; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOD, &GPIO_InitStructure); + } + else if (CAN2 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + GPIO_ConfigPinRemap(GPIO_REMAP_CAN2); + + /* CAN2 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_6; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + /* CAN2 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_5; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &GPIO_InitStructure); + } +#endif +} diff --git a/bsp/apm32/apm32f103xe-minibroard/project.uvoptx b/bsp/apm32/apm32f103xe-minibroard/project.uvoptx index 2b7d33fccd..54a63b7ddd 100644 --- a/bsp/apm32/apm32f103xe-minibroard/project.uvoptx +++ b/bsp/apm32/apm32f103xe-minibroard/project.uvoptx @@ -10,7 +10,7 @@ *.s*; *.src; *.a* *.obj; *.o *.lib - *.txt; *.h; *.inc + *.txt; *.h; *.inc; *.md *.plm *.cpp 0 @@ -73,11 +73,11 @@ 0 - 0 + 1 0 1 - 0 + 255 0 1 @@ -171,15 +171,702 @@ + + 1 + 1 + 0 + 2 + 10000000 + - Source Group 1 + 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\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 5 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 25 + 2 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\arm\startup_apm32f10x_hd.s + startup_apm32f10x_hd.s + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\system_apm32f10x.c + system_apm32f10x.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_rcm.c + apm32f10x_rcm.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_misc.c + apm32f10x_misc.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_usart.c + apm32f10x_usart.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_eint.c + apm32f10x_eint.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_gpio.c + apm32f10x_gpio.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_dma.c + apm32f10x_dma.c + 0 + 0 + diff --git a/bsp/apm32/apm32f103xe-minibroard/project.uvprojx b/bsp/apm32/apm32f103xe-minibroard/project.uvprojx index de919c9311..2e19c36f9a 100644 --- a/bsp/apm32/apm32f103xe-minibroard/project.uvprojx +++ b/bsp/apm32/apm32f103xe-minibroard/project.uvprojx @@ -1,43 +1,46 @@ + 2.1 +
### uVision Project, (C) Keil Software
+ rt-thread 0x4 ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC + 5060960::V5.06 update 7 (build 960)::.\ARMCC 0 APM32F103ZE Geehy - Geehy.APM32F1xx_DFP.1.0.8 + Geehy.APM32F1xx_DFP.1.0.9 https://www.geehy.com/uploads/tool/ IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32F103ZE$Flash\APM32F10x_512.FLM)) 0 $$Device:APM32F103ZE$Device\Include\apm32f10x.h - - - - - - - - - + + + + + + + + + $$Device:APM32F103ZE$SVD\APM32F103xx.svd 0 0 - - - - - + + + + + 0 0 @@ -59,8 +62,8 @@ 0 0 - - + + 0 0 0 @@ -69,8 +72,8 @@ 0 0 - - + + 0 0 0 @@ -80,14 +83,14 @@ 1 0 fromelf --bin !L --output rtthread.bin - + 0 0 0 0 0 - + 0 @@ -101,8 +104,8 @@ 0 0 3 - - + + 1 @@ -111,7 +114,7 @@ DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -135,11 +138,11 @@ 1 BIN\UL2CM3.DLL - - - - - + + + + + 0 @@ -172,7 +175,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -182,6 +185,7 @@ 0 0 0 + 0 0 0 8 @@ -305,7 +309,7 @@ 0x0 - + 1 @@ -332,10 +336,15 @@ 0 0 - + __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, APM32F10X_HD +<<<<<<< Updated upstream ..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m3;..\..\..\include;..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\inc;applications;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\stdio;.;..\libraries\APM32F10x_Library\CMSIS\Include;..\..\..\components\dfs\filesystems\elmfat;..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Include;..\libraries\APM32F10x_Library\APM32F10x_ETH_Driver\inc;..\..\..\components\drivers\include;board;..\..\..\components\dfs\include;..\..\..\components\drivers\include;..\..\..\libcpu\arm\common;..\..\..\components\libc\posix\ipc;board\ports;..\libraries\Drivers\config;..\libraries\Drivers;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\include;..\..\..\components\finsh +======= + + .;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m3;..\..\..\libcpu\arm\common;..\libraries\Drivers;..\..\..\components\drivers\include;board;..\..\..\components\libc\posix\io\stdio;..\..\..\components\finsh;..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\Drivers\config;..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\inc;..\libraries\APM32F10x_Library\CMSIS\Include;..\..\..\components\drivers\include;applications;..\libraries\APM32F10x_Library\APM32F10x_ETH_Driver\inc;..\..\..\include;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc;board\ports +>>>>>>> Stashed changes @@ -348,12 +357,12 @@ 0 0 0 - 0 + 4 - - - - + + + + @@ -365,13 +374,13 @@ 0 0x08000000 0x20000000 - + .\board\linker_scripts\link.sct - - - - - + + + + + @@ -394,50 +403,36 @@ 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 - - cstdio.c 1 ..\..\..\components\libc\compilers\common\cstdio.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 - - cwchar.c 1 @@ -453,29 +448,26 @@ 1 ..\..\..\libcpu\arm\common\atomic_arm.c +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes div0.c 1 ..\..\..\libcpu\arm\common\div0.c - - showmem.c 1 ..\..\..\libcpu\arm\common\showmem.c - - context_rvds.S 2 ..\..\..\libcpu\arm\cortex-m3\context_rvds.S - - cpuport.c 1 @@ -491,99 +483,41 @@ 1 ..\..\..\components\drivers\ipc\completion.c - - dataqueue.c 1 ..\..\..\components\drivers\ipc\dataqueue.c - - pipe.c 1 ..\..\..\components\drivers\ipc\pipe.c - - ringblk_buf.c 1 ..\..\..\components\drivers\ipc\ringblk_buf.c - - ringbuffer.c 1 ..\..\..\components\drivers\ipc\ringbuffer.c - - waitqueue.c 1 ..\..\..\components\drivers\ipc\waitqueue.c - - workqueue.c 1 ..\..\..\components\drivers\ipc\workqueue.c - - pin.c 1 ..\..\..\components\drivers\misc\pin.c - - - - block_dev.c - 1 - ..\..\..\components\drivers\sdio\block_dev.c - - - - - gpt.c - 1 - ..\..\..\components\drivers\sdio\gpt.c - - - - - mmc.c - 1 - ..\..\..\components\drivers\sdio\mmc.c - - - - - mmcsd_core.c - 1 - ..\..\..\components\drivers\sdio\mmcsd_core.c - - - - - sd.c - 1 - ..\..\..\components\drivers\sdio\sd.c - - - - - sdio.c - 1 - ..\..\..\components\drivers\sdio\sdio.c - - - serial.c 1 @@ -599,29 +533,21 @@ 1 board\board.c - - startup_apm32f10x_hd.s 2 ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\arm\startup_apm32f10x_hd.s - - drv_common.c 1 ..\libraries\Drivers\drv_common.c - - drv_gpio.c 1 ..\libraries\Drivers\drv_gpio.c - - drv_usart.c 1 @@ -629,58 +555,6 @@ - - Filesystem - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - Finsh @@ -689,35 +563,22 @@ 1 ..\..\..\components\finsh\shell.c - - msh.c 1 ..\..\..\components\finsh\msh.c - - msh_parse.c 1 ..\..\..\components\finsh\msh_parse.c - - cmd.c 1 ..\..\..\components\finsh\cmd.c - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - Kernel @@ -727,85 +588,61 @@ 1 ..\..\..\src\clock.c - - components.c 1 ..\..\..\src\components.c - - device.c 1 ..\..\..\src\device.c - - idle.c 1 ..\..\..\src\idle.c - - ipc.c 1 ..\..\..\src\ipc.c - - irq.c 1 ..\..\..\src\irq.c - - kservice.c 1 ..\..\..\src\kservice.c - - mem.c 1 ..\..\..\src\mem.c - - mempool.c 1 ..\..\..\src\mempool.c - - object.c 1 ..\..\..\src\object.c - - scheduler_up.c 1 ..\..\..\src\scheduler_up.c - - thread.c 1 ..\..\..\src\thread.c - - timer.c 1 @@ -815,56 +652,37 @@ Libraries - - - apm32f10x_sdio.c - 1 - ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_sdio.c - - system_apm32f10x.c 1 ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\system_apm32f10x.c - - apm32f10x_rcm.c 1 ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_rcm.c - - apm32f10x_misc.c 1 ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_misc.c - - apm32f10x_usart.c 1 ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_usart.c - - apm32f10x_eint.c 1 ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_eint.c - - apm32f10x_gpio.c 1 ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_gpio.c - - apm32f10x_dma.c 1 @@ -875,9 +693,11 @@ + - - - + + + + diff --git a/bsp/apm32/apm32f103xe-minibroard/rtconfig.h b/bsp/apm32/apm32f103xe-minibroard/rtconfig.h index f89f6a4892..5dd0c561d2 100644 --- a/bsp/apm32/apm32f103xe-minibroard/rtconfig.h +++ b/bsp/apm32/apm32f103xe-minibroard/rtconfig.h @@ -74,27 +74,6 @@ #define MSH_USING_BUILT_IN_COMMANDS #define FINSH_USING_DESCRIPTION #define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 4 -#define DFS_FILESYSTEM_TYPES_MAX 4 -#define DFS_FD_MAX 16 -#define RT_USING_DFS_ELMFAT - -/* elm-chan's FatFs, Generic FAT Filesystem Module */ - -#define RT_DFS_ELM_CODE_PAGE 437 -#define RT_DFS_ELM_WORD_ACCESS -#define RT_DFS_ELM_USE_LFN_3 -#define RT_DFS_ELM_USE_LFN 3 -#define RT_DFS_ELM_LFN_UNICODE_0 -#define RT_DFS_ELM_LFN_UNICODE 0 -#define RT_DFS_ELM_MAX_LFN 255 -#define RT_DFS_ELM_DRIVES 2 -#define RT_DFS_ELM_MAX_SECTOR_SIZE 512 -#define RT_DFS_ELM_REENTRANT -#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 /* Device Drivers */ @@ -105,12 +84,6 @@ #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN -#define RT_USING_SDIO -#define RT_SDIO_STACK_SIZE 512 -#define RT_SDIO_THREAD_PRIORITY 15 -#define RT_MMCSD_STACK_SIZE 1024 -#define RT_MMCSD_THREAD_PREORITY 22 -#define RT_MMCSD_MAX_PARTITION 16 /* Using USB */ diff --git a/bsp/apm32/apm32f107vc-evalboard/.config b/bsp/apm32/apm32f107vc-evalboard/.config index f10b5e1a54..0e0d65621b 100644 --- a/bsp/apm32/apm32f107vc-evalboard/.config +++ b/bsp/apm32/apm32f107vc-evalboard/.config @@ -999,6 +999,7 @@ CONFIG_BSP_USING_UART4=y # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_TMR is not set # CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_CAN is not set # CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_USING_WDT is not set diff --git a/bsp/apm32/apm32f107vc-evalboard/board/Kconfig b/bsp/apm32/apm32f107vc-evalboard/board/Kconfig index 11e0faf372..bc4840e39e 100644 --- a/bsp/apm32/apm32f107vc-evalboard/board/Kconfig +++ b/bsp/apm32/apm32f107vc-evalboard/board/Kconfig @@ -214,6 +214,19 @@ menu "On-chip Peripheral Drivers" endif endif + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + config BSP_USING_CAN2 + bool "Enable CAN2" + default n + endif + config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n diff --git a/bsp/apm32/apm32f107vc-evalboard/board/board.c b/bsp/apm32/apm32f107vc-evalboard/board/board.c index 1b418dfb85..b458a54e88 100644 --- a/bsp/apm32/apm32f107vc-evalboard/board/board.c +++ b/bsp/apm32/apm32f107vc-evalboard/board/board.c @@ -139,6 +139,54 @@ void apm32_msp_timer_init(void *Instance) #endif } +void apm32_msp_can_init(void *Instance) +{ +#if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) + GPIO_Config_T GPIO_InitStructure; + CAN_T *CANx = (CAN_T *)Instance; + + if (CAN1 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + GPIO_ConfigPinRemap(GPIO_REMAP1_CAN1); + + /* CAN1 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_9; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + /* CAN1 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_8; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &GPIO_InitStructure); + } + else if (CAN2 == CANx) + { + /* When using the CAN2 peripheral, the CAN1 clock must be turned on */ + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + /* CAN2 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_13; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + /* CAN2 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_12; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &GPIO_InitStructure); + } +#endif +} + /* * phy reset */ diff --git a/bsp/apm32/apm32f107vc-evalboard/project.uvoptx b/bsp/apm32/apm32f107vc-evalboard/project.uvoptx index 7f0e3badc5..8c600c8ab0 100644 --- a/bsp/apm32/apm32f107vc-evalboard/project.uvoptx +++ b/bsp/apm32/apm32f107vc-evalboard/project.uvoptx @@ -182,11 +182,699 @@ +<<<<<<< Updated upstream Source Group 1 0 0 0 0 +======= + Applications + 1 + 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\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 1 + 0 + 0 + 0 + + 5 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 25 + 2 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\arm\startup_apm32f10x_cl.s + startup_apm32f10x_cl.s + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\system_apm32f10x.c + system_apm32f10x.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_rcm.c + apm32f10x_rcm.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_misc.c + apm32f10x_misc.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_usart.c + apm32f10x_usart.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_eint.c + apm32f10x_eint.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_gpio.c + apm32f10x_gpio.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_dma.c + apm32f10x_dma.c + 0 + 0 + +>>>>>>> Stashed changes diff --git a/bsp/apm32/apm32f107vc-evalboard/project.uvprojx b/bsp/apm32/apm32f107vc-evalboard/project.uvprojx index 82f8a979ee..c61f852185 100644 --- a/bsp/apm32/apm32f107vc-evalboard/project.uvprojx +++ b/bsp/apm32/apm32f107vc-evalboard/project.uvprojx @@ -335,8 +335,13 @@ APM32F10X_CL, __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__ +<<<<<<< Updated upstream ..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m3;..\..\..\include;..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\inc;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\posix\io\stdio;..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Include;..\libraries\APM32F10x_Library\CMSIS\Include;..\libraries\APM32F10x_Library\APM32F10x_ETH_Driver\inc;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\libcpu\arm\common;board\ports;..\..\..\components\libc\posix\ipc;..\libraries\Drivers\config;.;..\libraries\Drivers;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\include;applications;..\..\..\components\finsh;board +======= + + ..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension;applications;..\..\..\libcpu\arm\cortex-m3;..\..\..\libcpu\arm\common;board;..\libraries\Drivers;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\stdio;..\..\..\components\finsh;..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\Drivers\config;..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\inc;.;..\libraries\APM32F10x_Library\CMSIS\Include;..\..\..\components\drivers\include;..\libraries\APM32F10x_Library\APM32F10x_ETH_Driver\inc;..\..\..\include;board\ports;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc +>>>>>>> Stashed changes @@ -454,8 +459,11 @@ 1 ..\..\..\libcpu\arm\common\atomic_arm.c +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes div0.c 1 diff --git a/bsp/apm32/apm32f407ig-minibroard/.config b/bsp/apm32/apm32f407ig-minibroard/.config index 009a2f8b4b..4f287715f7 100644 --- a/bsp/apm32/apm32f407ig-minibroard/.config +++ b/bsp/apm32/apm32f407ig-minibroard/.config @@ -118,19 +118,7 @@ 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_RT_USING_DFS=y -CONFIG_DFS_USING_POSIX=y -CONFIG_DFS_USING_WORKDIR=y -CONFIG_DFS_FILESYSTEMS_MAX=4 -CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 -CONFIG_DFS_FD_MAX=16 -# CONFIG_RT_USING_DFS_MNTTABLE is not set -# CONFIG_RT_USING_DFS_ELMFAT is not set -# CONFIG_RT_USING_DFS_DEVFS is not set -# CONFIG_RT_USING_DFS_ROMFS is not set -# CONFIG_RT_USING_DFS_CROMFS is not set -# CONFIG_RT_USING_DFS_RAMFS is not set -# CONFIG_RT_USING_DFS_TMPFS is not set +# CONFIG_RT_USING_DFS is not set # CONFIG_RT_USING_FAL is not set # @@ -1003,4 +991,5 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_TMR is not set # CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_CAN is not set # CONFIG_BSP_USING_WDT is not set diff --git a/bsp/apm32/apm32f407ig-minibroard/board/Kconfig b/bsp/apm32/apm32f407ig-minibroard/board/Kconfig index 2f3cacd2df..b8eac74c77 100644 --- a/bsp/apm32/apm32f407ig-minibroard/board/Kconfig +++ b/bsp/apm32/apm32f407ig-minibroard/board/Kconfig @@ -194,6 +194,19 @@ menu "On-chip Peripheral Drivers" endif endif + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + config BSP_USING_CAN2 + bool "Enable CAN2" + default n + endif + config BSP_USING_WDT bool "Enable Watchdog Timer" select RT_USING_WDT diff --git a/bsp/apm32/apm32f407ig-minibroard/board/board.c b/bsp/apm32/apm32f407ig-minibroard/board/board.c index 711ac85898..fccdb10f50 100644 --- a/bsp/apm32/apm32f407ig-minibroard/board/board.c +++ b/bsp/apm32/apm32f407ig-minibroard/board/board.c @@ -52,3 +52,48 @@ void apm32_usart_init(void) GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_3, GPIO_AF_USART2); #endif } + +void apm32_msp_can_init(void *Instance) +{ +#if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) + GPIO_Config_T GPIO_InitStructure; + CAN_T *CANx = (CAN_T *)Instance; + + if (CAN1 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + + RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB); + + /* PB8: CAN1_RX, PB9: CAN1_TX */ + GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9; + GPIO_InitStructure.mode = GPIO_MODE_AF; + GPIO_InitStructure.otype = GPIO_OTYPE_PP; + GPIO_InitStructure.speed = GPIO_SPEED_100MHz; + GPIO_InitStructure.pupd = GPIO_PUPD_UP; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_8, GPIO_AF_CAN1); + GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_9, GPIO_AF_CAN1); + } + else if (CAN2 == CANx) + { + /* When using the CAN2 peripheral, the CAN1 clock must be turned on */ + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2); + + RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB); + + /* PB12: CAN2_RX, PB13: CAN2_TX */ + GPIO_InitStructure.pin = GPIO_PIN_12 | GPIO_PIN_13; + GPIO_InitStructure.mode = GPIO_MODE_AF; + GPIO_InitStructure.otype = GPIO_OTYPE_PP; + GPIO_InitStructure.speed = GPIO_SPEED_100MHz; + GPIO_InitStructure.pupd = GPIO_PUPD_UP; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_12, GPIO_AF_CAN2); + GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_13, GPIO_AF_CAN2); + } +#endif +} diff --git a/bsp/apm32/apm32f407ig-minibroard/board/board.h b/bsp/apm32/apm32f407ig-minibroard/board/board.h index 6aa61cdc92..15d8abcd5c 100644 --- a/bsp/apm32/apm32f407ig-minibroard/board/board.h +++ b/bsp/apm32/apm32f407ig-minibroard/board/board.h @@ -42,6 +42,9 @@ #include "apm32f4xx_iwdt.h" #include "apm32f4xx_wwdt.h" #endif +#if defined(RT_USING_CAN) + #include "apm32f4xx_can.h" +#endif #include "drv_common.h" #include "drv_gpio.h" diff --git a/bsp/apm32/apm32f407ig-minibroard/project.uvoptx b/bsp/apm32/apm32f407ig-minibroard/project.uvoptx index 287920c063..c4d711ceaa 100644 --- a/bsp/apm32/apm32f407ig-minibroard/project.uvoptx +++ b/bsp/apm32/apm32f407ig-minibroard/project.uvoptx @@ -175,11 +175,711 @@ +<<<<<<< Updated upstream Source Group 1 0 0 0 0 +======= + Applications + 1 + 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\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 1 + 0 + 0 + 0 + + 5 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 25 + 2 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\Device\Geehy\APM32F4xx\Source\arm\startup_apm32f40x.s + startup_apm32f40x.s + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_usart.c + apm32f4xx_usart.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_syscfg.c + apm32f4xx_syscfg.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_rcm.c + apm32f4xx_rcm.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_dma.c + apm32f4xx_dma.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_eint.c + apm32f4xx_eint.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_misc.c + apm32f4xx_misc.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_gpio.c + apm32f4xx_gpio.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\Device\Geehy\APM32F4xx\Source\system_apm32f4xx.c + system_apm32f4xx.c + 0 + 0 + +>>>>>>> Stashed changes diff --git a/bsp/apm32/apm32f407ig-minibroard/project.uvprojx b/bsp/apm32/apm32f407ig-minibroard/project.uvprojx index b961a32974..583503cc77 100644 --- a/bsp/apm32/apm32f407ig-minibroard/project.uvprojx +++ b/bsp/apm32/apm32f407ig-minibroard/project.uvprojx @@ -334,8 +334,13 @@ __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, RT_USING_LIBC, APM32F40X, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__ +<<<<<<< Updated upstream applications;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;..\..\..\libcpu\arm\cortex-m4;.;..\..\..\components\finsh;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\APM32F4xx_Library\CMSIS\Include;..\..\..\components\libc\posix\io\poll;..\..\..\components\dfs\include;..\..\..\include;..\..\..\components\drivers\include;..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\inc;..\..\..\libcpu\arm\common;board;..\..\..\components\libc\posix\ipc;..\libraries\Drivers\config;..\libraries\Drivers;..\..\..\components\libc\posix\io\stdio;..\libraries\APM32F4xx_Library\Device\Geehy\APM32F4xx\Include;..\..\..\components\libc\compilers\common\include;..\libraries\APM32F4xx_Library\APM32F4xx_ETH_Driver\inc +======= + + ..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m4;..\..\..\libcpu\arm\common;..\libraries\Drivers;..\..\..\components\drivers\include;..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\inc;..\..\..\components\libc\posix\io\stdio;.;..\..\..\components\finsh;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\Drivers\config;..\libraries\APM32F4xx_Library\CMSIS\Include;..\libraries\APM32F4xx_Library\Device\Geehy\APM32F4xx\Include;..\libraries\APM32F4xx_Library\APM32F4xx_ETH_Driver\inc;..\..\..\components\drivers\include;board;applications;..\..\..\include;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc +>>>>>>> Stashed changes @@ -453,8 +458,11 @@ 1 ..\..\..\libcpu\arm\common\atomic_arm.c +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes div0.c 1 @@ -588,6 +596,7 @@ +<<<<<<< Updated upstream Filesystem @@ -619,6 +628,8 @@ +======= +>>>>>>> Stashed changes Finsh @@ -647,6 +658,7 @@ 1 ..\..\..\components\finsh\cmd.c +<<<<<<< Updated upstream @@ -654,6 +666,8 @@ 1 ..\..\..\components\finsh\msh_file.c +======= +>>>>>>> Stashed changes @@ -781,6 +795,11 @@ + + apm32f4xx_dma.c + 1 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_dma.c + apm32f4xx_eint.c 1 diff --git a/bsp/apm32/apm32f407ig-minibroard/rtconfig.h b/bsp/apm32/apm32f407ig-minibroard/rtconfig.h index 5e784bfe28..5aa1dc68b5 100644 --- a/bsp/apm32/apm32f407ig-minibroard/rtconfig.h +++ b/bsp/apm32/apm32f407ig-minibroard/rtconfig.h @@ -74,12 +74,6 @@ #define MSH_USING_BUILT_IN_COMMANDS #define FINSH_USING_DESCRIPTION #define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 4 -#define DFS_FILESYSTEM_TYPES_MAX 4 -#define DFS_FD_MAX 16 /* Device Drivers */ diff --git a/bsp/apm32/apm32f407zg-evalboard/.config b/bsp/apm32/apm32f407zg-evalboard/.config index a798ee1830..4337a1fde1 100644 --- a/bsp/apm32/apm32f407zg-evalboard/.config +++ b/bsp/apm32/apm32f407zg-evalboard/.config @@ -1002,6 +1002,7 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_TMR is not set # CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_CAN is not set # CONFIG_BSP_USING_SDIO is not set # CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_USING_WDT is not set diff --git a/bsp/apm32/apm32f407zg-evalboard/board/Kconfig b/bsp/apm32/apm32f407zg-evalboard/board/Kconfig index 5ed6c6d480..d7cc13ec8a 100644 --- a/bsp/apm32/apm32f407zg-evalboard/board/Kconfig +++ b/bsp/apm32/apm32f407zg-evalboard/board/Kconfig @@ -254,6 +254,19 @@ menu "On-chip Peripheral Drivers" endif endif + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + config BSP_USING_CAN2 + bool "Enable CAN2" + default n + endif + config BSP_USING_SDIO bool "Enable SDIO" select RT_USING_SDIO diff --git a/bsp/apm32/apm32f407zg-evalboard/board/board.c b/bsp/apm32/apm32f407zg-evalboard/board/board.c index 99741b36ba..6e067f7184 100644 --- a/bsp/apm32/apm32f407zg-evalboard/board/board.c +++ b/bsp/apm32/apm32f407zg-evalboard/board/board.c @@ -205,6 +205,7 @@ void apm32_msp_eth_init(void *instance) void apm32_msp_sdio_init(void *Instance) { +#ifdef BSP_USING_SDIO GPIO_Config_T GPIO_InitStructure; /* Enable the GPIO Clock */ @@ -236,4 +237,50 @@ void apm32_msp_sdio_init(void *Instance) /* Disable the SDIO peripheral reset */ RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_SDIO); +#endif +} + +void apm32_msp_can_init(void *Instance) +{ +#if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) + GPIO_Config_T GPIO_InitStructure; + CAN_T *CANx = (CAN_T *)Instance; + + if (CAN1 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + + RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB); + + /* PB8: CAN1_RX, PB9: CAN1_TX */ + GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9; + GPIO_InitStructure.mode = GPIO_MODE_AF; + GPIO_InitStructure.otype = GPIO_OTYPE_PP; + GPIO_InitStructure.speed = GPIO_SPEED_100MHz; + GPIO_InitStructure.pupd = GPIO_PUPD_UP; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_8, GPIO_AF_CAN1); + GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_9, GPIO_AF_CAN1); + } + else if (CAN2 == CANx) + { + /* When using the CAN2 peripheral, the CAN1 clock must be turned on */ + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2); + + RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB); + + /* PB12: CAN2_RX, PB13: CAN2_TX */ + GPIO_InitStructure.pin = GPIO_PIN_12 | GPIO_PIN_13; + GPIO_InitStructure.mode = GPIO_MODE_AF; + GPIO_InitStructure.otype = GPIO_OTYPE_PP; + GPIO_InitStructure.speed = GPIO_SPEED_100MHz; + GPIO_InitStructure.pupd = GPIO_PUPD_UP; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_12, GPIO_AF_CAN2); + GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_13, GPIO_AF_CAN2); + } +#endif } diff --git a/bsp/apm32/apm32f407zg-evalboard/project.uvoptx b/bsp/apm32/apm32f407zg-evalboard/project.uvoptx index ed92d0cba5..9e1f4a4355 100644 --- a/bsp/apm32/apm32f407zg-evalboard/project.uvoptx +++ b/bsp/apm32/apm32f407zg-evalboard/project.uvoptx @@ -180,6 +180,701 @@ 0 0 0 +<<<<<<< Updated upstream +======= + + 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\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 1 + 0 + 0 + 0 + + 5 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 25 + 2 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\Device\Geehy\APM32F4xx\Source\arm\startup_apm32f40x.s + startup_apm32f40x.s + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_usart.c + apm32f4xx_usart.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_syscfg.c + apm32f4xx_syscfg.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_rcm.c + apm32f4xx_rcm.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_dma.c + apm32f4xx_dma.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_eint.c + apm32f4xx_eint.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_misc.c + apm32f4xx_misc.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\src\apm32f4xx_gpio.c + apm32f4xx_gpio.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\libraries\APM32F4xx_Library\Device\Geehy\APM32F4xx\Source\system_apm32f4xx.c + system_apm32f4xx.c + 0 + 0 + +>>>>>>> Stashed changes diff --git a/bsp/apm32/apm32f407zg-evalboard/project.uvprojx b/bsp/apm32/apm32f407zg-evalboard/project.uvprojx index 1d87afb15c..ac60ba53b5 100644 --- a/bsp/apm32/apm32f407zg-evalboard/project.uvprojx +++ b/bsp/apm32/apm32f407zg-evalboard/project.uvprojx @@ -335,8 +335,13 @@ __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, RT_USING_LIBC, APM32F40X, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__ +<<<<<<< Updated upstream board;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;..\..\..\include;..\..\..\components\finsh;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;.;..\libraries\APM32F4xx_Library\CMSIS\Include;applications;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\include;..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\inc;..\..\..\libcpu\arm\common;..\..\..\components\libc\posix\ipc;..\libraries\Drivers\config;..\libraries\Drivers;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\include;board\ports;..\libraries\APM32F4xx_Library\APM32F4xx_ETH_Driver\inc;..\libraries\APM32F4xx_Library\Device\Geehy\APM32F4xx\Include +======= + + ..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension;..\..\..\components\finsh;..\..\..\libcpu\arm\cortex-m4;..\..\..\libcpu\arm\common;..\libraries\Drivers;..\..\..\components\drivers\include;..\libraries\APM32F4xx_Library\APM32F4xx_StdPeriphDriver\inc;..\..\..\components\libc\posix\io\stdio;board;.;board\ports;..\..\..\components\drivers\include;..\libraries\Drivers\config;..\libraries\APM32F4xx_Library\CMSIS\Include;..\libraries\APM32F4xx_Library\Device\Geehy\APM32F4xx\Include;..\libraries\APM32F4xx_Library\APM32F4xx_ETH_Driver\inc;..\..\..\components\drivers\include;..\..\..\include;..\..\..\components\libc\compilers\common\include;applications;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\posix\ipc +>>>>>>> Stashed changes @@ -454,8 +459,11 @@ 1 ..\..\..\libcpu\arm\common\atomic_arm.c +<<<<<<< Updated upstream +======= +>>>>>>> Stashed changes div0.c 1 diff --git a/bsp/apm32/apm32s103vb-miniboard/.config b/bsp/apm32/apm32s103vb-miniboard/.config new file mode 100644 index 0000000000..583344ae7d --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/.config @@ -0,0 +1,999 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 + +# +# kservice optimization +# +CONFIG_RT_KSERVICE_USING_STDLIB=y +# CONFIG_RT_KSERVICE_USING_STDLIB_MEMORY 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_DEBUG=y +# CONFIG_RT_DEBUG_COLOR is not set +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG 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_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_PAGE_MAX_ORDER=11 +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x50000 +# CONFIG_RT_USING_STDC_ATOMIC is not set +# CONFIG_RT_USING_CACHE is not set +CONFIG_RT_USING_HW_ATOMIC=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M3=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +# CONFIG_RT_USING_DFS is not set +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +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=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB is not set +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# C/C++ and POSIX layer +# +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set + +# +# 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_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# 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_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_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 + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_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_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_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 + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + +# +# miscellaneous packages +# + +# +# project laboratory +# + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_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_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_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR 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_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_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_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_SENSORLAB 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_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_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 + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_U8GLIB_ARDUINO is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP 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 + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# +CONFIG_SOC_FAMILY_APM32=y +CONFIG_SOC_SERIES_APM32S1=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_APM32S103VB=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_USB_TO_USART=y +# CONFIG_BSP_USING_SPI_FLASH is not set + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_I2C is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_TMR is not set +# CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set +# CONFIG_BSP_USING_WDT is not set diff --git a/bsp/apm32/apm32s103vb-miniboard/.gitignore b/bsp/apm32/apm32s103vb-miniboard/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/apm32/apm32s103vb-miniboard/Kconfig b/bsp/apm32/apm32s103vb-miniboard/Kconfig new file mode 100644 index 0000000000..7a400db91f --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/Kconfig @@ -0,0 +1,22 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" + diff --git a/bsp/apm32/apm32s103vb-miniboard/README.md b/bsp/apm32/apm32s103vb-miniboard/README.md new file mode 100644 index 0000000000..20eda1bc35 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/README.md @@ -0,0 +1,118 @@ +# APM32S103VB MINI BOARD BSP 说明 + +## 简介 + +本文档为 APM32S103VB MINI 开发板(MINI BOARD)的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。 + +## 开发板介绍 + +APM32S103VB MINI BOARD,采用标准JTAG/SWD调试接口,引出了全部的IO。开发板外观如下图所示: + +![board](figures/APM32S103VB-MINI.png) + +- 有关开发板和芯片的详情可至极海官网查阅。[官网开发板链接 ](https://www.geehy.com/support/apm32?id=192) + + +该开发板常用 **板载资源** 如下: + +- MCU:APM32S103VBT6,主频 96MHz,128KB FLASH ,36KB RAM +- 外部 RAM:无 +- 外部 FLASH:无 +- 常用外设 + - LED:2个,(黄色,PE5/PE6) + - 按键:2个,K1(PA1),K2(PA0) +- 常用接口:RS232转串口、USB SLAVE +- 调试接口:标准 JTAG/SWD + + + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------- | :----------: | :------------------------------------ | +| RS232转串口 | 支持 | 使用 UART1/ UART2(通过跳线选择) | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PG15 ---> PIN: 0, 1...108 | +| UART | 支持 | UART1/2 | +| ADC | 支持 | ADC1/2 | +| DAC | 支持 | DAC1 | +| RTC | 支持 | 支持外部晶振和内部低速时钟 | +| TMR | 支持 | TMR1/2/3/4 | +| PWM | 支持 | TMR3 ->CH1/2/3/4 | +| I2C | 支持 | 软件I2C | +| SPI | 支持 | SPI1/2 | +| WDT | 支持 | IWDT | +| Flash | 支持 | 已适配 [FAL](https://github.com/RT-Thread-packages/fal) | +| CAN | 支持 | CAN1/CAN2 | + +## 使用说明 + +本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + + +### 快速上手 + +本 BSP 为开发者提供MDK5 工程。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 +- 方式一:MDK + + 双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 J-Link 仿真器下载程序,在通过 J-Link 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +- 方式二:J-Flash下载 + + 通过ENV工具的scons指令或MDK编译出bin文件后,再使用J-Flash工具将bin文件下载至开发板即可,大致步骤如下: + +##### 1、建立J-Flash工程 + +![board](figures/JFlash_Leader_01.png) + +**注意**:步骤4选择芯片型号时,要根据自己的开发板所用的芯片型号进行选择。比如本开发板,则选择对应的 **APM32S103VBT6** 。 + +##### 2、连接开发板 + +![board](figures/JFlash_Leader_02.png) +##### 3、将bin文件拖至工程,起始地址设为0x8000000 +![board](figures/JFlash_Leader_03.png) +##### 4、点击下载 +![board](figures/JFlash_Leader_04.png) + +#### 运行结果 + +下载程序成功之后,系统会自动运行,LED 闪烁 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.1.0 build Aug 20 2021 + 2006 - 2021 Copyright by rt-thread team +msh > +``` +## 注意事项 + +- 可在极海官方网站进行所需资料下载,如pack安装包和MINI开发板原理图等(www.geehy.com); + +## 联系人信息 + +-[abbbcc ](https://gitee.com/abbbcc) + +-[stevetong459 ](https://github.com/stevetong459) + +-[luobeihai](https://github.com/luobeihai) \ No newline at end of file diff --git a/bsp/apm32/apm32s103vb-miniboard/SConscript b/bsp/apm32/apm32s103vb-miniboard/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/apm32/apm32s103vb-miniboard/SConstruct b/bsp/apm32/apm32s103vb-miniboard/SConstruct new file mode 100644 index 0000000000..9c32515bb7 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/SConstruct @@ -0,0 +1,60 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rtthread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +apm32_library = 'APM32S10x_Library' +rtconfig.BSP_LIBRARY_TYPE = apm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, apm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/apm32/apm32s103vb-miniboard/applications/SConscript b/bsp/apm32/apm32s103vb-miniboard/applications/SConscript new file mode 100644 index 0000000000..ca2395451a --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/apm32/apm32s103vb-miniboard/applications/main.c b/bsp/apm32/apm32s103vb-miniboard/applications/main.c new file mode 100644 index 0000000000..2d9fc6f5ac --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/applications/main.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-27 luobeihai first version + */ + +#include +#include +#include + +/* defined the LED2 pin: PE6 */ +#define LED2_PIN GET_PIN(E, 6) + +int main(void) +{ + uint32_t sysclock = 0; + /* set LED2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + /* Print system clock */ + sysclock = RCM_ReadSYSCLKFreq(); + rt_kprintf("System Clock: %d\n", sysclock); + + while (1) + { + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} diff --git a/bsp/apm32/apm32s103vb-miniboard/board/Kconfig b/bsp/apm32/apm32s103vb-miniboard/board/Kconfig new file mode 100644 index 0000000000..8f19663d00 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/board/Kconfig @@ -0,0 +1,213 @@ +menu "Hardware Drivers Config" + +config SOC_APM32S103VB + bool + select SOC_SERIES_APM32S1 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_USB_TO_USART + bool "Enable USB TO USART (uart1)" + select BSP_USING_UART + select BSP_USING_UART1 + default y + + config BSP_USING_SPI_FLASH + bool "Enable SPI FLASH (W25Q16 spi2)" + select BSP_USING_SPI + select BSP_USING_SPI2 + select RT_USING_SFUD + select RT_SFUD_USING_SFDP + default n + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + config BSP_USING_UART2 + bool "Enable UART2" + default n + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + endif + + menuconfig BSP_USING_I2C + bool "Enable I2C BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C + config BSP_USING_I2C1 + bool "Enable I2C1 BUS" + if BSP_USING_I2C1 + comment "Notice: PB6 --> 22; PB7 --> 23" + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 0 63 + default 22 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 0 63 + default 23 + endif + config BSP_USING_I2C2 + bool "Enable I2C2 BUS" + if BSP_USING_I2C2 + comment "Notice: PA0 --> 0; PA1 --> 1" + config BSP_I2C2_SCL_PIN + int "i2c2 scl pin number" + range 0 63 + default 22 + config BSP_I2C2_SDA_PIN + int "I2C2 sda pin number" + range 0 63 + default 23 + endif + config BSP_USING_I2C3 + bool "Enable I2C3 BUS" + if BSP_USING_I2C3 + comment "Notice: PB0 --> 16; PB1 --> 17" + config BSP_I2C3_SCL_PIN + int "i2c3 scl pin number" + range 0 63 + default 8 + config BSP_I2C3_SDA_PIN + int "I2C3 sda pin number" + range 0 63 + default 41 + endif + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1" + default n + + config BSP_USING_SPI2 + bool "Enable SPI2" + default n + endif + + menuconfig BSP_USING_TMR + bool "Enable Timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TMR + config BSP_USING_TMR1 + bool "Enable TMR1" + default n + + config BSP_USING_TMR2 + bool "Enable TMR2" + default n + + config BSP_USING_TMR3 + bool "Enable TMR3" + default n + + config BSP_USING_TMR4 + bool "Enable TMR4" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable PWM" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM3 + bool "Enable timer3 output PWM" + default n + if BSP_USING_PWM3 + config BSP_USING_PWM3_CH1 + bool "Enable PWM3 channel1" + default n + + config BSP_USING_PWM3_CH2 + bool "Enable PWM3 channel2" + default n + + config BSP_USING_PWM3_CH3 + bool "Enable PWM3 channel3" + default n + + config BSP_USING_PWM3_CH4 + bool "Enable PWM3 channel4" + default n + endif + endif + + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + config BSP_USING_CAN2 + bool "Enable CAN2" + default n + endif + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + +endmenu + +endmenu diff --git a/bsp/apm32/apm32s103vb-miniboard/board/SConscript b/bsp/apm32/apm32s103vb-miniboard/board/SConscript new file mode 100644 index 0000000000..65b4734b89 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/board/SConscript @@ -0,0 +1,34 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +''') + +if GetDepend(['BSP_USING_SPI_FLASH']): + src += Glob('ports/spi_flash_init.c') + +path = [cwd] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.PLATFORM in ['armcc', 'armclang']: + src += [startup_path_prefix + '/APM32S10x_Library/Device/Geehy/APM32S10x/Source/arm/startup_apm32s10x_md.s'] + +if rtconfig.PLATFORM in ['iccarm']: + src += [startup_path_prefix + '/APM32S10x_Library/Device/Geehy/APM32S10x/Source/iar/startup_apm32s10x_md.s'] + +if rtconfig.PLATFORM in ['gcc']: + src += [startup_path_prefix + '/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/startup_apm32s10x_md.S'] + +# You can select chips from the list above +CPPDEFINES = ['APM32S10X_MD'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +Return('group') diff --git a/bsp/apm32/apm32s103vb-miniboard/board/board.c b/bsp/apm32/apm32s103vb-miniboard/board/board.c new file mode 100644 index 0000000000..ee6ba6c6a0 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/board/board.c @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-27 luobeihai first version + */ + +#include "board.h" + +void apm32_usart_init(void) +{ + GPIO_Config_T GPIO_ConfigStruct; + +#ifdef BSP_USING_UART1 + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_USART1); + + GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP; + GPIO_ConfigStruct.pin = GPIO_PIN_9; + GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); + + GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU; + GPIO_ConfigStruct.pin = GPIO_PIN_10; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); +#endif + +#ifdef BSP_USING_UART2 + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2); + + GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP; + GPIO_ConfigStruct.pin = GPIO_PIN_2; + GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); + + GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU; + GPIO_ConfigStruct.pin = GPIO_PIN_3; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); +#endif +} + +/** + * apm32 timer gpio init + * + */ +void apm32_msp_timer_init(void *Instance) +{ +#ifdef BSP_USING_PWM3 + GPIO_Config_T gpio_config; + TMR_T *tmr_x = (TMR_T *)Instance; + + if (tmr_x == TMR3) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOC | RCM_APB2_PERIPH_AFIO); + + GPIO_ConfigPinRemap(GPIO_FULL_REMAP_TMR3); + + /* TMR3 channel 1 gpio config */ + gpio_config.pin = GPIO_PIN_6; + gpio_config.mode = GPIO_MODE_AF_PP; + gpio_config.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 2 gpio config */ + gpio_config.pin = GPIO_PIN_7; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 3 gpio config */ + gpio_config.pin = GPIO_PIN_8; + GPIO_Config(GPIOC, &gpio_config); + + /* TMR3 channel 4 gpio config */ + gpio_config.pin = GPIO_PIN_9; + GPIO_Config(GPIOC, &gpio_config); + } +#endif +} + +/** + * apm32 spi gpio init + * + */ +void apm32_msp_spi_init(void *Instance) +{ +#ifdef BSP_USING_SPI + GPIO_Config_T gpioConfig; + SPI_T *spi_x = (SPI_T *)Instance; + + if(spi_x == SPI2) + { + /* Enable related Clock */ + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_SPI2); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + /* Configure FLASH_SPI pins: SCK */ + gpioConfig.pin = GPIO_PIN_13; + gpioConfig.mode = GPIO_MODE_AF_PP; + gpioConfig.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &gpioConfig); + + /* Configure FLASH_SPI pins: MOSI */ + gpioConfig.pin = GPIO_PIN_15; + GPIO_Config(GPIOB, &gpioConfig); + + /* Configure FLASH_SPI pins: MISO */ + gpioConfig.pin = GPIO_PIN_14; + gpioConfig.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &gpioConfig); + } +#endif +} + +void apm32_msp_can_init(void *Instance) +{ +#if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) + GPIO_Config_T GPIO_InitStructure; + CAN_T *CANx = (CAN_T *)Instance; + + if (CAN1 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOD); + + GPIO_ConfigPinRemap(GPIO_REMAP2_CAN1); + + /* CAN1 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_1; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOD, &GPIO_InitStructure); + + /* CAN1 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_0; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOD, &GPIO_InitStructure); + } + else if (CAN2 == CANx) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + + GPIO_ConfigPinRemap(GPIO_REMAP_CAN2); + + /* CAN2 Tx */ + GPIO_InitStructure.pin = GPIO_PIN_6; + GPIO_InitStructure.mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.speed = GPIO_SPEED_50MHz; + GPIO_Config(GPIOB, &GPIO_InitStructure); + + /* CAN2 Rx */ + GPIO_InitStructure.pin = GPIO_PIN_5; + GPIO_InitStructure.mode = GPIO_MODE_IN_FLOATING; + GPIO_Config(GPIOB, &GPIO_InitStructure); + } +#endif +} diff --git a/bsp/apm32/apm32s103vb-miniboard/board/board.h b/bsp/apm32/apm32s103vb-miniboard/board/board.h new file mode 100644 index 0000000000..d1906e7189 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/board/board.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-27 luobeihai first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include + +#include "apm32s10x_gpio.h" +#include "apm32s10x_rcm.h" +#include "apm32s10x_misc.h" +#include "apm32s10x_rcm.h" +#include "apm32s10x_eint.h" +#include "apm32s10x_usart.h" +#include "apm32s10x_dma.h" + +#if defined(RT_USING_ADC) + #include "apm32s10x_adc.h" +#endif +#if defined(RT_USING_DAC) + #include "apm32s10x_dac.h" +#endif +#if defined(RT_USING_RTC) + #include "apm32s10x_rtc.h" + #include "apm32s10x_pmu.h" +#endif +#if defined(RT_USING_SPI) + #include "apm32s10x_spi.h" +#endif +#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) + #include "apm32s10x_tmr.h" +#endif +#if defined(RT_USING_WDT) + #include "apm32s10x_iwdt.h" + #include "apm32s10x_wwdt.h" +#endif +#if defined(BSP_USING_ON_CHIP_FLASH) + #include "apm32s10x_fmc.h" +#endif +#if defined(RT_USING_CAN) + #include "apm32s10x_can.h" +#endif + +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define APM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define APM32_FLASH_SIZE (128 * 1024) +#define APM32_FLASH_END_ADDRESS ((uint32_t)(APM32_FLASH_START_ADRESS + APM32_FLASH_SIZE)) + +/* Internal SRAM memory size[Kbytes] <6-128>, Default: 128 */ +#define APM32_SRAM_SIZE 36 +#define APM32_SRAM_END (0x20000000 + APM32_SRAM_SIZE * 1024) + +#if defined(__ARMCC_VERSION) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END APM32_SRAM_END + +void SystemClock_Config(void); + +void apm32_usart_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.icf b/bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.icf new file mode 100644 index 0000000000..a92ef944ee --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/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__ = 0x0801FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20008FFF; +/*-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}; diff --git a/bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.lds b/bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.lds new file mode 100644 index 0000000000..18148b570d --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.lds @@ -0,0 +1,163 @@ +/* + * linker script for APM32S10x with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 128K /* 128K flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 36K /* 36K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x400; + +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 = .; + _start_address_init_data = .; + } > 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 = . ; + _start_address_data = .; + + *(.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 = . ; + _end_address_data = .; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + _end_stack = .; + } >RAM + + __bss_start = .; + _start_address_bss = .; + .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_address_bss = .; + + _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/apm32/apm32s103vb-miniboard/board/linker_scripts/link.sct b/bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.sct new file mode 100644 index 0000000000..a7de5a193e --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/board/linker_scripts/link.sct @@ -0,0 +1,17 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00020000 { ; load region size_region + ER_IROM1 0x08000000 0x00020000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00009000 { ; RW data + .ANY (+RW +ZI) + } +} + + diff --git a/bsp/apm32/apm32s103vb-miniboard/board/ports/fal_cfg.h b/bsp/apm32/apm32s103vb-miniboard/board/ports/fal_cfg.h new file mode 100644 index 0000000000..ebcf747863 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/board/ports/fal_cfg.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ + +#include +#include + +extern const struct fal_flash_dev apm32_onchip_flash; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ +{ \ + &apm32_onchip_flash, \ +} +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG + +/* partition table */ +#define FAL_PART_TABLE \ +{ \ + {FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 112 * 1024, 0}, \ + {FAL_PART_MAGIC_WROD, "param", "onchip_flash", 112 * 1024, 16 * 1024, 0}, \ +} +#endif /* FAL_PART_HAS_TABLE_CFG */ +#endif /* _FAL_CFG_H_ */ diff --git a/bsp/apm32/apm32s103vb-miniboard/board/ports/spi_flash_init.c b/bsp/apm32/apm32s103vb-miniboard/board/ports/spi_flash_init.c new file mode 100644 index 0000000000..9b1ec081f3 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/board/ports/spi_flash_init.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#include +#include "spi_flash.h" +#include "spi_flash_sfud.h" +#include "drv_spi.h" + +#if defined(BSP_USING_SPI_FLASH) +static int rt_hw_spi_flash_init(void) +{ + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + rt_hw_spi_device_attach("spi2", "spi20", GPIOB, GPIO_PIN_12); + + if (RT_NULL == rt_sfud_flash_probe("W25Q16", "spi20")) + { + return -RT_ERROR; + } + + return RT_EOK; +} +INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); +#endif diff --git a/bsp/apm32/apm32s103vb-miniboard/figures/APM32S103VB-MINI.png b/bsp/apm32/apm32s103vb-miniboard/figures/APM32S103VB-MINI.png new file mode 100644 index 0000000000000000000000000000000000000000..02aaf0561d359af310e070a93c02eba5e22e26bd GIT binary patch literal 629147 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

$al7s9&$XV;Z|8Ek62K@F7^DIX+=ep;mTIG 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 dW~#oRc<`l;U|uWw#{@Zr-R`1HHq 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%0ABNGU~=2hpMkm>;Ey@o{TS3?ZRbRo56A8XjSy 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 Ia%N%w2dme0%m4rY literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_01.png b/bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_01.png new file mode 100644 index 0000000000000000000000000000000000000000..5640216ae5b677bc49e77e3995cdf3a00688723b GIT binary patch literal 47629 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 literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_02.png b/bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_02.png new file mode 100644 index 0000000000000000000000000000000000000000..93984c1a901979cc09743b4acd016aafb96c1d6e GIT binary patch literal 9973 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 literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_03.png b/bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_03.png new file mode 100644 index 0000000000000000000000000000000000000000..6280b5d664164903c9e7c8b4203306b03918d7bf GIT binary patch literal 3590 zcmZWscTm$?)BaHu0g)ntf(VKf=_-mq0;r*PrT5-JdLRL5mnucNbfhLo3juDFY!1{vRi9k=1Cgx1g2&U7G=sAbe{h#u`_(9MEP<1G$ zjcWII{`@XokL>p?BRU7)Cq*#zyPpP$QEs@enlPP9tzCW7vAerFf9|U|$~7pWJ_;bp zXygXT^Dmsv?-#%rDcet}<(TEs5I)DulCsRQvN8cgS(zah`x~(l2r-S*!iKxzLj2y@ zMC)9lZF(6E6hHTb+f-y4vL~NkI-yp>A0v{k$}F$V%wy<_EQ1~F%&PGw_uGt>pB`nP z#fMoT!;g#^D8XMcOFo;BwBJ`B-4i=;n-egk;2LWfh1e)w?rXY8_$IENbYEFl7d!&U zG=3Uy^n%z-zf5XqX}Kmhw&oo8#{_T2sJ-&V6peV3b<43JqGU}nxjzb)OAMD_e8L}i zQtp`9$A^fz-DcwUF5pK-AK90+T%vvgvaF1}(o->LDX1m&b6g`P@pJeW*P9r0D;wqw zx7T1p+$7#v^5(rqRbHyb*~J&$G$U?GjSD~M99dHmXm^OGef;UZO9`U-sCkG^(ounC zq9`r5C-6sp=EhDj=S)H*7ByjByz?YKT+A%9URy(_Ya+bZCVIE{et@YlQjUICk9BSu z9g!Y?&+;606E*DgRBT{VDC~A7|(`cq|_no zeVTPSphEtU8-C>+d0(xBX@H;>Z9@+IMcM_cn=K-TSa%P)2AX;8`@zYkQ)g?sOJ+-e z4d2Kof=}vXq1jcN1p0Kuc8_=EQ)>ZSm9T{)STov-wh_8}*74DBumX&UuXMO#tJ2qA zgRD_a?utpxfOz9pZ}Cj!MDbcC0KdUBaXvxJxvsRfN-V5w>@*d8=Jg1 zb1bVrZ8Z1$NF^73qeVL#cLy{VUi;Sl^KL=CN}OAj?UnK8jIM|zB?>|i=ZIT_?{kvn z4#shku5l_sKvq&KBG~e9m z>;`b=6u@oV=48plhDuJO7!}^#4U)k5w7|Hs2~japh`wr>{5)~#!=`I~O*BlE7T>My zz{We@wS7Smd|2h-b*J?R3iz$r8~D>+oCyG@>*iz@d{sH{NVNXgDnnN1W4Hw97_jn+ z%4u^pC0x>~<@lzLdloWzTjc8WW{)p!RxWzjFtU0vzt3{_U}*f4tugw0b1jzz!GCGL zDG=+_Xe1Qt&IBybTAORTp81{d z2P^>#(k3M_9pmaJBs&46^!8NWL#!hoVm$m4DR>n0t*(qSc_J3qCVJ zv~%f+hmumA2Difr(k-rG2;VzNU4JlcGK4mYgZZG=?Lq6sJeE_eADQ{lBbGF1xfi6C z!#K0}XjP>^^wBhWkFymQ#q=bCt)(X`sw^Rq*OOTxvrqe`<2^;oqUhV<{{S?(>3VlA zV9m$RAvfTDcMl%SWEcNS{6GAE11U7Eu3>CZryHfj9dg%qyUA5+7LhV~w;2l+%e%@5qMJfBf#(6dL*3)}BmmXmYR3 zj^}%g6eIEKflJlbTvQINPe2jP$Qg+g^9U@KXYx=*UsO@>Fi&sFkXR3sT=&P?PJiD!WSmV@>n)6a|C_Z3ABf-W z$uN`oWAgK_5>o2OQ365jZpm#;LJ8BSp#o`I!jrMypZJDLhj3u)(YJs>&aYJIutW>{ zxh7ZKvcmHKNNYuULYHcut*%MJ+gzc+T_th2nn!e9MN^CraXF@(r?}$&a9ZB46_=B# zV3xYn?MSnrC;OM@T!M_iN|i1nR*@Lf*5RFPAb7Id*}6~$Ab>}IfBNP5L>0m7qJZTQ zE6ncnFicySTN%GoX!B5uAqy*$w7$;>CN4(ENi zs~Yj;Skw7(A4)D7L7X#5gA@ImnD>m7lNx?DZYj>+Jj!o){B#ZucGAD-GR ztgmmG2ctUt8+DY|f8_4pAH*A|))&)vaeh5RMUmV@THNyBu({nMFoZ!Ju0M%DOr?8x%*8M4+eLCuZ*(4!sfi8pzTx%~modM9CbP^vabOdlYxeAijXAuhk`w zBfPFCJ1tliY46~3?{@TFTvy1UlKFk6@rkK$*KS3d&!UTt@*uVhdf$DGax0$#XfHWk zzP$@uASre%hd#@x_Oo~~t(N#c@Sp<%hP-3{vIZC${kGxf^-gJ8>dXPQr+g(tUC?W=Z(6D3=SMipO-NQ^3ISLUnmgmO7#>UDZZ|HW`>Gm3Eq zH4#upslQ`u|Ewrt<8Q7HOvZUzx4>ef1}ut@3eV&xE_45X@DpCE?@;^7-U?%5<=zgc zm-!sS#=$xViSJOlE=ltbiBy992gvL4K_Gj!19@hpstambh6Mr@)>qA{dQtwUq z7!ABiR>W;k-RcF=DkP9=jjWo>WCM}O=V55>+T$9FF$JiSx#i-%X4Xp z#u|)T;FG4eF9RUY4dv$QAcTdy;WbFdf3ZceVoK(H>zooq;|n&&Ktfm#=WB9>^9^k89deB&-`s{Ydzr? z+FOcgy<+pyC56l_2etsH!+QSowlAj%8;uVIx;+Gm3|SDevo8^QqIHl{1Xd5L;>3Du z%~KBTMPNf#_m_i7@6*O(kU zjDC)RTR1u8k84s8XuWSM1@WbEn=duDOQW)n>*Fe#uD>(Sf4OY%pM>;}yQTXIy|rs= zj!xu_L@YcGyd9nBn-3?bR&Tvs%?kYmft$ z$KJ;~lQUvjo6e*zL^-MGWUmhMP<6AEI@Chp2b-NjCSqSjK?=&FMru>MZKDegFP1g( Vb%!*Mdq_PTpe(NeseEA(`hWN36S@EZ literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_04.png b/bsp/apm32/apm32s103vb-miniboard/figures/JFlash_Leader_04.png new file mode 100644 index 0000000000000000000000000000000000000000..b133313482c10209e4b442e6affb6607cfc7d2c1 GIT binary patch literal 12434 zcmXYY1z1~6({^x*yL)kWw+1Lhio0vk;8rY9?7>^yDNu^LySo)A1b26bpnv*)|6Iw* z$>t=xJF`3Io_i*dYAW)WXk=&r002|rldJ{+0H+B%UqXe49g{W%BVaG@Tt4Z$0{~e4 z|DJHkY*^&5MqCd$Jr7OiFCO0JZq@)zCp#B&cMof0;>lG2fCiu-`$5Ym>ognep$SPo z@47dz>*lY}{T*uRity3xzdY%1I<%1$om3hEqlG2J6_ar3N3F1##BWVy zO}veWVFzrxD}&>zz|fI#;)^xexc#{FDIRwOzFf;k_i>jur;FUp2dQ_G7-(U5xU5dY zroEgOqu`6^yD16mIrx;Ri(zwg=P)KT1(zN689bod6g+S4_X8>wqmj$+l<2ycixqn3i z*Ph0qP)!NeQ3vM<^xkU6g zJbZIZQByCApbr67UhoN1iTHwQl<`Q|QnpWvqJBe@;dF!1A*7q?s!w$O!p;z--ohqQ zb;d9v@wn#fvq#K`!4=cz-sK9PGZMi1*9(QH3j?u~L7)VR*>?w2KH zh6di8_PLD`H&_2k=Wv2t?#_7M6ZKlp!1WJqc$tv?4a1uGb55E~MQkdE#9{dh4{We@ z*n>h1TS+yDa_I`8a)bN3rx@PlUf$OWb#ZTv{5k6^ioSWT@(N%fP1{V!&~JkAP6rVR zCWd_6+?`V$@p;xR%a74lls0(b@Zud<$F0@Z^i+;=x)@$^3iRc@Ox%dniow7QC_;oD3YqIMJ-wXj7@-OuvGsNPQsCaL`7L%qnpEMD+MBA1_p?ZP zEHz!~w_5)DEzVpL7KL-3oF1P_C-e-udL`*P9q{G{xV)lucA=N*H*)r%$8WWG!hI0C z$a2YZ@7dX9F%#k1^!E!|XYK#D4npO8POXw$s}?Fs#`c4^dE>hG4WuAw@(7hTKMMeH zUeG(shj_AA$Pku=dt?_`ruP=l!y*C;P5$v9(!HC2g)54e(Nzv(1 zM~dmjaXDmrC7_#hHjH@x-W(CS#sAAHTzURfZnKZ~q#Wp+&5eD}3}Bx?Su#sYnyMr; zcYg<9pZoCid&d0eC#Y{3Q;%rlh)wj3!s4dB9xYrjt8-jzt;6#mXh*Q<*M50~@(8?M z&m8vdX}n+%PJ19A7YqO(yy1g|W8ZF-0K!*vjDcaBZ^(fCS0d@*=Db?UI2~cKZ>`x5 zkRIr7w;-~uBK<{Dx1v-gS8QU`q;6NdxI~xnF9=!av8ygw{SIPCEKN|S_IA#Mh_7SS zm8eA@35;IegSbJOOBO9|s-WWwY60HeT>Cm#_Z6|#M&@isFexq@^0St6{J%V`26#q1XU5+G%DZjv3x#mFav9Ll#LHJotc$9rOBz+ zOb<6RjSqvj)xljK)m70L{GD@g+W%}lJx0tvqd>HkpV2DI9-;#P+@&OPoE5!7$5vC< z1DkR&`Et&6wUh%AKFYk0>7nu;X#+J*6cu-!vR01X%vAkNC=V%amp}(gXfosg5=3HO zJHoi~KG^L=#sM+$M^;~aHg9&7(appRv<`!-skfSt5)gU~y(4hJ2)FFi;mXpQPXxlH z6;7SCT@|9t&PKnrXN^r^hdwXLU?9N!>LY=vaj@!opHS3g#H^l9&kz*9>)RcvuxW3G zPK;m>be-Rl>AkIC1WJf%|9^-9gi#5t)w=DuAL~CHb1p)rA>5a2?Wb{tDoF%eA_EaW z@RsJ^abao9yhEPixAYagNqb{D7w@;(UfaNTD+;SO$|zLI`}N*@0Q%ONVZa-fpk6(q z69mkohf6`?C{oC?qVyOqQme(ahY~0X0y%PlBOe#I6R%-zoAJYtKNtns|M5ymQ9|$XtsH*#FW&!aVpHeAKscig1CEf{W~t^`z5jc~ zlH^ElFy_5{6SKC5yur=GD9^5)ff*6GUZ;wph@){zP?#Ypi5E!9l*!Gp4w~hY+OJsr{N>-dsQq!WA z#Q!?irxrag?Akn@b)K19T05Q>C$;dT3QJu)x~FaJCO`Uq89jBQq+tALNgCcE{?RYH z7DOx#HZR{B1Pw(;r=xT_x1j>!h@pay>kFU1sj=ELF0Te{4-90aPHn`3Vt##oKv{Kw z=#xKV4651nFEn#cnY%qq#*Dx{WMeMoD!5@;13Mc(PS-oR-xSN>z`*{4GMHej-5$dX0u*D`{8<0!1G z3{BHUC4W>uYx@?S*4_Z{6?>aAoZikM;?!X)e*I&-b zNdj9!$*%>ta)XyCi&!|ab^5@(cjzfBJOW6t{_(Js{u~ULqqw3{)eHsw47y}50wal80Y1``Pgmll$BYp z5Bhl+9x&+!(rZDcCEf1 zro^W!TN`EGmKpBlJIfdHxFJU}$1FwY2=J6^;1uNZKPJx!x1P0t?f>!X%6uBj&Q0f! z;>dX&l zUgW;Tk0ljI^?xc7Bv$l|eZ?-RES|^2W?Qbjn#->&9^`hmKZ>$PT=a1o56olDo>LAn z&t2@BTkblZ!qgQyNT^V4ug;A&tX#|djS`qAL3WC`ws>DKIpeu}L$-g0(ZQYgu`x@V z2w*O4TWW&X489JSPV{bXo(Oy^AmqttDpJEk%*|DGaFhG?81dAwOw9KM(EY;IyeFC{ zpGQwYDAbYeC@>Sdy9cRCPpk-C5|@2*;bAhIWDW33g}GrpvQ159{ZB-5n+1gD%mldU zyWp!4rjeQVYyMC3KDFAYqlDy4eoFmb~y0H}$`i`#bGG!49rg zs4H}5o$pZbbeiVJoa}Un{fHmGs>xi^ABIj`Y20>qSd_cgdOP(QCUqGf0ca^xnb`6> z68ZIup3Pog=?#@Ju~a7JzkEG4*LAl$a1vE5r*LU8LP2BVl&$qcV_0ntd}$rphCW|U zb(pN8lmD5!jdH9{T&xx*f^~TrNwD=ivxi_9{AF?+IWq%U$)={ch4*$o@}7z_c2!a_ zGt+Wj_ixs@ooIjRO$*r2eJ)^REmmXdA{9`<*z zLw`7v=oAc0D4FEQsO>QJ8v}|S2L7K`Jg=Va?cU$Kuh*RChJy{oUNjUmAueb6gi^)i zat}ed7rM<--N0gbx1VcdqL6Yb(ZI%dcNSpXIM!a@2ooW+4$N;W#A!Z|BgURT0oNPz6~;@Y%88#4T}7h!Yh za-b?wBNZw}DLO-@YR4|~ic8x1VR*0ZT1F`*|8mLwVB4L2Ybd8KKLUQ3ssI;C&~C#- zgE^%IccUbsFK3TxU;JKu-6vrwFQ@77?9sIjdc=zXz`kEbpf@C3j!7j8q1v`@lClsz z1l3vs5m$#@blMxMJMXu90#TB(&DYbYcN5!K;zq0s1M?MzHEz2PYaIm+7}#9c3pArG zFT2>}gQ^!oX+8MciV_H8x&%%V-Lb8e2q=O{@b~2eO}%DCUG8|3vZnQ9gXQZ7BI~mr z2QQdnP#iOIEU3}dy{f<3-<6e>c6S673L?4?=}lba{3UC~i~vI*7oHu>r$<7?L!Q3l%RRV`J?M&4Bdvr{_1$> zy8={LuST7p4rM<@ok`t@?cdID$GA=#um4wlEsc^hxns@n>MA*OwN%uok|jLNzrbFH zd`LXaNT+A)AgGx6bxLv)8@7UezEH>5>l zz#%f}4Od)oO(UU7d>`yvDAFK7l|!W!Id7`wz2e@^xtl=Cv@A69r1>R*N&ZpufcS-y z@i)Z_%uCLky)%Du$~0*g_#|02A!9XMo>TC8sGL5>x3pEBpCYG#MHMgqTt$!q&MA7( znv#(GT_;G=%w>PA7C~Dn`h^uK-jVg}g#0^ZWx{vqb`}gh#2?(G8;Qf2AV=pW#Ci+@ z*1JQdXFsL2jKSH1^3eiKob-sl8!s_ZJ84y%>|~AgtQa?)IMUAU2(T!k2BXhplG}F{ zJ0KV2w0?2U&EuOnLBBX!#RkLaqbVZ6BX>;X4M1r#4ul{$C6nYj>m+>2Dz=M6A78ay zzSr55r>Y{b2E?GX@QjBZpxQr*sL^SmZ(%&k?E2aho`3E z=@2BixZ>Ztk3nD`f8s&WfhccHPGYOGM_8g*RR(&p}Hm+l38nf4lNvDpR6es{@r$v2a zm$gu5;@95bPL(VtqrTWP2Qt;Z!yK&zTn0=#M@K|84Gp);tpRMQ=RaKG*q=>Ia)!1y zhn|1BKZRof{~HtC;{(fAQT7pG3aL4;_mPleyJr#6p}=q+mcQ$MC~Ynd zo^ZY9FPF)NbsDk7HA%qFpJxxYN|%S;OhL6#OS7?{=kJn#)+9$1WOYpr?|8^-C3(zh zFdooRmh5bED=wz4lffR#H?@cU**XZY$S+}I-8`eOPf}mkX*p;7@=mNQRHT01Paa`t z>6@r$?nbDCU%544w7h^rC9q7=(-=E6EF+1=$S1_x)igdHBX2?o5C@Hs#2?ze$_W3AJk98Z{@ zcRFQR(Y~fn9+C0NJp1DaknKCom~Ysi2)}iMW+59J-}O086>S=b^jpIiYxYhS>+0_~ z8CG!}&ap5s##_jAKfzRlr&lVYz?!HaiGBGRnioPs4~ifVbWdZ)wN=Se%a0&@%}lyl zo^k0lXKgwzWjn}%3rher8%ZSmI`MCS{?wV`-UW0cq5ZvJNs|3(K}u-;A8aQ-YGX0M zh-iQHuN@`^5%ItgK|Stzc9gIL&uW15@r63GemL4sLDjrpq{N&?4<~g~oex{lWx7=# z+bXGW%7nrH;AplQbCNz3=33m{-1eq&rTF;VpH7?P9iSNGWj}KLR5_9I98T1DBO4qb zd;9xU1`VuIQc_EE4SM0`X;u<{rZ6f^Ix=8BEqyA1LCInvGs>EjJCN-#ifeZ2(Ji*G zKWRBEoJWhT!rx$?}*L&Xk=;0>7c>FeBjrlT^aMXUFz`g17)bOYm1C}eK z-h!I}p`@y6y}j&QiXJaQp$fa2PmUI4jGMiWTY1Mlq;9kEP#`7$m45DAEi(d@_J!17 zHzMKmWVz{l*wo}X6TAUh2l3tNU}53{vGTRK-R1I7(Sao4=IQ$Ero8?ULQ$dy9M!D^ zrMJjL7v5hU$^ii;Q&ABH8ibmTQak1JvotPrMH3}*AzQ*1Cye??3;wWuLnfho>ow&-4<$5 zP( zMNHxPRHphxrPkH#DE7*Zo={soGXJ$aev9JwPszr-kQ?GlPv`(qI98|ETe<2Zovpsz&hgv%v_Tk8E;?ZJv^td! zqo64amegSAD25sK*_#+5H8ljacSrFhg)Jm93W60&n2{2%9oc>tjZ|=*KfZ={FSX(F zNJ{36o}V)PzB>zIs4CUuEIr-S{gbb@7p~`bzcZ5P4r3Q%XO+bD(VKkZhGsR{I14FL z7H12~>wf&FGZ4kW-dAfzYLFBGR6vX53p`|N!06+}Ao&w4Rmse5&0#9%7sP3uJwZSG zz;M2U1JuIkt7bHvHH;`aXcC_WWh%oTC6=9^1AD|p^%wV#Wov!fQSqDE* zSdO4O{o9IdIz0fR)&mZpoG?E(hMbgAtD`5E37bHyti;j~osv+9>++4l*fK|5RGlZ1 z=a2+dm;6(&B{&|;cJ!dxYZa&8YSN1n6#An$Q~DR_J^yYF@RA8xztxC=lW})`nfvZZ zP5n1fwi!?)rJ502ZdZvOJ9TWu>hm}V1 zJByFl6E*L@sP9SWmvDf=K(ahd<_`-^&ZdEZudI>%D<8%wUndB{DA>`tWZE$lri8xo z8)OGyQ;)QP{7#HcrO?87(aY1?5*3#ZT;!qrQj_6bq|k*v?AkVI>7Nt+37)fO?WBsmrY(OoBgL6ff}6If5hol(7g7b zW@(st=z~bA@+V&6iFVV`JqSUHOL-RE9gVrq`%qHDtPo(N!0qjA^F7ncTQjTacVXp6 ziMvhnY;Dnr3g#U%IGhA~QZZQ8j=+6tMw`c^7to*SKQ^_HAx@wuu9p$tgC0a>1U$n5 z(9%L2u^0)|apAWn%1I?f-qNe!s^OcH9X~TCiS%|jH^J+{0UkJ2RNgMfsNtlLzgP9h z5u5$VhrkU}+p(Z(hr%$S%|A@270UOb-1L0!+tzHmDB(0^2LeqrkI?cF|`=rut8bT%ahc!_*7<0t*EqPsCS4*bAyp_;ILy?XlGp=3V zSIEV#3v~VX;mn;bjl|#L_G#H!OA2+Rqfflna*~qqSbFcHW1Ix?Fvu^$Gy39kCUAKV z%%xbp_&@BR_mFaTd)I;l#Lj0VME6+lC~%w|?!qj5BNHWcrzr`(hD@<9HkoE_bc{k~ ztb3}>+`4}~bI@2pDI322*IW)`5l6(LYPm+fSX@M|oM{fVDY=FHdGYa9s0@2+>N|8` z`2p#g9OFD~iUj@2Wrzhuh_xx{PzRv&-L|AK-I-#~jML#)Qj53CEQl+Y#cfH?V^a|^ zvBL{?)vq%;t_3LOFR+-b1)vG<7VS7<`VUc^kPvz*5fphXta1eiE#@UgS?l9)EhIJh zH+(H#AGw(BBEf)>#x2>-wAnrU{CfAc{4q!m7iT+iaH)6L6dcg`AIaT_L7R`3gFndU z050uqzpm_G#O68J;Ldti%_$bE1}@JM6i?dB18@LYQd12PtzSpP;Hs@x>86*v>P=hH zolOBB<5VOzu8CpQ132XWY5^Q57vq(lK$*EDe^I>m_C09uLsZL=P4L7L9VK}l93078 zYQ8Tw2Fm{^UO1Lo5OA~HETK$!T-p5G@h#yg%dppx2G1uZ&m)=xrj#u2j{H|jzBii; z68{&^)jM+Z?fS85bzCP4slvVPxxGBvL*mW60^nA_A0z)7fI_d$10aTCHOr6SVqgRS z$UfM}78PuNEHus^kksq4yFIGWd}UrVp;&zIR#RC8!xcIcw=3M2%eDEMOg9 zm_HKQ@}gl=YI2r(Y^~B<-_z57oTY?dS2bN|nl6ViGGykg*Wh%A#2;-K^|R?WBRU&( zA+AUmB9Ouj`LHHA)ySD+ohNLsuPvISoWN1{l8M>9-mvX5FM8~Rd%_;{&nz_wa?m=V zDBR6+wn-E>yRHiQdz?T!$`*5ptC^_kCMDCXu0Z75Tle@21jq~$&Z0r9gv3A16Y+*~=D?pFnW=Al)MqLfot%_0Su3_)0SB@7^x3Gf@z}`de?v~$>`>@7 zx4OET9t%N+IzV5eOGf3@t=`L;0*3XOslDG}!KNvk@>cq-p>PPl4BkyD+gRRya`qmv zACo*g_Sznf3(N9f_d=(pNO3G(kHZH9wRt<1fi2JXRtmbKJ}>M3mre0?q)`OYdtXf* zJJlv17rSTHdbyg`Q^i`3 zfY9v1G482)-r3m;m38f!R~VERk|4im1Oxvw{gC7AUj+}#A0Jl_7&JUoUI=1SFO{g`zb5V1%+Hr z;qrb^&(EyFvIqEhF|!|!W~k8yf3%NSk`OgaO}n7yoRwgcl!_s449$>`FA6D6T-!_p zn>tIV>>~wQMY?b@D72KYd;#N;%uh9DT>Rz~&Lo{tw3?L4C|WaAoa?2w8HhdHrVgDd zF`mw7N<-|_)gl{flN+HhnBuyUB`K5}Uo9BFoBu*xtD{B)g8Zc4=w>pJ$GumacF_~L$$VM%Wd_`um&SuJOin4uer;1TFPd1_* z-sZJbyX@-vnwVYhdtxHr(_o;(q3;KrL4($Wm9^$H2~*MNNkR?gcOM3-+098AnMU+m z?e;#YG23B{#on#Oa5byusnJ)P;BbA3zh+^X3SyYz{qD$MF=+KP*dBYDIHL1j``!4A zw(>A$a^YC&?nTuIpW}4s3uF9_$f~2uY&1~eM2jtxnEW5nb9y1tk?`zFNiF}&sd6<2zbxa%XSv@1{CtIn70#M6pwg_%O@ zzuT8S;sqR&r8lH<=tpsWaS%d!!&u?O)Kub^L8WUR*WjlGNUY-Ix8~554Ir){3I;-T ziQZSS*lDMw&_Tfw95Lu}fvsK1=L{eK?TE}?^=UPpS%FD(yJ>FO>(+$-#mcyw3z;Je zuCxBzcO>bcaZ?Sxp5kLNdojZST(6%MxS3Qx9_8?aj9hwA*uRo5FLPvlr_P2^G*Mko z;JBrTebI!E)CfeoY0^o~Fdk*tGr^JSL=V}g#kw1kxZycI-|bzkSj155WT!wd=)7jL zW~lGK3A_=rw)rpBy`$hfBwtov?$j=DA=lCQv>f!kwKDM(*c9D>pWI5jp#YLh|cMt9rLDDXQ4IVc30iBm$926}!}*Q8$cA<&ibc zOA+S8sh;%=E?K$8$Byyi%Q#Mu>4J+GlAI1d@xOnwP;URqD}4mR9yp?Gs9}TxmR8Vu z;fVO!Y>oj3gJtiOl4Y`KUIXNZ%7bsB4y*s{KR62rGWcM!Qd@@sK%-jJ^5^$~^a$$i zcx=Pac;&Ua>5kE|CC9cT=8Y#&Q%sZ;j8kDTnH4hQkoiZm*rrzxg)a^2m=<+T$WV-x zc_INuS?xF5Q>8c?h~!rjnc31Rf=_VZRmP;5S7&hJhwv{26WEOhLRbFix3bcFVY8ns zWS3`L<85ZUYC2t--1=Nl+fq7m7wZ5U=g}pBS#1C;aCm<#TsvWnOieX#f0cY|S&1PR z%sjs4%warW?JiSQNWRSj=In3CnOdx~*@k>ogN>l9luQ+J=d+U{ba`fHo|gT5Iz5YO z9JV-unb4W?14NaQpxP+ayH16?L{?*04`41Xt|+x9FRn}Z;KM(iU;WiFIZ}3i(NhT} zpY$}j)`Jk=O~&f5wtcZEXxE0$TFfv?-B6u~`6En6|Ac9Mjws>)M%rlSl~h?jWJVPI znwu@yeHt4p17d@*nd{;jh0BBw6Bo3|Z*VM2lov!J3Jgc_vloXDk*C@b&oO>Gb5uT< zxH+5;`i&R0__|wkCqR6i`(0%$K3T6?jApsr!o%Rsfsd*>Od$or>QZJU3F0K5BumN- zOSigGINO7S8p=(J&xZbtuUcuS-5+&S05LXV{ByW-V4m?XII65~;CI3%`k0ldva+-F z?+!?&4#8i_`@al^ku?9V0H9amm>zYtA2%Kbut;tZM?~^05-1`)t%Q#&qr*Z+X2MqX_UJ2=fIZQF*ptdSMz49|{r=bPmY{s8fL@*RjcywAcQ0-jI zpK>oM`bSJ>^=B4g`K*2O+Y=WtP3Lgmqb}V~wHf>ogVw0Ay>JtyRE9L#G+HahX}4&i_RS7zq744KK20w$*3T!ro&hpXyWj zR(L5b2vubw#!4ZmL%-@;!^elm{{j?K@Io3q;DV}YSPl@#MgM!lm+&?fDo5GXD6H+c zn%M$eoH{FY1;CP+x>Y8gZL6^33ydk^Js;>ihEyTwHFKY)L`-s4ns!M(f~Qg?cl-{a z+1_jVZC)JrP*cZM^ocoGO&WD8Xwv>V*9}>X3|i?w zuPyJJO7Pz$#x15kWfCSUCTC{)?Pq(#!zd{(-YW56#X|UM7)@`*27DK$SoruDRyLNx zfzOc2X*@c$@9x}nzlvm21!JJ#Dzl%a&I7rmz&t@uf6<3QP#CMA-sNLPsM6R8} zX&$!Qs*%yHP7#!Eii5?PeB=P**jK&R17O{$sH)oJ>`rA0VRv8cjwM#0G7wzvP560l z)$&{JZVg12>0FBVl$vMMT*&(Lda);UPm>+Lw7A3(@?4Ur~}D(Uae-bAM9)L3F1)O+n~ z(M{F7&ql!@LLfOvjJx?%AY8pfi#1tsd@hn-Nf(w+L{;eAWpYD~tMfVp^Tj}~_Ys=? zp>DN=d7&1s&(NmTyX2J>BXu_zNynvEZ8nb?7Ws7@{9aBjbWAELb~d#oix-U{yqcYD zqUQFAOlb$^no=fctwaf7U}SIKhCB;FPSq|d@ek7k?8fWn6o@AL^nbOh=;26--=_Z6 z7`2T>f3O*i4{E|1U7%{!~G`&SAA8pKX55U3gYO)6(j?uah5iZl#nU(nrjC zPWLldnX#-v`dzR_Mn&H*-G}$GZ7ELnJ=z$@LcI%I`aXOf?gnj46f2EnNkYLveIHo5JgcF2a(8^V7Z@bDvIA(TC#HF6-m-(t4*fc!V(-mV9{*W=>hhji6l* zJK$CzI*OaL{{BGG8%M|bT0nnutM3%QcVQX4tYgV?bY6U;@UK23xy*Cp?3gON1A-gr zaz}Y2BZ^uZ6eu|5;xBfZMKL(t3#zXYH)8s82#NJRc|ktDJ(-9A!Mbn~qPj4y|Rz zTPzffwm#&<)NJTw)ro-xlfEvE0?TzIrWqA^d97_9t88u_b@tD~yB)-y8$3vf%F$T0 z{rTfKfKbYR)SgRQv;?g3L61LJM$KmcOb`}l(xzThEWM>x?FR@_LC?%tEb#n6>u$c& zOM_v^AM?A-K!;k+hR~^qvrMHjqqE8Fzoh`ZX5)nb7u)|ZFa@;Yrh1U|s@Y*o?M&|# zKH~l-3fa#WW*;=3hje?5ntcev6vD6njDJjz_#Z2P*`j8~ntYo9xe`T>^r zfmJRcdEvJ{#OJFO5SB*3SkYho&>3r@2eslp0F2MyG9I6{4{o5PGe>0={UkMNBeD4R zEJRa1)-`XZJnf629wM>SkN{O{VZK_ZwHpazg!R@2z3a;`1@?5J~(p7Wn7>ZuZ;dm3d5MxZn12~&j+#|?0N1_b|3Jvd5LD5NX{{~KX*34`g#7( zCgp4#cE{zJ{a4lZm#$O4H7$pBc6QCM3C~L$wy!C+G7F;*?an7M*D{5+3;gRp#j~%b8>Z#-RB&w + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 1 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdio.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscalls.c + + + + CPU + + $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\ipc\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\APM32S10x_Library\Device\Geehy\APM32S10x\Source\iar\startup_apm32s10x_md.s + + + $PROJ_DIR$\..\libraries\Drivers\drv_common.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_usart.c + + + + Finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler_up.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Libraries + + $PROJ_DIR$\..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_misc.c + + + $PROJ_DIR$\..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_gpio.c + + + $PROJ_DIR$\..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_rcm.c + + + $PROJ_DIR$\..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_dma.c + + + $PROJ_DIR$\..\libraries\APM32S10x_Library\Device\Geehy\APM32S10x\Source\system_apm32s10x.c + + + $PROJ_DIR$\..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_usart.c + + + $PROJ_DIR$\..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_eint.c + + + + POSIX + + diff --git a/bsp/apm32/apm32s103vb-miniboard/project.eww b/bsp/apm32/apm32s103vb-miniboard/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/apm32/apm32s103vb-miniboard/project.uvoptx b/bsp/apm32/apm32s103vb-miniboard/project.uvoptx new file mode 100644 index 0000000000..ed28d42d39 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/project.uvoptx @@ -0,0 +1,872 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 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 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0APM32S10x_128 -FL020000 -FS08000000 -FP0($$Device:APM32S103VB$Flash\APM32S10x_128.FLM) + + + 0 + JL2CM3 + -U59768881 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0APM32S10x_128 -FS08000000 -FL020000 -FP0($$Device:APM32S103VB$Flash\APM32S10x_128.FLM) + + + + + 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 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + + + + + + 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\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 5 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 25 + 2 + 0 + 0 + 0 + ..\libraries\APM32S10x_Library\Device\Geehy\APM32S10x\Source\arm\startup_apm32s10x_md.s + startup_apm32s10x_md.s + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_misc.c + apm32s10x_misc.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_gpio.c + apm32s10x_gpio.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_rcm.c + apm32s10x_rcm.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_dma.c + apm32s10x_dma.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\APM32S10x_Library\Device\Geehy\APM32S10x\Source\system_apm32s10x.c + system_apm32s10x.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_usart.c + apm32s10x_usart.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_eint.c + apm32s10x_eint.c + 0 + 0 + + + + diff --git a/bsp/apm32/apm32s103vb-miniboard/project.uvprojx b/bsp/apm32/apm32s103vb-miniboard/project.uvprojx new file mode 100644 index 0000000000..294a42a8b0 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/project.uvprojx @@ -0,0 +1,693 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + APM32S103VB + Geehy + Geehy.APM32S1xx_DFP.1.0.1 + https://www.geehy.com/uploads/tool/ + IRAM(0x20000000,0x9000) IROM(0x08000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32S10x_128 -FS08000000 -FL020000 -FP0($$Device:APM32S103VB$Flash\APM32S10x_128.FLM)) + 0 + $$Device:APM32S103VB$Device\Device\Geehy\APM32S10x\Include\apm32s10x.h + + + + + + + + + + $$Device:APM32S103VB$SVD\APM32S103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 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-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 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 + 0x9000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x9000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, APM32S10X_MD + + ..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m3;..\..\..\libcpu\arm\common;..\libraries\Drivers;..\..\..\components\drivers\include;..\libraries\APM32S10x_Library\CMSIS\Include;..\libraries\APM32S10x_Library\Device\Geehy\APM32S10x\Include;..\..\..\components\finsh;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\Drivers\config;applications;.;..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\inc;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\stdio;..\..\..\include;..\..\..\components\libc\compilers\common\include;board\ports;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc;board + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + 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 + + + cstdio.c + 1 + ..\..\..\components\libc\compilers\common\cstdio.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 + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + CPU + + + atomic_arm.c + 1 + ..\..\..\libcpu\arm\common\atomic_arm.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + + + DeviceDrivers + + + completion.c + 1 + ..\..\..\components\drivers\ipc\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + startup_apm32s10x_md.s + 2 + ..\libraries\APM32S10x_Library\Device\Geehy\APM32S10x\Source\arm\startup_apm32s10x_md.s + + + drv_common.c + 1 + ..\libraries\Drivers\drv_common.c + + + drv_gpio.c + 1 + ..\libraries\Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\Drivers\drv_usart.c + + + + + Finsh + + + 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 + 1 + ..\..\..\components\finsh\cmd.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler_up.c + 1 + ..\..\..\src\scheduler_up.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Libraries + + + apm32s10x_misc.c + 1 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_misc.c + + + apm32s10x_gpio.c + 1 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_gpio.c + + + apm32s10x_rcm.c + 1 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_rcm.c + + + apm32s10x_dma.c + 1 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_dma.c + + + system_apm32s10x.c + 1 + ..\libraries\APM32S10x_Library\Device\Geehy\APM32S10x\Source\system_apm32s10x.c + + + apm32s10x_usart.c + 1 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_usart.c + + + apm32s10x_eint.c + 1 + ..\libraries\APM32S10x_Library\APM32S10x_StdPeriphDriver\src\apm32s10x_eint.c + + + + + + + + + + + + + +
diff --git a/bsp/apm32/apm32s103vb-miniboard/rtconfig.h b/bsp/apm32/apm32s103vb-miniboard/rtconfig.h new file mode 100644 index 0000000000..5461bfb72a --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/rtconfig.h @@ -0,0 +1,243 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 8 +#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 RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* kservice optimization */ + +#define RT_KSERVICE_USING_STDLIB +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_PAGE_MAX_ORDER 11 +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x50000 +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M3 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#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 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 + +/* 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_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using USB */ + + +/* C/C++ and POSIX layer */ + +#define RT_LIBC_DEFAULT_TIMEZONE 8 + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + + +/* Network */ + + +/* Utilities */ + + +/* RT-Thread Utestcases */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + + +/* XML: Extensible Markup Language */ + + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + + +/* u8g2: a monochrome graphic library */ + + +/* tools packages */ + + +/* system packages */ + +/* enhanced kernel services */ + + +/* acceleration: Assembly language or algorithmic acceleration packages */ + + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + + +/* Micrium: Micrium software products porting for RT-Thread */ + + +/* peripheral libraries and drivers */ + +/* sensors drivers */ + + +/* touch drivers */ + + +/* Kendryte SDK */ + + +/* AI packages */ + + +/* Signal Processing and Control Algorithm Packages */ + + +/* miscellaneous packages */ + +/* project laboratory */ + +/* samples: kernel and components samples */ + + +/* entertainment: terminal games and other interesting software packages */ + + +/* Arduino libraries */ + + +/* Projects */ + + +/* Sensors */ + + +/* Display */ + + +/* Timing */ + + +/* Data Processing */ + + +/* Data Storage */ + +/* Communication */ + + +/* Device Control */ + + +/* Other */ + + +/* Signal IO */ + + +/* Uncategorized */ + +#define SOC_FAMILY_APM32 +#define SOC_SERIES_APM32S1 + +/* Hardware Drivers Config */ + +#define SOC_APM32S103VB + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_USB_TO_USART + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 + +#endif diff --git a/bsp/apm32/apm32s103vb-miniboard/rtconfig.py b/bsp/apm32/apm32s103vb-miniboard/rtconfig.py new file mode 100644 index 0000000000..7b1531669a --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m3' +CROSS_TOOL='gcc' + +# 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'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = r'E:\IAR' + +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-m3 -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' + + 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-M3 ' + 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 == 'armclang': + # toolchains + CC = 'armclang' + CXX = 'armclang' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M1.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m0 ' + CFLAGS += ' -mcpu=cortex-m0 ' + CFLAGS += ' -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar ' + CFLAGS += ' -gdwarf-3 -ffunction-sections ' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers ' + LFLAGS += ' --list rt-thread.map ' + LFLAGS += r' --strict --scatter "board\linker_scripts\link.sct" ' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib' + + EXEC_PATH += '/ARM/ARMCLANG/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O1' # armclang recommend + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # 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-M3' + 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-M3' + 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/apm32/apm32s103vb-miniboard/template.ewp b/bsp/apm32/apm32s103vb-miniboard/template.ewp new file mode 100644 index 0000000000..7cc79a3edd --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/template.ewp @@ -0,0 +1,2144 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 1 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + diff --git a/bsp/apm32/apm32s103vb-miniboard/template.eww b/bsp/apm32/apm32s103vb-miniboard/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/apm32/apm32s103vb-miniboard/template.uvoptx b/bsp/apm32/apm32s103vb-miniboard/template.uvoptx new file mode 100644 index 0000000000..d4fb936b25 --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/template.uvoptx @@ -0,0 +1,192 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 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 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0APM32S10x_128 -FL020000 -FS08000000 -FP0($$Device:APM32S103VB$Flash\APM32S10x_128.FLM) + + + 0 + JL2CM3 + -U59768881 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0APM32S10x_128 -FS08000000 -FL020000 -FP0($$Device:APM32S103VB$Flash\APM32S10x_128.FLM) + + + + + 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 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/apm32/apm32s103vb-miniboard/template.uvprojx b/bsp/apm32/apm32s103vb-miniboard/template.uvprojx new file mode 100644 index 0000000000..c0e1a07bba --- /dev/null +++ b/bsp/apm32/apm32s103vb-miniboard/template.uvprojx @@ -0,0 +1,396 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + APM32S103VB + Geehy + Geehy.APM32S1xx_DFP.1.0.1 + https://www.geehy.com/uploads/tool/ + IRAM(0x20000000,0x9000) IROM(0x08000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32S10x_128 -FS08000000 -FL020000 -FP0($$Device:APM32S103VB$Flash\APM32S10x_128.FLM)) + 0 + $$Device:APM32S103VB$Device\Device\Geehy\APM32S10x\Include\apm32s10x.h + + + + + + + + + + $$Device:APM32S103VB$SVD\APM32S103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 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-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 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 + 0x9000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x9000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
diff --git a/bsp/apm32/libraries/.ignore_format.yml b/bsp/apm32/libraries/.ignore_format.yml index f39a41c44b..cae5dfac89 100644 --- a/bsp/apm32/libraries/.ignore_format.yml +++ b/bsp/apm32/libraries/.ignore_format.yml @@ -5,4 +5,6 @@ dir_path: - APM32F0xx_Library - APM32F10x_Library -- APM32F4xx_Library \ No newline at end of file +- APM32F4xx_Library +- APM32E10x_Library +- APM32S10x_Library \ No newline at end of file diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_adc.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_adc.h new file mode 100644 index 0000000000..442af94bdb --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_adc.h @@ -0,0 +1,350 @@ +/*! + * @file apm32e10x_adc.h + * + * @brief This file contains all the functions prototypes for the ADC firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_ADC_H +#define __APM32E10X_ADC_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup ADC_Driver + @{ +*/ + +/** @defgroup ADC_Macros Macros + @{ +*/ + +/* ADC_IJD Offset */ +#define INJDATA_OFFSET ((uint8_t)0x28) + +/* ADC_RDG register address */ +#define RDG_ADDRESS ((uint32_t)0x4001244C) + +/* INJSEQ register config */ +#define INJSEQ_SET_INJSEQC ((uint32_t)0x0000001F) +#define INJSEQ_SET_INJSEQLEN ((uint32_t)0x00300000) + +/* SMPTIM register SET */ +#define SMPCYCCFG_SET_SMPTIM1 ((uint32_t)0x00000007) +#define SMPCYCCFG_SET_SMPTIM2 ((uint32_t)0x00000007) + +/* REGSEQ register SET */ +#define REGSEQC_SET_REGSEQ3 ((uint32_t)0x0000001F) +#define REGSEQC_SET_REGSEQ2 ((uint32_t)0x0000001F) +#define REGSEQC_SET_REGSEQ1 ((uint32_t)0x0000001F) + +/**@} end of group ADC_Macros*/ + +/** @defgroup ADC_Enumerations Enumerations + @{ +*/ + +/** + * @brief ADC configuration Mode + */ +typedef enum +{ + ADC_MODE_INDEPENDENT = ((uint32_t)0x00000000), /*!< Independent mode */ + ADC_MODE_REG_INJEC_SIMULT = ((uint32_t)0x00010000), /*!< Combined regular simultaneous and injected simultaneous mode */ + ADC_MODE_REG_SIMULT_ALTER_TRIG = ((uint32_t)0x00020000), /*!< Combined regular simultaneous and alternate trigger mode */ + ADC_MODE_INJEC_SIMULT_FAST_TNTERL = ((uint32_t)0x00030000), /*!< Combined injected simultaneous and fast interleaved mode */ + ADC_MODE_INJEC_SIMULT_SLOW_INTERL = ((uint32_t)0x00040000), /*!< Combined injected simultaneous and slow interleaved mode */ + ADC_MODE_INJEC_SIMULT = ((uint32_t)0x00050000), /*!< Injected simultaneous mode */ + ADC_MODE_REG_SIMULT = ((uint32_t)0x00060000), /*!< Regular simultaneous mode */ + ADC_MODE_FAST_INTERL = ((uint32_t)0x00070000), /*!< Fast interleaved mode */ + ADC_MODE_SLOW_INTERL = ((uint32_t)0x00080000), /*!< Slow interleaved mode */ + ADC_MODE_ALTER_TRIG = ((uint32_t)0x00090000) /*!< Alternate trigger mode */ +} ADC_MODE_T; + +/** + * @brief ADC external trigger sources for regular channels conversion enumeration + */ +typedef enum +{ + ADC_EXT_TRIG_CONV_TMR1_CC1 = ((uint32_t)0x00000000), + ADC_EXT_TRIG_CONV_TMR1_CC2 = ((uint32_t)0x00020000), + ADC_EXT_TRIG_CONV_TMR2_CC2 = ((uint32_t)0x00060000), + ADC_EXT_TRIG_CONV_TMR3_TRGO = ((uint32_t)0x00080000), + ADC_EXT_TRIG_CONV_TMR4_CC4 = ((uint32_t)0x000A0000), + ADC_EXT_TRIG_CONV_EINT11_T8_TRGO = ((uint32_t)0x000C0000), + ADC_EXT_TRIG_CONV_TMR1_CC3 = ((uint32_t)0x00040000), + ADC_EXT_TRIG_CONV_None = ((uint32_t)0x000E0000), + + ADC_EXT_TRIG_CONV_TMR3_CC1 = ((uint32_t)0x00000000), + ADC_EXT_TRIG_CONV_TMR2_CC3 = ((uint32_t)0x00020000), + ADC_EXT_TRIG_CONV_TMR8_CC1 = ((uint32_t)0x00060000), + ADC_EXT_TRIG_CONV_TMR8_TRGO = ((uint32_t)0x00080000), + ADC_EXT_TRIG_CONV_TMR5_CC1 = ((uint32_t)0x000A0000), + ADC_EXT_TRIG_CONV_TMR5_CC3 = ((uint32_t)0x000C0000) +} ADC_EXT_TRIG_CONV_T; + +/** + * @brief ADC Data Align + */ +typedef enum +{ + ADC_DATA_ALIGN_RIGHT = 0x00000000, + ADC_DATA_ALIGN_LEFT = 0x00000800 +} ADC_DATA_ALIGN_T; + +/** + * @brief ADC Channels + */ +typedef enum +{ + ADC_CHANNEL_0 = ((uint8_t)0x00), + ADC_CHANNEL_1 = ((uint8_t)0x01), + ADC_CHANNEL_2 = ((uint8_t)0x02), + ADC_CHANNEL_3 = ((uint8_t)0x03), + ADC_CHANNEL_4 = ((uint8_t)0x04), + ADC_CHANNEL_5 = ((uint8_t)0x05), + ADC_CHANNEL_6 = ((uint8_t)0x06), + ADC_CHANNEL_7 = ((uint8_t)0x07), + ADC_CHANNEL_8 = ((uint8_t)0x08), + ADC_CHANNEL_9 = ((uint8_t)0x09), + ADC_CHANNEL_10 = ((uint8_t)0x0A), + ADC_CHANNEL_11 = ((uint8_t)0x0B), + ADC_CHANNEL_12 = ((uint8_t)0x0C), + ADC_CHANNEL_13 = ((uint8_t)0x0D), + ADC_CHANNEL_14 = ((uint8_t)0x0E), + ADC_CHANNEL_15 = ((uint8_t)0x0F), + ADC_CHANNEL_16 = ((uint8_t)0x10), + ADC_CHANNEL_TEMP_SENSOR = ((uint8_t)0x10), + ADC_CHANNEL_17 = ((uint8_t)0x11), + ADC_CHANNEL_V_REFINT = ((uint8_t)0x11) +} ADC_CHANNEL_T; + +/** + * @brief ADC Sampling Time + */ +typedef enum +{ + ADC_SAMPLETIME_1CYCLES5 = ((uint8_t)0x00), + ADC_SAMPLETIME_7CYCLES5 = ((uint8_t)0x01), + ADC_SAMPLETIME_13CYCLES5 = ((uint8_t)0x02), + ADC_SAMPLETIME_28CYCLES5 = ((uint8_t)0x03), + ADC_SAMPLETIME_41CYCLES5 = ((uint8_t)0x04), + ADC_SAMPLETIME_55CYCLES5 = ((uint8_t)0x05), + ADC_SAMPLETIME_71CYCLES5 = ((uint8_t)0x06), + ADC_SAMPLETIME_239CYCLES5 = ((uint8_t)0x07) +} ADC_SAMPLETIME_T; + +/** + * @brief ADC external trigger sources for injected channels conversion + */ +typedef enum +{ + /** for ADC1 and ADC2 */ + ADC_EXT_TRIG_INJEC_CONV_TMR2_TRGO = ((uint8_t)0x02), + ADC_EXT_TRIG_INJEC_CONV_TMR2_CC1 = ((uint8_t)0x03), + ADC_EXT_TRIG_INJEC_CONV_TMR3_CC4 = ((uint8_t)0x04), + ADC_EXT_TRIG_INJEC_CONV_TMR4_TRGO = ((uint8_t)0x05), + ADC_EXT_TRIG_INJEC_CONV_EINT15_T8_CC4 = ((uint8_t)0x06), + + /** for ADC1, ADC2 and ADC3 */ + ADC_EXT_TRIG_INJEC_CONV_TMR1_TRGO = ((uint8_t)0x00), + ADC_EXT_TRIG_INJEC_CONV_TMR1_CC4 = ((uint8_t)0x01), + ADC_EXT_TRIG_INJEC_CONV_NONE = ((uint8_t)0x07), + + /** for ADC3 only */ + ADC_EXT_TRIG_INJEC_CONV_TMR4_CC3 = ((uint8_t)0x02), + ADC_EXT_TRIG_INJEC_CONV_TMR8_CC2 = ((uint8_t)0x03), + ADC_EXT_TRIG_INJEC_CONV_TMR8_CC4 = ((uint8_t)0x04), + ADC_EXT_TRIG_INJEC_CONV_TMR5_TRGO = ((uint8_t)0x05), + ADC_EXT_TRIG_INJEC_CONV_TMR5_CC4 = ((uint8_t)0x06) +} ADC_EXT_TRIG_INJEC_CONV_T; + +/** + * @brief ADC Injected channels + */ +typedef enum +{ + ADC_INJEC_CHANNEL_1 = ((uint8_t)0x14), + ADC_INJEC_CHANNEL_2 = ((uint8_t)0x18), + ADC_INJEC_CHANNEL_3 = ((uint8_t)0x1C), + ADC_INJEC_CHANNEL_4 = ((uint8_t)0x20) +} ADC_INJEC_CHANNEL_T; + +/** + * @brief ADC Analog Watchdog Selection + */ +typedef enum +{ + ADC_ANALOG_WATCHDOG_SINGLE_REG = ((uint32_t)0x00800200), + ADC_ANALOG_WATCHDOG_SINGLE_INJEC = ((uint32_t)0x00400200), + ADC_ANALOG_WATCHDOG_SINGLE_REG_INJEC = ((uint32_t)0x00C00200), + ADC_ANALOG_WATCHDOG_ALL_REG = ((uint32_t)0x00800000), + ADC_ANALOG_WATCHDOG_ALL_INJEC = ((uint32_t)0x00400000), + ADC_ANALOG_WATCHDOG_ALL_REG_ALL_INJEC = ((uint32_t)0x00C00000), + ADC_ANALOG_WATCHDOG_NONE = ((uint32_t)0x00000000) +} ADC_ANALOG_WATCHDOG_T; + +/** + * @brief ADC Interrupt definition + */ +typedef enum +{ + ADC_INT_AWD = ((uint16_t)0x0140), /*!< Analog Watchdog interrupt */ + ADC_INT_EOC = ((uint16_t)0x0220), /*!< End Of Conversion interrupt */ + ADC_INT_INJEOC = ((uint16_t)0x0480) /*!< Injected Channel End Of Conversion interrupt */ +} ADC_INT_T; + +/** + * @brief ADC Flag + */ +typedef enum +{ + ADC_FLAG_AWD = ((uint8_t)0x01), /*!< Analog Watchdog event occur flag */ + ADC_FLAG_EOC = ((uint8_t)0x02), /*!< End Of Conversion flag */ + ADC_FLAG_INJEOC = ((uint8_t)0x04), /*!< Injected Channel End Of Conversion flag */ + ADC_FLAG_INJCS = ((uint8_t)0x08), /*!< Injected Channel Conversion Start flag */ + ADC_FLAG_REGCS = ((uint8_t)0x10) /*!< Regular Channel Conversion Start flag */ +} ADC_FLAG_T; + +/**@} end of group ADC_Enumerations*/ + + + +/** @defgroup ADC_Structures Structures + @{ +*/ + +/** + * @brief ADC Config structure definition + */ +typedef struct +{ + ADC_MODE_T mode; + uint8_t scanConvMode; /*!< This parameter can be ENABLE or DISABLE. */ + uint8_t continuosConvMode; /*!< This parameter can be ENABLE or DISABLE. */ + ADC_EXT_TRIG_CONV_T externalTrigConv; + ADC_DATA_ALIGN_T dataAlign; + uint8_t nbrOfChannel; /*!< This parameter must range from 1 to 16. */ +} ADC_Config_T; + +/**@} end of group ADC_Structures*/ + + +/** @defgroup ADC_Functions Functions + @{ +*/ + +/* ADC reset and common configuration */ +void ADC_Reset(ADC_T* adc); +void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig); +void ADC_ConfigStructInit(ADC_Config_T* adcConfig); +void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel,uint8_t rank, uint8_t sampleTime); +void ADC_Enable(ADC_T* adc); +void ADC_Disable(ADC_T* adc); + +/* ADC for DMA */ +void ADC_EnableDMA(ADC_T* adc); +void ADC_DisableDMA(ADC_T* adc); + +/* ADC Calibration */ +void ADC_ResetCalibration(ADC_T* adc); +uint8_t ADC_ReadResetCalibrationStatus(ADC_T* adc); +void ADC_StartCalibration(ADC_T* adc); +uint8_t ADC_ReadCalibrationStartFlag(ADC_T* adc); + +/* ADC software start conversion */ +void ADC_EnableSoftwareStartConv(ADC_T* adc); +void ADC_DisableSoftwareStartConv(ADC_T* adc); +uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T* adc); + +/* ADC Discontinuous mode */ +void ADC_ConfigDiscMode(ADC_T* adc, uint8_t number); +void ADC_EnableDiscMode(ADC_T* adc); +void ADC_DisableDiscMode(ADC_T* adc); + +/* ADC External trigger conversion */ +void ADC_EnableExternalTrigConv(ADC_T* adc); +void ADC_DisableExternalTrigConv(ADC_T* adc); + +/* ADC Conversion result */ +uint16_t ADC_ReadConversionValue(ADC_T* adc); +uint32_t ADC_ReadDualModeConversionValue(ADC_T* adc); + +/* ADC Automatic injected group */ +void ADC_EnableAutoInjectedConv(ADC_T* adc); +void ADC_DisableAutoInjectedConv(ADC_T* adc); +void ADC_EnableInjectedDiscMode(ADC_T* adc); +void ADC_DisableInjectedDiscMode(ADC_T* adc); + +/* ADC External trigger for injected channels conversion */ +void ADC_ConfigExternalTrigInjectedConv(ADC_T* adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv); +void ADC_EnableExternalTrigInjectedConv(ADC_T* adc); +void ADC_DisableExternalTrigInjectedConv(ADC_T* adc); + +/* ADC Start of the injected channels conversion */ +void ADC_EnableSoftwareStartInjectedConv(ADC_T* adc); +void ADC_DisableSoftwareStartInjectedConv(ADC_T* adc); +uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T* adc); + +/* ADC injected channel */ +void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime); +void ADC_ConfigInjectedSequencerLength(ADC_T* adc, uint8_t length); +void ADC_ConfigInjectedOffset(ADC_T* adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet); +uint16_t ADC_ReadInjectedConversionValue(ADC_T* adc, ADC_INJEC_CHANNEL_T channel); + +/* ADC analog watchdog */ +void ADC_EnableAnalogWatchdog(ADC_T* adc, uint32_t analogWatchdog); +void ADC_DisableAnalogWatchdog(ADC_T* adc); +void ADC_ConfigAnalogWatchdogThresholds(ADC_T* adc, uint16_t highThreshold, uint16_t lowThreshold); +void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T* adc, uint8_t channel); + +/* ADC temperature sensor */ +void ADC_EnableTempSensorVrefint(ADC_T* adc); +void ADC_DisableTempSensorVrefint(ADC_T* adc); + +/* Interrupt and flag */ +void ADC_EnableInterrupt(ADC_T* adc, uint16_t interrupt); +void ADC_DisableInterrupt(ADC_T* adc, uint16_t interrupt); +uint8_t ADC_ReadStatusFlag(ADC_T* adc, ADC_FLAG_T flag); +void ADC_ClearStatusFlag(ADC_T* adc, uint8_t flag); +uint8_t ADC_ReadIntFlag(ADC_T* adc, ADC_INT_T flag); +void ADC_ClearIntFlag(ADC_T* adc, uint16_t flag); + + + +/**@} end of group ADC_Functions */ +/**@} end of group ADC_Driver*/ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_ADC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_bakpr.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_bakpr.h new file mode 100644 index 0000000000..688f72dcba --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_bakpr.h @@ -0,0 +1,151 @@ +/*! + * @file apm32e10x_bakr.h + * + * @brief This file contains all the functions prototypes for the BAKPR firmware library. + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_BAKPR_H +#define __APM32E10X_BAKPR_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup BAKPR_Driver + @{ +*/ + +/** @defgroup BAKPR_Enumerations Enumerations + @{ +*/ + +/** + * @brief BAKPR TAMPER Pin Active Level + */ +typedef enum +{ + BAKPR_TAMPER_PIN_LEVEL_HIGH, + BAKPR_TAMPER_PIN_LEVEL_LOW +} BAKPR_TAMPER_PIN_LEVEL_T; + +/** + * @brief BAKPR RTC output source + */ +typedef enum +{ + BAKPR_RTC_OUTPUT_SOURCE_NONE, + BAKPR_RTC_OUTPUT_SOURCE_CALIBRATION_CLOCK, + BAKPR_RTC_OUTPUT_SOURCE_ALARM, + BAKPR_RTC_OUTPUT_SOURCE_SECOND +} BAKPR_RTC_OUTPUT_SOURCE_T; + +/** + * @brief BAKPR DATA register Addr + */ +typedef enum +{ + BAKPR_DATA1 = ((uint16_t)0x0004), + BAKPR_DATA2 = ((uint16_t)0x0008), + BAKPR_DATA3 = ((uint16_t)0x000C), + BAKPR_DATA4 = ((uint16_t)0x0010), + BAKPR_DATA5 = ((uint16_t)0x0014), + BAKPR_DATA6 = ((uint16_t)0x0018), + BAKPR_DATA7 = ((uint16_t)0x001C), + BAKPR_DATA8 = ((uint16_t)0x0020), + BAKPR_DATA9 = ((uint16_t)0x0024), + BAKPR_DATA10 = ((uint16_t)0x0028), + BAKPR_DATA11 = ((uint16_t)0x0040), + BAKPR_DATA12 = ((uint16_t)0x0044), + BAKPR_DATA13 = ((uint16_t)0x0048), + BAKPR_DATA14 = ((uint16_t)0x004C), + BAKPR_DATA15 = ((uint16_t)0x0050), + BAKPR_DATA16 = ((uint16_t)0x0054), + BAKPR_DATA17 = ((uint16_t)0x0058), + BAKPR_DATA18 = ((uint16_t)0x005C), + BAKPR_DATA19 = ((uint16_t)0x0060), + BAKPR_DATA20 = ((uint16_t)0x0064), + BAKPR_DATA21 = ((uint16_t)0x0068), + BAKPR_DATA22 = ((uint16_t)0x006C), + BAKPR_DATA23 = ((uint16_t)0x0070), + BAKPR_DATA24 = ((uint16_t)0x0074), + BAKPR_DATA25 = ((uint16_t)0x0078), + BAKPR_DATA26 = ((uint16_t)0x007C), + BAKPR_DATA27 = ((uint16_t)0x0080), + BAKPR_DATA28 = ((uint16_t)0x0084), + BAKPR_DATA29 = ((uint16_t)0x0088), + BAKPR_DATA30 = ((uint16_t)0x008C), + BAKPR_DATA31 = ((uint16_t)0x0090), + BAKPR_DATA32 = ((uint16_t)0x0094), + BAKPR_DATA33 = ((uint16_t)0x0098), + BAKPR_DATA34 = ((uint16_t)0x009C), + BAKPR_DATA35 = ((uint16_t)0x00A0), + BAKPR_DATA36 = ((uint16_t)0x00A4), + BAKPR_DATA37 = ((uint16_t)0x00A8), + BAKPR_DATA38 = ((uint16_t)0x00AC), + BAKPR_DATA39 = ((uint16_t)0x00B0), + BAKPR_DATA40 = ((uint16_t)0x00B4), + BAKPR_DATA41 = ((uint16_t)0x00B8), + BAKPR_DATA42 = ((uint16_t)0x00BC) +} BAKPR_DATA_T; + +/**@} end of group BAKPR_Enumerations*/ + + +/** @defgroup BAKPR_Functions Functions + @{ +*/ + +/* BAKPR reset and configuration */ +void BAKPR_Reset(void); +void BAKPR_ConfigTamperPinLevel(BAKPR_TAMPER_PIN_LEVEL_T value); +void BAKPR_EnableTamperPin(void); +void BAKPR_DisableTamperPin(void); +void BAKPR_ConfigRTCOutput(BAKPR_RTC_OUTPUT_SOURCE_T soure); +void BAKPR_ConfigRTCCalibrationValue(uint8_t calibrationValue); +void BAKPR_ConfigBackupRegister(BAKPR_DATA_T bakrData, uint16_t data); +uint16_t BAKPR_ReadBackupRegister(BAKPR_DATA_T bakrData); + +/** Interrupts and flags */ +void BAKPR_EnableInterrupt(void); +void BAKPR_DisableInterrupt(void); +uint8_t BAKPR_ReadStatusFlag(void); +void BAKPR_ClearStatusFlag(void); +uint8_t BAKPR_ReadIntFlag(void); +void BAKPR_ClearIntFlag(void); + +/**@} end of group BAKPR_Functions */ +/**@} end of group BAKPR_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_BAKPR_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_can.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_can.h new file mode 100644 index 0000000000..6a87be9a6b --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_can.h @@ -0,0 +1,354 @@ +/*! + * @file apm32e10x_can.h + * + * @brief This file contains all the functions prototypes for the CAN firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_CAN_H +#define __APM32E10X_CAN_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup CAN_Driver CAN Driver + @{ +*/ + +/** @defgroup CAN_Enumerations + @{ +*/ + +/** + * @brief CAN mode + */ +typedef enum +{ + CAN_MODE_NORMAL = ((uint8_t)0x00), /*!< normal mode */ + CAN_MODE_LOOPBACK = ((uint8_t)0x01), /*!< loopback mode */ + CAN_MODE_SILENT = ((uint8_t)0x02), /*!< silent mode */ + CAN_MODE_SILENT_LOOPBACK = ((uint8_t)0x03) /*!< loopback combined with silent mode */ +} CAN_MODE_T; + +/** + * @brief CAN synchronisation jump width + */ +typedef enum +{ + CAN_SJW_1 = ((uint8_t)0x00), /*!< 1 time quantum */ + CAN_SJW_2 = ((uint8_t)0x01), /*!< 2 time quantum */ + CAN_SJW_3 = ((uint8_t)0x02), /*!< 3 time quantum */ + CAN_SJW_4 = ((uint8_t)0x03) /*!< 4 time quantum */ +} CAN_SJW_T; + +/** + * @brief CAN time quantum in bit segment 1 + */ +typedef enum +{ + CAN_TIME_SEGMENT1_1 = ((uint8_t)0x00), /*!< 1 time quanta */ + CAN_TIME_SEGMENT1_2 = ((uint8_t)0x01), /*!< 2 time quanta */ + CAN_TIME_SEGMENT1_3 = ((uint8_t)0x02), /*!< 3 time quanta */ + CAN_TIME_SEGMENT1_4 = ((uint8_t)0x03), /*!< 4 time quanta */ + CAN_TIME_SEGMENT1_5 = ((uint8_t)0x04), /*!< 5 time quanta */ + CAN_TIME_SEGMENT1_6 = ((uint8_t)0x05), /*!< 6 time quanta */ + CAN_TIME_SEGMENT1_7 = ((uint8_t)0x06), /*!< 7 time quanta */ + CAN_TIME_SEGMENT1_8 = ((uint8_t)0x07), /*!< 8 time quanta */ + CAN_TIME_SEGMENT1_9 = ((uint8_t)0x08), /*!< 9 time quanta */ + CAN_TIME_SEGMENT1_10 = ((uint8_t)0x09), /*!< 10 time quanta */ + CAN_TIME_SEGMENT1_11 = ((uint8_t)0x0A), /*!< 11 time quanta */ + CAN_TIME_SEGMENT1_12 = ((uint8_t)0x0B), /*!< 12 time quanta */ + CAN_TIME_SEGMENT1_13 = ((uint8_t)0x0C), /*!< 13 time quanta */ + CAN_TIME_SEGMENT1_14 = ((uint8_t)0x0D), /*!< 14 time quanta */ + CAN_TIME_SEGMENT1_15 = ((uint8_t)0x0E), /*!< 15 time quanta */ + CAN_TIME_SEGMENT1_16 = ((uint8_t)0x0F) /*!< 16 time quanta */ +} CAN_TIME_SEGMENT1_T; + +/** + * @brief CAN time quantum in bit segment 2 + */ +typedef enum +{ + CAN_TIME_SEGMENT2_1 = (uint8_t)0x00, /*!< 1 time quanta */ + CAN_TIME_SEGMENT2_2 = (uint8_t)0x01, /*!< 2 time quanta */ + CAN_TIME_SEGMENT2_3 = (uint8_t)0x02, /*!< 3 time quanta */ + CAN_TIME_SEGMENT2_4 = (uint8_t)0x03, /*!< 4 time quanta */ + CAN_TIME_SEGMENT2_5 = (uint8_t)0x04, /*!< 5 time quanta */ + CAN_TIME_SEGMENT2_6 = (uint8_t)0x05, /*!< 6 time quanta */ + CAN_TIME_SEGMENT2_7 = (uint8_t)0x06, /*!< 7 time quanta */ + CAN_TIME_SEGMENT2_8 = (uint8_t)0x07 /*!< 8 time quanta */ +} CAN_TIME_SEGMENT2_T; + +/** + * @brief CAN filter FIFO + */ +typedef enum +{ + CAN_FILTER_FIFO_0 = ((uint8_t)0x00), /*!< filter FIFO 0 */ + CAN_FILTER_FIFO_1 = ((uint8_t)0x01) /*!< filter FIFO 1 */ +} CAN_FILTER_FIFO_T; + +/** + * @brief CAN filter mode + */ +typedef enum +{ + CAN_FILTER_MODE_IDMASK = ((uint8_t)0x00),/*!< identifier/mask mode */ + CAN_FILTER_MODE_IDLIST = ((uint8_t)0x01) /*!< identifier list mode */ +} CAN_FILTER_MODE_T; + +/** + * @brief CAN filter scale + */ +typedef enum +{ + CAN_FILTER_SCALE_16BIT = ((uint8_t)0x00), /*!< Two 16-bit filters */ + CAN_FILTER_SCALE_32BIT = ((uint8_t)0x01) /*!< One 32-bit filter */ +} CAN_FILTER_SCALE_T; + +/** + * @brief CAN identifier type + */ +typedef enum +{ + CAN_TYPEID_STD = ((uint32_t)0x00000000), /*!< Standard Id */ + CAN_TYPEID_EXT = ((uint32_t)0x00000004) /*!< Extended Id */ +} CAN_TYPEID_T; + +/** + * @brief CAN_remote_transmission_request + */ +typedef enum +{ + CAN_RTXR_DATA = ((uint32_t)0x00000000), /*!< Data frame */ + CAN_RTXR_REMOTE = ((uint32_t)0x00000002) /*!< Remote frame */ +} CAN_RTXR_T; + +/** + * @brief Mailboxes definition + */ +typedef enum +{ + CAN_TX_MAILBIX_0 = ((uint8_t)0x00), /*!< Tx mailbox0 */ + CAN_TX_MAILBIX_1 = ((uint8_t)0x01), /*!< Tx mailbox1 */ + CAN_TX_MAILBIX_2 = ((uint8_t)0x02) /*!< Tx mailbox2 */ +} CAN_TX_MAILBIX_T; + +/** + * @brief CAN receive FIFO number constants + */ +typedef enum +{ + CAN_RX_FIFO_0 = ((uint8_t)0x00), /*!< receive FIFO 0 */ + CAN_RX_FIFO_1 = ((uint8_t)0x01) /*!< receive FIFO 1 */ +} CAN_RX_FIFO_T; + +/** + * @brief CAN Operating Mode + */ +typedef enum +{ + CAN_OPERATING_MODE_INIT = ((uint8_t)0x00), /*!< Initialization mode */ + CAN_OPERATING_MODE_NORMAL = ((uint8_t)0x01), /*!< Normal mode */ + CAN_OPERATING_MODE_SLEEP = ((uint8_t)0x02) /*!< sleep mode */ +} CAN_OPERATING_MODE_T; + +/** + * @brief CAN Interrupts + */ +typedef enum +{ + CAN_INT_TXME = ((uint32_t)0x00000001), /*!< Transmit mailbox empty Interrupt */ + CAN_INT_F0MP = ((uint32_t)0x00000002), /*!< FIFO 0 message pending Interrupt */ + CAN_INT_F0FULL = ((uint32_t)0x00000004), /*!< FIFO 0 full Interrupt */ + CAN_INT_F0OVR = ((uint32_t)0x00000008), /*!< FIFO 0 overrun Interrupt */ + CAN_INT_F1MP = ((uint32_t)0x00000010), /*!< FIFO 1 message pending Interrupt */ + CAN_INT_F1FULL = ((uint32_t)0x00000020), /*!< FIFO 1 full Interrupt */ + CAN_INT_F1OVR = ((uint32_t)0x00000040), /*!< FIFO 1 overrun Interrupt */ + CAN_INT_ERRW = ((uint32_t)0x00000100), /*!< Error warning Interrupt */ + CAN_INT_ERRP = ((uint32_t)0x00000200), /*!< Error passive Interrupt */ + CAN_INT_BOF = ((uint32_t)0x00000400), /*!< Bus-off Interrupt */ + CAN_INT_LEC = ((uint32_t)0x00000800), /*!< Last error record code Interrupt */ + CAN_INT_ERR = ((uint32_t)0x00008000), /*!< Error Interrupt */ + CAN_INT_WUP = ((uint32_t)0x00010000), /*!< Wake-up Interrupt */ + CAN_INT_SLEEP = ((uint32_t)0x00020000) /*!< Sleep acknowledge Interrupt */ +} CAN_INT_T; + +/** + * @brief CAN Flags + */ +typedef enum +{ + /** Error flag*/ + CAN_FLAG_ERRW = ((uint32_t)0x10F00001), /*!< Error Warning Flag */ + CAN_FLAG_ERRP = ((uint32_t)0x10F00002), /*!< Error Passive Flag */ + CAN_FLAG_BOF = ((uint32_t)0x10F00004), /*!< Bus-Off Flag */ + CAN_FLAG_LERRC = ((uint32_t)0x30F00070), /*!< Last error record code Flag */ + /** Operating Mode Flags */ + CAN_FLAG_WUPI = ((uint32_t)0x31000008), /*!< Wake up Flag */ + CAN_FLAG_SLEEP = ((uint32_t)0x31000012), /*!< Sleep acknowledge Flag */ + /** Receive Flags */ + CAN_FLAG_F0MP = ((uint32_t)0x12000003), /*!< FIFO 0 Message Pending Flag */ + CAN_FLAG_F0FULL = ((uint32_t)0x32000008), /*!< FIFO 0 Full Flag */ + CAN_FLAG_F0OVR = ((uint32_t)0x32000010), /*!< FIFO 0 Overrun Flag */ + CAN_FLAG_F1MP = ((uint32_t)0x14000003), /*!< FIFO 1 Message Pending Flag */ + CAN_FLAG_F1FULL = ((uint32_t)0x34000008), /*!< FIFO 1 Full Flag */ + CAN_FLAG_F1OVR = ((uint32_t)0x34000010), /*!< FIFO 1 Overrun Flag */ + /** Transmit Flags */ + CAN_FLAG_REQC0 = ((uint32_t)0x38000001), /*!< Request MailBox0 Flag */ + CAN_FLAG_REQC1 = ((uint32_t)0x38000100), /*!< Request MailBox1 Flag */ + CAN_FLAG_REQC2 = ((uint32_t)0x38010000) /*!< Request MailBox2 Flag */ +} CAN_FLAG_T; + +/**@} end of group CAN_Enumerations*/ + +/** @defgroup CAN_Structure + @{ +*/ + +/** + * @brief CAN Config structure definition + */ + +/** + * @brief CAN config structure definition + */ +typedef struct +{ + uint8_t autoBusOffManage; /*!< Enable or disable the automatic bus-off management. */ + uint8_t autoWakeUpMode; /*!< Enable or disable the automatic wake-up mode. */ + uint8_t nonAutoRetran; /*!< Enable or disable the non-automatic retransmission mode. */ + uint8_t rxFIFOLockMode; /*!< Enable or disable the Receive FIFO Locked mode. */ + uint8_t txFIFOPriority; /*!< Enable or disable the transmit FIFO priority. */ + CAN_MODE_T mode; /*!< Specifies the CAN operating mode. */ + CAN_SJW_T syncJumpWidth; /* Specifies the maximum number of time quanta the CAN hardware + is allowed to lengthen or shorten a bit to perform resynchronization. + */ + CAN_TIME_SEGMENT1_T timeSegment1; /*!< Specifies the number of time quanta in Bit Segment 1. */ + CAN_TIME_SEGMENT2_T timeSegment2; /*!< Specifies the number of time quanta in Bit Segment 2. */ + uint16_t prescaler; /*!< Specifies the length of a time quantum. It can be 1 to 1024. */ +} CAN_Config_T; + +/** + * @brief CAN Tx message structure definition + */ +typedef struct +{ + uint32_t stdID; /*!< Specifies the standard identifier. It can be 0 to 0x7FF. */ + uint32_t extID; /*!< Specifies the extended identifier. It can be 0 to 0x1FFFFFFF. */ + CAN_TYPEID_T typeID; + CAN_RTXR_T remoteTxReq; + uint8_t dataLengthCode;/*!< Specifies the data length code. It can be 0 to 8. */ + uint8_t data[8]; /*!< Specifies the data to be transmitted. It can be 0 to 0xFF. */ +} CAN_TxMessage_T; + +/** + * @brief CAN Rx message structure definition + */ +typedef struct +{ + uint32_t stdID; /*!< Specifies the standard identifier. It can be 0 to 0x7FF. */ + uint32_t extID; /*!< Specifies the extended identifier. It can be 0 to 0x1FFFFFFF. */ + uint32_t typeID; + uint32_t remoteTxReq; + uint8_t dataLengthCode; /*!< Specifies the data length code. It can be 0 to 8. */ + uint8_t data[8]; /*!< Specifies the data to be transmitted. It can be 0 to 0xFF. */ + uint8_t filterMatchIndex;/*!< Specifies the filter match index. It can be 0 to 0xFF. */ +} CAN_RxMessage_T; + +/** + * @brief CAN filter config structure definition + */ +typedef struct +{ + uint8_t filterNumber; /*!< Specifies the filter number. It can be 0 to 13. */ + uint16_t filterIdHigh; /*!< Specifies the filter identification number.It can be 0 to 0xFFFF. */ + uint16_t filterIdLow; /*!< Specifies the filter identification number.It can be 0 to 0xFFFF. */ + uint16_t filterMaskIdHigh; /*!< Specifies the filter mask identification. It can be 0 to 0xFFFF. */ + uint16_t filterMaskIdLow; /*!< Specifies the filter mask identification. It can be 0 to 0xFFFF. */ + uint16_t filterActivation; /*!< Specifies the filter Activation. It can be ENABLE or DISABLE. */ + CAN_FILTER_FIFO_T filterFIFO; + CAN_FILTER_MODE_T filterMode; + CAN_FILTER_SCALE_T filterScale; +} CAN_FilterConfig_T; + +/**@} end of group CAN_Structure*/ + + +/** @defgroup CAN_Functions + @{ +*/ + +/* CAN reset and configuration */ +void CAN_Reset(CAN_T* can); +uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig); +void CAN_ConfigFilter(CAN_T* can, CAN_FilterConfig_T* filterConfig); +void CAN_ConfigStructInit(CAN_Config_T* canConfig); +void CAN_EnableDBGFreeze(CAN_T* can); +void CAN_DisableDBGFreeze(CAN_T* can); + + +/* CAN frames transmit */ +uint8_t CAN_TxMessage(CAN_T* can, CAN_TxMessage_T* TxMessage); +uint8_t CAN_TxMessageStatus(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox); +void CAN_CancelTxMailbox(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox); + +/* CAN frames receive */ +void CAN_RxMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber, CAN_RxMessage_T* RxMessage); +void CAN_ReleaseFIFO(CAN_T* can, CAN_RX_FIFO_T FIFONumber); +uint8_t CAN_PendingMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber); + +/* CAN operation modes */ +uint8_t CAN_OperatingMode(CAN_T* can, CAN_OPERATING_MODE_T operatingMode); +uint8_t CAN_SleepMode(CAN_T* can); +uint8_t CAN_WakeUpMode(CAN_T* can); + +/* CAN bus error management */ +uint8_t CAN_ReadLastErrorCode(CAN_T* can); +uint8_t CAN_ReadRxErrorCounter(CAN_T* can); +uint8_t CAN_ReadLSBTxErrorCounter(CAN_T* can); + +/* CAN interrupt and flag */ +void CAN_EnableInterrupt(CAN_T* can, uint32_t interrupt); +void CAN_DisableInterrupt(CAN_T* can, uint32_t interrupt); +uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag); +void CAN_ClearStatusFlag(CAN_T* can, CAN_FLAG_T flag); +uint8_t CAN_ReadIntFlag(CAN_T* can, CAN_INT_T flag); +void CAN_ClearIntFlag(CAN_T* can, CAN_INT_T flag); + +/**@} end of group CAN_Functions*/ +/**@} end of group CAN_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_CAN_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_crc.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_crc.h new file mode 100644 index 0000000000..5ba5316fee --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_crc.h @@ -0,0 +1,67 @@ +/*! + * @file apm32e10x_crc.h + * + * @brief This file contains all the functions prototypes for the CRC firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_CRC_H +#define __APM32E10X_CRC_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup CRC_Driver + @{ +*/ + +/** @defgroup CRC_Functions Functions + @{ +*/ + +/* Reset DATA */ +void CRC_ResetDATA(void); + +/* Operation functions */ +uint32_t CRC_CalculateCRC(uint32_t data); +uint32_t CRC_CalculateBlockCRC(uint32_t *buf, uint32_t bufLen); +uint32_t CRC_ReadCRC(void); +void CRC_WriteIDRegister(uint8_t inData); +uint8_t CRC_ReadIDRegister(void); + +/**@} end of group CRC_Functions*/ +/**@} end of group CRC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_CRC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dac.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dac.h new file mode 100644 index 0000000000..f7eddd7b54 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dac.h @@ -0,0 +1,197 @@ +/*! + * @file apm32e10x_dac.h + * + * @brief This file contains all the functions prototypes for the DAC firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_DAC_H +#define __APM32E10X_DAC_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DAC_Driver + @{ +*/ + +/** @defgroup DAC_Enumerations Enumerations + @{ +*/ + +/** + * @brief DAC Channel selection + */ +typedef enum +{ + DAC_CHANNEL_1 = 0x00000000, + DAC_CHANNEL_2 = 0x00000010 +}DAC_CHANNEL_T; + +/** + * @brief DAC trigger selection + */ +typedef enum +{ + DAC_TRIGGER_NONE = 0x00000000, + DAC_TRIGGER_TMR6_TRGO = 0x00000004, + DAC_TRIGGER_TMR8_TRGO = 0x0000000C, + DAC_TRIGGER_TMR7_TRGO = 0x00000014, + DAC_TRIGGER_TMR5_TRGO = 0x0000001C, + DAC_TRIGGER_TMR2_TRGO = 0x00000024, + DAC_TRIGGER_TMR4_TRGO = 0x0000002C, + DAC_TRIGGER_EINT9 = 0x00000034, + DAC_TRIGGER_SOFT = 0x0000003C +}DAC_TRIGGER_T; + +/** + * @brief DAC wave generation + */ +typedef enum +{ + DAC_WAVE_GENERATION_NONE = 0x00000000, + DAC_WAVE_GENERATION_NOISE = 0x00000040, + DAC_WAVE_GENERATION_TRIANGLE = 0x00000080 +}DAC_WAVE_GENERATION_T; + +/** + * @brief DAC channelx mask/amplitude selector + */ +typedef enum +{ + DAC_LFSR_MASK_BIT11_1 = 0x00000000, /*!< Mask bit[11:1] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_2 = 0x00000100, /*!< Mask bit[11:2] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_3 = 0x00000200, /*!< Mask bit[11:3] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_4 = 0x00000300, /*!< Mask bit[11:4] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_5 = 0x00000400, /*!< Mask bit[11:5] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_6 = 0x00000500, /*!< Mask bit[11:6] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_7 = 0x00000600, /*!< Mask bit[11:7] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_8 = 0x00000700, /*!< Mask bit[11:8] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_9 = 0x00000800, /*!< Mask bit[11:9] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11_10 = 0x00000900, /*!< Mask bit[11:10] of LFSR for noise wave generation */ + DAC_LFSR_MASK_BIT11 = 0x00000A00, /*!< Mask bit11 of LFSR for noise wave generation */ + DAC_LFSR_MASK_NONE = 0x00000B00, /*!< Mask none bit of LFSR for noise wave generation */ + + DAC_TRIANGLE_AMPLITUDE_1 = 0x00000000, /*!< Triangle amplitude equal to 1 */ + DAC_TRIANGLE_AMPLITUDE_3 = 0x00000100, /*!< Triangle amplitude equal to 3 */ + DAC_TRIANGLE_AMPLITUDE_7 = 0x00000200, /*!< Triangle amplitude equal to 7 */ + DAC_TRIANGLE_AMPLITUDE_15 = 0x00000300, /*!< Triangle amplitude equal to 15 */ + DAC_TRIANGLE_AMPLITUDE_31 = 0x00000400, /*!< Triangle amplitude equal to 31 */ + DAC_TRIANGLE_AMPLITUDE_63 = 0x00000500, /*!< Triangle amplitude equal to 63 */ + DAC_TRIANGLE_AMPLITUDE_127 = 0x00000600, /*!< Triangle amplitude equal to 127 */ + DAC_TRIANGLE_AMPLITUDE_255 = 0x00000700, /*!< Triangle amplitude equal to 255 */ + DAC_TRIANGLE_AMPLITUDE_511 = 0x00000800, /*!< Triangle amplitude equal to 511 */ + DAC_TRIANGLE_AMPLITUDE_1023 = 0x00000900, /*!< Triangle amplitude equal to 1023 */ + DAC_TRIANGLE_AMPLITUDE_2047 = 0x00000A00, /*!< Triangle amplitude equal to 2047 */ + DAC_TRIANGLE_AMPLITUDE_4095 = 0x00000B00 /*!< Triangle amplitude equal to 4095 */ +}DAC_MASK_AMPLITUDE_SEL_T; + +/** + * @brief DAC output buffer + */ +typedef enum +{ + DAC_OUTPUT_BUFFER_ENBALE = 0x00000000, + DAC_OUTPUT_BUFFER_DISABLE = 0x00000002 +}DAC_OUTPUT_BUFFER_T; + +/** + * @brief DAC data align + */ +typedef enum +{ + DAC_ALIGN_12BIT_R = 0x00000000, + DAC_ALIGN_12BIT_L = 0x00000004, + DAC_ALIGN_8BIT_R = 0x00000008 +}DAC_ALIGN_T; + +/**@} end of group DAC_Enumerations*/ + + +/** @defgroup DAC_Structures Structures + @{ +*/ + +/** + * @brief DAC Config structure definition + */ +typedef struct +{ + DAC_TRIGGER_T trigger; + DAC_OUTPUT_BUFFER_T outputBuffer; + DAC_WAVE_GENERATION_T waveGeneration; + DAC_MASK_AMPLITUDE_SEL_T maskAmplitudeSelect; +}DAC_Config_T; + +/**@} end of group DAC_Structures */ + + +/** @defgroup DAC_Functions Functions + @{ +*/ + +/* DAC Reset and Configuration */ +void DAC_Reset(void); +void DAC_Config(uint32_t channel, DAC_Config_T* dacConfig); +void DAC_ConfigStructInit(DAC_Config_T* dacConfig); +void DAC_Enable(DAC_CHANNEL_T channel); +void DAC_Disable(DAC_CHANNEL_T channel); + +/* DAC channel for DAM */ +void DAC_DMA_Enable(DAC_CHANNEL_T channel); +void DAC_DMA_Disable(DAC_CHANNEL_T channel); + +/* DAC channel software trigger */ +void DAC_EnableSoftwareTrigger(DAC_CHANNEL_T channel); +void DAC_DisableSoftwareTrigger(DAC_CHANNEL_T channel); +void DAC_EnableDualSoftwareTrigger(void); +void DAC_DisableDualSoftwareTrigger(void); + +/* DAC channel wave generation */ +void DAC_EnableWaveGeneration(DAC_CHANNEL_T channel, DAC_WAVE_GENERATION_T wave); +void DAC_DisableWaveGeneration(DAC_CHANNEL_T channel, DAC_WAVE_GENERATION_T wave); + +/* DAC set channel data */ +void DAC_ConfigChannel1Data(DAC_ALIGN_T align, uint16_t data); +void DAC_ConfigChannel2Data(DAC_ALIGN_T align, uint16_t data); +void DAC_ConfigDualChannelData(DAC_ALIGN_T align, uint16_t data2, uint16_t data1); + +/* DAC read data output value */ +uint16_t DAC_ReadDataOutputValue(DAC_CHANNEL_T channel); + +/**@} end of group DAC_Functions */ +/**@} end of group DAC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_DAC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dbgmcu.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dbgmcu.h new file mode 100644 index 0000000000..c22880fbd3 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dbgmcu.h @@ -0,0 +1,102 @@ +/*! + * @file apm32e10x_dbgmcu.h + * + * @brief This file contains all the functions prototypes for the DBUGMCU firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_DBGMCU_H +#define __APM32E10X_DBGMCU_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DBGMCU_Driver + @{ +*/ + +/** @defgroup DBGMCU_Enumerations Enumerations + @{ +*/ + +/** + * @brief DBGMCU_STOP description + */ +typedef enum +{ + DBGMCU_SLEEP = ((uint32_t)0x00000001), + DBGMCU_STOP = ((uint32_t)0x00000002), + DBGMCU_STANDBY = ((uint32_t)0x00000004), + DBGMCU_IWDT_STOP = ((uint32_t)0x00000100), + DBGMCU_WWDT_STOP = ((uint32_t)0x00000200), + DBGMCU_TMR1_STOP = ((uint32_t)0x00000400), + DBGMCU_TMR2_STOP = ((uint32_t)0x00000800), + DBGMCU_TMR3_STOP = ((uint32_t)0x00001000), + DBGMCU_TMR4_STOP = ((uint32_t)0x00002000), + DBGMCU_CAN1_STOP = ((uint32_t)0x00004000), + DBGMCU_I2C1_SMBUS_TIMEOUT = ((uint32_t)0x00008000), + DBGMCU_I2C2_SMBUS_TIMEOUT = ((uint32_t)0x00010000), + DBGMCU_TMR8_STOP = ((uint32_t)0x00020000), + DBGMCU_TMR5_STOP = ((uint32_t)0x00040000), + DBGMCU_TMR6_STOP = ((uint32_t)0x00080000), + DBGMCU_TMR7_STOP = ((uint32_t)0x00100000), + DBGMCU_CAN2_STOP = ((uint32_t)0x00200000), + DBGMCU_TMR15_STOP = ((uint32_t)0x00400000), + DBGMCU_TMR16_STOP = ((uint32_t)0x00800000), + DBGMCU_TMR17_STOP = ((uint32_t)0x01000000), + DBGMCU_TMR12_STOP = ((uint32_t)0x02000000), + DBGMCU_TMR13_STOP = ((uint32_t)0x04000000), + DBGMCU_TMR14_STOP = ((uint32_t)0x08000000), + DBGMCU_TMR9_STOP = ((uint32_t)0x10000000), + DBGMCU_TMR10_STOP = ((uint32_t)0x20000000), + DBGMCU_TMR11_STOP = ((uint32_t)0x40000000), +} DBGMCU_STOP_T; + +/**@} end of group DBGMCU_Enumerations */ + + +/** @defgroup DBGMCU_Functions Functions + @{ +*/ + +uint32_t DBGMCU_ReadDEVID(void); +uint32_t DBGMCU_ReadREVID(void); +void DBGMCU_Enable(uint32_t periph); +void DBGMCU_Disable(uint32_t periph); + +/**@} end of group DBGMCU_Functions */ +/**@} end of group DBGMCU_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_DBGMCU_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dma.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dma.h new file mode 100644 index 0000000000..45184f40e3 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dma.h @@ -0,0 +1,306 @@ +/*! + * @file apm32e10x_dma.h + * + * @brief This file contains all the functions prototypes for the DMA firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_DMA_H +#define __APM32E10X_DMA_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DMA_Driver + @{ +*/ + +/** @defgroup DMA_Enumerations Enumerations + @{ +*/ + +/** + * @brief DMA Transmission direction + */ +typedef enum +{ + DMA_DIR_PERIPHERAL_SRC, + DMA_DIR_PERIPHERAL_DST +} DMA_DIR_T; + +/** + * @brief DMA Peripheral address increment + */ +typedef enum +{ + DMA_PERIPHERAL_INC_DISABLE, + DMA_PERIPHERAL_INC_ENABLE +} DMA_PERIPHERAL_INC_T; + +/** + * @brief DMA Memory address increment + */ +typedef enum +{ + DMA_MEMORY_INC_DISABLE, + DMA_MEMORY_INC_ENABLE +} DMA_MEMORY_INC_T; + +/** + * @brief DMA Peripheral Data Size + */ +typedef enum +{ + DMA_PERIPHERAL_DATA_SIZE_BYTE, + DMA_PERIPHERAL_DATA_SIZE_HALFWORD, + DMA_PERIPHERAL_DATA_SIZE_WOED +} DMA_PERIPHERAL_DATA_SIZE_T; + +/** + * @brief DMA Memory Data Size + */ +typedef enum +{ + DMA_MEMORY_DATA_SIZE_BYTE, + DMA_MEMORY_DATA_SIZE_HALFWORD, + DMA_MEMORY_DATA_SIZE_WOED +} DMA_MEMORY_DATA_SIZE_T; + +/** + * @brief DMA Mode + */ +typedef enum +{ + DMA_MODE_NORMAL, + DMA_MODE_CIRCULAR +} DMA_LOOP_MODE_T; + +/** + * @brief DMA priority level + */ +typedef enum +{ + DMA_PRIORITY_LOW, + DMA_PRIORITY_MEDIUM, + DMA_PRIORITY_HIGH, + DMA_PRIORITY_VERYHIGH +} DMA_PRIORITY_T; + +/** + * @brief DMA Memory to Memory + */ +typedef enum +{ + DMA_M2MEN_DISABLE, + DMA_M2MEN_ENABLE +} DMA_M2MEN_T; + +/** + * @brief DMA interrupt + */ +typedef enum +{ + DMA_INT_TC = 0x00000002, + DMA_INT_HT = 0x00000004, + DMA_INT_TERR = 0x00000008 +} DMA_INT_T; + +/** + * @brief DMA Flag + */ +typedef enum +{ + DMA1_FLAG_GINT1 = 0x00000001, + DMA1_FLAG_TC1 = 0x00000002, + DMA1_FLAG_HT1 = 0x00000004, + DMA1_FLAG_TERR1 = 0x00000008, + DMA1_FLAG_GINT2 = 0x00000010, + DMA1_FLAG_TC2 = 0x00000020, + DMA1_FLAG_HT2 = 0x00000040, + DMA1_FLAG_TERR2 = 0x00000080, + DMA1_FLAG_GINT3 = 0x00000100, + DMA1_FLAG_TC3 = 0x00000200, + DMA1_FLAG_HT3 = 0x00000400, + DMA1_FLAG_TERR3 = 0x00000800, + DMA1_FLAG_GINT4 = 0x00001000, + DMA1_FLAG_TC4 = 0x00002000, + DMA1_FLAG_HT4 = 0x00004000, + DMA1_FLAG_TERR4 = 0x00008000, + DMA1_FLAG_GINT5 = 0x00010000, + DMA1_FLAG_TC5 = 0x00020000, + DMA1_FLAG_HT5 = 0x00040000, + DMA1_FLAG_TERR5 = 0x00080000, + DMA1_FLAG_GINT6 = 0x00100000, + DMA1_FLAG_TC6 = 0x00200000, + DMA1_FLAG_HT6 = 0x00400000, + DMA1_FLAG_TERR6 = 0x00800000, + DMA1_FLAG_GINT7 = 0x01000000, + DMA1_FLAG_TC7 = 0x02000000, + DMA1_FLAG_HT7 = 0x04000000, + DMA1_FLAG_TERR7 = 0x08000000, + + DMA2_FLAG_GINT1 = 0x10000001, + DMA2_FLAG_TC1 = 0x10000002, + DMA2_FLAG_HT1 = 0x10000004, + DMA2_FLAG_TERR1 = 0x10000008, + DMA2_FLAG_GINT2 = 0x10000010, + DMA2_FLAG_TC2 = 0x10000020, + DMA2_FLAG_HT2 = 0x10000040, + DMA2_FLAG_TERR2 = 0x10000080, + DMA2_FLAG_GINT3 = 0x10000100, + DMA2_FLAG_TC3 = 0x10000200, + DMA2_FLAG_HT3 = 0x10000400, + DMA2_FLAG_TERR3 = 0x10000800, + DMA2_FLAG_GINT4 = 0x10001000, + DMA2_FLAG_TC4 = 0x10002000, + DMA2_FLAG_HT4 = 0x10004000, + DMA2_FLAG_TERR4 = 0x10008000, + DMA2_FLAG_GINT5 = 0x10010000, + DMA2_FLAG_TC5 = 0x10020000, + DMA2_FLAG_HT5 = 0x10040000, + DMA2_FLAG_TERR5 = 0x10080000 +} DMA_FLAG_T; + +/** + * @brief DMA Interrupt Flag + */ +typedef enum +{ + DMA1_INT_FLAG_GINT1 = 0x00000001, + DMA1_INT_FLAG_TC1 = 0x00000002, + DMA1_INT_FLAG_HT1 = 0x00000004, + DMA1_INT_FLAG_TERR1 = 0x00000008, + DMA1_INT_FLAG_GINT2 = 0x00000010, + DMA1_INT_FLAG_TC2 = 0x00000020, + DMA1_INT_FLAG_HT2 = 0x00000040, + DMA1_INT_FLAG_TERR2 = 0x00000080, + DMA1_INT_FLAG_GINT3 = 0x00000100, + DMA1_INT_FLAG_TC3 = 0x00000200, + DMA1_INT_FLAG_HT3 = 0x00000400, + DMA1_INT_FLAG_TERR3 = 0x00000800, + DMA1_INT_FLAG_GINT4 = 0x00001000, + DMA1_INT_FLAG_TC4 = 0x00002000, + DMA1_INT_FLAG_HT4 = 0x00004000, + DMA1_INT_FLAG_TERR4 = 0x00008000, + DMA1_INT_FLAG_GINT5 = 0x00010000, + DMA1_INT_FLAG_TC5 = 0x00020000, + DMA1_INT_FLAG_HT5 = 0x00040000, + DMA1_INT_FLAG_TERR5 = 0x00080000, + DMA1_INT_FLAG_GINT6 = 0x00100000, + DMA1_INT_FLAG_TC6 = 0x00200000, + DMA1_INT_FLAG_HT6 = 0x00400000, + DMA1_INT_FLAG_TERR6 = 0x00800000, + DMA1_INT_FLAG_GINT7 = 0x01000000, + DMA1_INT_FLAG_TC7 = 0x02000000, + DMA1_INT_FLAG_HT7 = 0x04000000, + DMA1_INT_FLAG_TERR7 = 0x08000000, + + DMA2_INT_FLAG_GINT1 = 0x10000001, + DMA2_INT_FLAG_TC1 = 0x10000002, + DMA2_INT_FLAG_HT1 = 0x10000004, + DMA2_INT_FLAG_TERR1 = 0x10000008, + DMA2_INT_FLAG_GINT2 = 0x10000010, + DMA2_INT_FLAG_TC2 = 0x10000020, + DMA2_INT_FLAG_HT2 = 0x10000040, + DMA2_INT_FLAG_TERR2 = 0x10000080, + DMA2_INT_FLAG_GINT3 = 0x10000100, + DMA2_INT_FLAG_TC3 = 0x10000200, + DMA2_INT_FLAG_HT3 = 0x10000400, + DMA2_INT_FLAG_TERR3 = 0x10000800, + DMA2_INT_FLAG_GINT4 = 0x10001000, + DMA2_INT_FLAG_TC4 = 0x10002000, + DMA2_INT_FLAG_HT4 = 0x10004000, + DMA2_INT_FLAG_TERR4 = 0x10008000, + DMA2_INT_FLAG_GINT5 = 0x10010000, + DMA2_INT_FLAG_TC5 = 0x10020000, + DMA2_INT_FLAG_HT5 = 0x10040000, + DMA2_INT_FLAG_TERR5 = 0x10080000 +} DMA_INT_FLAG_T; + +/**@} end of group DMA_Enumerations */ + + +/** @defgroup DMA_Structures Structures + @{ +*/ + +/** + * @brief DMA Config struct definition + */ +typedef struct +{ + uint32_t peripheralBaseAddr; + uint32_t memoryBaseAddr; + DMA_DIR_T dir; + uint32_t bufferSize; + DMA_PERIPHERAL_INC_T peripheralInc; + DMA_MEMORY_INC_T memoryInc; + DMA_PERIPHERAL_DATA_SIZE_T peripheralDataSize; + DMA_MEMORY_DATA_SIZE_T memoryDataSize; + DMA_LOOP_MODE_T loopMode; + DMA_PRIORITY_T priority; + DMA_M2MEN_T M2M; +} DMA_Config_T; + +/**@} end of group DMA_Structures */ + + +/** @defgroup DMA_Functions Functions + @{ +*/ + +/** Reset and configuration */ +void DMA_Reset(DMA_Channel_T *channel); +void DMA_Config(DMA_Channel_T* channel, DMA_Config_T* dmaConfig); +void DMA_ConfigStructInit( DMA_Config_T* dmaConfig); +void DMA_Enable(DMA_Channel_T *channel); +void DMA_Disable(DMA_Channel_T *channel); + +/** Data number */ +void DMA_ConfigDataNumber(DMA_Channel_T *channel, uint16_t dataNumber); +uint16_t DMA_ReadDataNumber(DMA_Channel_T *channel); + +/** Interrupt and flag */ +void DMA_EnableInterrupt(DMA_Channel_T *channel, uint32_t interrupt); +void DMA_DisableInterrupt(DMA_Channel_T *channel, uint32_t interrupt); +uint8_t DMA_ReadStatusFlag(DMA_FLAG_T flag); +void DMA_ClearStatusFlag(uint32_t flag); +uint8_t DMA_ReadIntFlag(DMA_INT_FLAG_T flag); +void DMA_ClearIntFlag(uint32_t flag); + +/**@} end of group DMA_Functions */ +/**@} end of group DMA_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_DMA_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dmc.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dmc.h new file mode 100644 index 0000000000..7467870114 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_dmc.h @@ -0,0 +1,379 @@ +/*! + * @file apm32e10x_dmc.h + * + * @brief This file contains all the prototypes,enumeration and macros for the DMC peripheral + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_DMC_H +#define __APM32E10X_DMC_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DMC_Driver + @{ +*/ + +/** @defgroup DMC_Enumerations Enumerations + @{ +*/ + +/** + * @brief Bank Address Width + */ +typedef enum +{ + DMC_BANK_WIDTH_1, + DMC_BANK_WIDTH_2 +}DMC_BANK_WIDTH_T; + +/** + * @brief Row Address Width + */ +typedef enum +{ + DMC_ROW_WIDTH_11 = 0x0A, + DMC_ROW_WIDTH_12, + DMC_ROW_WIDTH_13, + DMC_ROW_WIDTH_14, + DMC_ROW_WIDTH_15, + DMC_ROW_WIDTH_16 +}DMC_ROW_WIDTH_T; + +/** + * @brief Column Address Width + */ +typedef enum +{ + DMC_COL_WIDTH_8 = 0x07, + DMC_COL_WIDTH_9, + DMC_COL_WIDTH_10, + DMC_COL_WIDTH_11, + DMC_COL_WIDTH_12, + DMC_COL_WIDTH_13, + DMC_COL_WIDTH_14, + DMC_COL_WIDTH_15 +}DMC_COL_WIDTH_T; + +/** + * @brief CAS Latency Select + */ +typedef enum +{ + DMC_CAS_LATENCY_1, + DMC_CAS_LATENCY_2, + DMC_CAS_LATENCY_3, + DMC_CAS_LATENCY_4 +}DMC_CAS_LATENCY_T; + +/** + * @brief RAS Minimun Time Select + */ +typedef enum +{ + DMC_RAS_MINIMUM_1, + DMC_RAS_MINIMUM_2, + DMC_RAS_MINIMUM_3, + DMC_RAS_MINIMUM_4, + DMC_RAS_MINIMUM_5, + DMC_RAS_MINIMUM_6, + DMC_RAS_MINIMUM_7, + DMC_RAS_MINIMUM_8, + DMC_RAS_MINIMUM_9, + DMC_RAS_MINIMUM_10, + DMC_RAS_MINIMUM_11, + DMC_RAS_MINIMUM_12, + DMC_RAS_MINIMUM_13, + DMC_RAS_MINIMUM_14, + DMC_RAS_MINIMUM_15, + DMC_RAS_MINIMUM_16 +}DMC_RAS_MINIMUM_T; + +/** + * @brief RAS To CAS Delay Time Select + */ +typedef enum +{ + DMC_DELAY_TIME_1, + DMC_DELAY_TIME_2, + DMC_DELAY_TIME_3, + DMC_DELAY_TIME_4, + DMC_DELAY_TIME_5, + DMC_DELAY_TIME_6, + DMC_DELAY_TIME_7, + DMC_DELAY_TIME_8 +}DMC_DELAY_TIME_T; + +/** + * @brief Precharge Period Select + */ +typedef enum +{ + DMC_PRECHARGE_1, + DMC_PRECHARGE_2, + DMC_PRECHARGE_3, + DMC_PRECHARGE_4, + DMC_PRECHARGE_5, + DMC_PRECHARGE_6, + DMC_PRECHARGE_7, + DMC_PRECHARGE_8 +}DMC_PRECHARGE_T; + +/** + * @brief Last Data Next Precharge For Write Time Select + */ +typedef enum +{ + DMC_NEXT_PRECHARGE_1, + DMC_NEXT_PRECHARGE_2, + DMC_NEXT_PRECHARGE_3, + DMC_NEXT_PRECHARGE_4 +}DMC_NEXT_PRECHARGE_T; + +/** + * @brief Auto-Refresh Period Select + */ +typedef enum +{ + DMC_AUTO_REFRESH_1, + DMC_AUTO_REFRESH_2, + DMC_AUTO_REFRESH_3, + DMC_AUTO_REFRESH_4, + DMC_AUTO_REFRESH_5, + DMC_AUTO_REFRESH_6, + DMC_AUTO_REFRESH_7, + DMC_AUTO_REFRESH_8, + DMC_AUTO_REFRESH_9, + DMC_AUTO_REFRESH_10, + DMC_AUTO_REFRESH_11, + DMC_AUTO_REFRESH_12, + DMC_AUTO_REFRESH_13, + DMC_AUTO_REFRESH_14, + DMC_AUTO_REFRESH_15, + DMC_AUTO_REFRESH_16 +}DMC_AUTO_REFRESH_T; + +/** + * @brief Active-to-active Command Period Select + */ +typedef enum +{ + DMC_ATA_CMD_1, + DMC_ATA_CMD_2, + DMC_ATA_CMD_3, + DMC_ATA_CMD_4, + DMC_ATA_CMD_5, + DMC_ATA_CMD_6, + DMC_ATA_CMD_7, + DMC_ATA_CMD_8, + DMC_ATA_CMD_9, + DMC_ATA_CMD_10, + DMC_ATA_CMD_11, + DMC_ATA_CMD_12, + DMC_ATA_CMD_13, + DMC_ATA_CMD_14, + DMC_ATA_CMD_15, + DMC_ATA_CMD_16 +}DMC_ATA_CMD_T; + +/** + * @brief Clock PHASE + */ +typedef enum +{ + DMC_CLK_PHASE_NORMAL, + DMC_CLK_PHASE_REVERSE +}DMC_CLK_PHASE_T; + +/** + * @brief DMC Memory Size + */ +typedef enum +{ + DMC_MEMORY_SIZE_0, + DMC_MEMORY_SIZE_64KB, + DMC_MEMORY_SIZE_128KB, + DMC_MEMORY_SIZE_256KB, + DMC_MEMORY_SIZE_512KB, + DMC_MEMORY_SIZE_1MB, + DMC_MEMORY_SIZE_2MB, + DMC_MEMORY_SIZE_4MB, + DMC_MEMORY_SIZE_8MB, + DMC_MEMORY_SIZE_16MB, + DMC_MEMORY_SIZE_32MB, + DMC_MEMORY_SIZE_64MB, + DMC_MEMORY_SIZE_128MB, + DMC_MEMORY_SIZE_256MB +}DMC_MEMORY_SIZE_T; + +/** + * @brief Open Banks Of Number + */ +typedef enum +{ + DMC_BANK_NUMBER_1, + DMC_BANK_NUMBER_2, + DMC_BANK_NUMBER_3, + DMC_BANK_NUMBER_4, + DMC_BANK_NUMBER_5, + DMC_BANK_NUMBER_6, + DMC_BANK_NUMBER_7, + DMC_BANK_NUMBER_8, + DMC_BANK_NUMBER_9, + DMC_BANK_NUMBER_10, + DMC_BANK_NUMBER_11, + DMC_BANK_NUMBER_12, + DMC_BANK_NUMBER_13, + DMC_BANK_NUMBER_14, + DMC_BANK_NUMBER_15, + DMC_BANK_NUMBER_16 +}DMC_BANK_NUMBER_T; + +/** + * @brief Full refresh type + */ +typedef enum +{ + DMC_REFRESH_ROW_ONE, /*!< Refresh one row */ + DMC_REFRESH_ROW_ALL /*!< Refresh all row */ +}DMC_REFRESH_T; + +/** + * @brief Precharge type + */ +typedef enum +{ + DMC_PRECHARGE_IM, /*!< Immediate precharge */ + DMC_PRECHARGE_DELAY /*!< Delayed precharge */ +}DMC_PRECHARE_T; + +/** + * @brief WRAP Burst Type + */ +typedef enum +{ + DMC_WRAPB_4, + DMC_WRAPB_8 +}DMC_WRPB_T; + +/**@} end of group DMC_Enumerations */ + + +/** @defgroup DMC_Structures Structures + @{ +*/ + +/** + * @brief Timing config definition + */ +typedef struct +{ + uint32_t latencyCAS : 2; /*!< DMC_CAS_LATENCY_T */ + uint32_t tRAS : 4; /*!< DMC_RAS_MINIMUM_T */ + uint32_t tRCD : 3; /*!< DMC_DELAY_TIME_T */ + uint32_t tRP : 3; /*!< DMC_PRECHARGE_T */ + uint32_t tWR : 2; /*!< DMC_NEXT_PRECHARGE_T */ + uint32_t tARP : 4; /*!< DMC_AUTO_REFRESH_T */ + uint32_t tCMD : 4; /*!< DMC_ATA_CMD_T */ + uint32_t tXSR : 9; /*!< auto-refresh commands, can be 0x000 to 0x1FF */ + uint16_t tRFP : 16; /*!< Refresh period, can be 0x0000 to 0xFFFF */ +}DMC_TimingConfig_T; + +/** + * @brief Config struct definition + */ +typedef struct +{ + DMC_MEMORY_SIZE_T memorySize; /*!< Memory size(byte) */ + DMC_BANK_WIDTH_T bankWidth; /*!< Number of bank bits */ + DMC_ROW_WIDTH_T rowWidth; /*!< Number of row address bits */ + DMC_COL_WIDTH_T colWidth; /*!< Number of col address bits */ + DMC_CLK_PHASE_T clkPhase; /*!< Clock phase */ + DMC_TimingConfig_T timing; /*!< Timing */ +}DMC_Config_T; + +/**@} end of group DMC_Structures */ + + +/** @defgroup DMC_Functions + @{ +*/ + + /* Enable / Disable */ +void DMC_Enable(void); +void DMC_Disable(void); +void DMC_EnableInit(void); + +/* Global config */ +void DMC_Config(DMC_Config_T *dmcConfig); +void DMC_ConfigStructInit(DMC_Config_T *dmcConfig); + +/* Address */ +void DMC_ConfigBankWidth(DMC_BANK_WIDTH_T bankWidth); +void DMC_ConfigAddrWidth(DMC_ROW_WIDTH_T rowWidth, DMC_COL_WIDTH_T colWidth); + +/* Timing */ +void DMC_ConfigTiming(DMC_TimingConfig_T *timingConfig); +void DMC_ConfigTimingStructInit(DMC_TimingConfig_T *timingConfig); +void DMC_ConfigStableTimePowerup(uint16_t stableTime); +void DMC_ConfigAutoRefreshNumDuringInit(DMC_AUTO_REFRESH_T num); +void DMC_ConfigRefreshPeriod(uint16_t period); + +/* Refresh mode */ +void DMC_EixtSlefRefreshMode(void); +void DMC_EnterSlefRefreshMode(void); + +/* Accelerate Module */ +void DMC_EnableAccelerateModule(void); +void DMC_DisableAccelerateModule(void); +/* Config */ +void DMC_ConfigOpenBank(DMC_BANK_NUMBER_T num); +void DMC_EnableUpdateMode(void); +void DMC_EnterPowerdownMode(void); +void DMC_ConfigFullRefreshBeforeSR(DMC_REFRESH_T refresh); +void DMC_ConfigFullRefreshAfterSR(DMC_REFRESH_T refresh); +void DMC_ConfigPrechargeType(DMC_PRECHARE_T precharge); +void DMC_ConfigMemorySize(DMC_MEMORY_SIZE_T memorySize); +void DMC_ConfigClockPhase(DMC_CLK_PHASE_T clkPhase); +void DMC_ConfigWRAPB(DMC_WRPB_T burst); + +/* read flag */ +uint8_t DMC_ReadSelfRefreshStatus(void); + +/**@} end of group DMC_Functions */ +/**@} end of group DMC_Driver*/ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_DMC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_eint.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_eint.h new file mode 100644 index 0000000000..d12726528a --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_eint.h @@ -0,0 +1,137 @@ +/*! + * @file apm32e10x_eint.h + * + * @brief This file contains all the functions prototypes for the EINT firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_EINT_H +#define __APM32E10X_EINT_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup EINT_Driver + @{ +*/ + +/** @defgroup EINT_Enumerations Enumerations + @{ +*/ + +/** + * @brief EINT mode enumeration + */ +typedef enum +{ + EINT_MODE_INTERRUPT = 0x00, + EINT_MODE_EVENT = 0x04 +} EINT_MODE_T; + +/** + * @brief EINT Trigger enumeration + */ +typedef enum +{ + EINT_TRIGGER_RISING = 0x08, + EINT_TRIGGER_FALLING = 0x0C, + EINT_TRIGGER_RISING_FALLING = 0x10 +} EINT_TRIGGER_T; + +typedef enum +{ + EINT_LINENONE = 0x00000, /*! */ + EINT_LINE_0 = 0x00001, /*!< External interrupt line 0 */ + EINT_LINE_1 = 0x00002, /*!< External interrupt line 1 */ + EINT_LINE_2 = 0x00004, /*!< External interrupt line 2 */ + EINT_LINE_3 = 0x00008, /*!< External interrupt line 3 */ + EINT_LINE_4 = 0x00010, /*!< External interrupt line 4 */ + EINT_LINE_5 = 0x00020, /*!< External interrupt line 5 */ + EINT_LINE_6 = 0x00040, /*!< External interrupt line 6 */ + EINT_LINE_7 = 0x00080, /*!< External interrupt line 7 */ + EINT_LINE_8 = 0x00100, /*!< External interrupt line 8 */ + EINT_LINE_9 = 0x00200, /*!< External interrupt line 9 */ + EINT_LINE_10 = 0x00400, /*!< External interrupt line 10 */ + EINT_LINE_11 = 0x00800, /*!< External interrupt line 11 */ + EINT_LINE_12 = 0x01000, /*!< External interrupt line 12 */ + EINT_LINE_13 = 0x02000, /*!< External interrupt line 13 */ + EINT_LINE_14 = 0x04000, /*!< External interrupt line 14 */ + EINT_LINE_15 = 0x08000, /*!< External interrupt line 15 */ + EINT_LINE_16 = 0x10000, /*!< External interrupt line 16 Connected to the PVD Output */ + EINT_LINE_17 = 0x20000, /*!< External interrupt line 17 Connected to the RTC Alarm event */ + EINT_LINE_18 = 0x40000, /*!< External interrupt line 18 Connected to the USB Device */ +} EINT_LINE_T; + +/**@} end of group EINT_Enumerations*/ + + +/** @defgroup EINT_Structures Structures + @{ +*/ + +/** + * @brief EINT Config structure definition + */ +typedef struct +{ + uint32_t line; + EINT_MODE_T mode; + EINT_TRIGGER_T trigger; + uint8_t lineCmd; +} EINT_Config_T; + +/**@} end of group EINT_Structures */ + + +/** @defgroup EINT_Functions Functions + @{ +*/ + +/* Reset and configuration */ +void EINT_Reset(void); +void EINT_Config( EINT_Config_T* eintConfig); +void EINT_ConfigStructInit(EINT_Config_T* eintConfig); + +/* Interrupt and flag */ +void EINT_SelectSWInterrupt(uint32_t line); +uint8_t EINT_ReadStatusFlag(EINT_LINE_T line); +void EINT_ClearStatusFlag(uint32_t line); +uint8_t EINT_ReadIntFlag(EINT_LINE_T line); +void EINT_ClearIntFlag(uint32_t line); + +/**@} end of group EINT_Functions*/ +/**@} end of group EINT_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __APM32E10X_cplusplus +} +#endif + +#endif /* __EINT_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_fmc.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_fmc.h new file mode 100644 index 0000000000..08723d42d1 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_fmc.h @@ -0,0 +1,267 @@ +/*! + * @file apm32e10x_fmc.h + * + * @brief This file contains all the functions prototypes for the FMC firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_FMC_H +#define __APM32E10X_FMC_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup FMC_Driver + @{ +*/ + +/** @defgroup FMC_Macros Macros + @{ +*/ + +/* Macros description */ + +/* Values for APM32 Low and Medium density devices */ +#define FLASH_WRP_PAGE_0_3 ((uint32_t)BIT0) /*!< Write protection of page 0 to 3 */ +#define FLASH_WRP_PAGE_4_7 ((uint32_t)BIT1) /*!< Write protection of page 4 to 7 */ +#define FLASH_WRP_PAGE_8_11 ((uint32_t)BIT2) /*!< Write protection of page 8 to 11 */ +#define FLASH_WRP_PAGE_12_15 ((uint32_t)BIT3) /*!< Write protection of page 12 to 15 */ +#define FLASH_WRP_PAGE_16_19 ((uint32_t)BIT4) /*!< Write protection of page 16 to 19 */ +#define FLASH_WRP_PAGE_20_23 ((uint32_t)BIT5) /*!< Write protection of page 20 to 23 */ +#define FLASH_WRP_PAGE_24_27 ((uint32_t)BIT6) /*!< Write protection of page 24 to 27 */ +#define FLASH_WRP_PAGE_28_31 ((uint32_t)BIT7) /*!< Write protection of page 28 to 31 */ + +/* Values for APM32 Medium-density devices */ +#define FLASH_WRP_PAGE_32_35 ((uint32_t)BIT8) /*!< Write protection of page 32 to 35 */ +#define FLASH_WRP_PAGE_36_39 ((uint32_t)BIT9) /*!< Write protection of page 36 to 39 */ +#define FLASH_WRP_PAGE_40_43 ((uint32_t)BIT10) /*!< Write protection of page 40 to 43 */ +#define FLASH_WRP_PAGE_44_47 ((uint32_t)BIT11) /*!< Write protection of page 44 to 47 */ +#define FLASH_WRP_PAGE_48_51 ((uint32_t)BIT12) /*!< Write protection of page 48 to 51 */ +#define FLASH_WRP_PAGE_52_55 ((uint32_t)BIT13) /*!< Write protection of page 52 to 55 */ +#define FLASH_WRP_PAGE_56_59 ((uint32_t)BIT14) /*!< Write protection of page 56 to 59 */ +#define FLASH_WRP_PAGE_60_63 ((uint32_t)BIT15) /*!< Write protection of page 60 to 63 */ +#define FLASH_WRP_PAGE_64_67 ((uint32_t)BIT16) /*!< Write protection of page 64 to 67 */ +#define FLASH_WRP_PAGE_68_71 ((uint32_t)BIT17) /*!< Write protection of page 68 to 71 */ +#define FLASH_WRP_PAGE_72_75 ((uint32_t)BIT18) /*!< Write protection of page 72 to 75 */ +#define FLASH_WRP_PAGE_76_79 ((uint32_t)BIT19) /*!< Write protection of page 76 to 79 */ +#define FLASH_WRP_PAGE_80_83 ((uint32_t)BIT20) /*!< Write protection of page 80 to 83 */ +#define FLASH_WRP_PAGE_84_87 ((uint32_t)BIT21) /*!< Write protection of page 84 to 87 */ +#define FLASH_WRP_PAGE_88_91 ((uint32_t)BIT22) /*!< Write protection of page 88 to 91 */ +#define FLASH_WRP_PAGE_92_95 ((uint32_t)BIT23) /*!< Write protection of page 92 to 95 */ +#define FLASH_WRP_PAGE_96_99 ((uint32_t)BIT24) /*!< Write protection of page 96 to 99 */ +#define FLASH_WRP_PAGE_100_103 ((uint32_t)BIT25) /*!< Write protection of page 100 to 103 */ +#define FLASH_WRP_PAGE_104_107 ((uint32_t)BIT26) /*!< Write protection of page 104 to 107 */ +#define FLASH_WRP_PAGE_108_111 ((uint32_t)BIT27) /*!< Write protection of page 108 to 111 */ +#define FLASH_WRP_PAGE_112_115 ((uint32_t)BIT28) /*!< Write protection of page 112 to 115 */ +#define FLASH_WRP_PAGE_116_119 ((uint32_t)BIT29) /*!< Write protection of page 116 to 119 */ +#define FLASH_WRP_PAGE_120_123 ((uint32_t)BIT30) /*!< Write protection of page 120 to 123 */ +#define FLASH_WRP_PAGE_124_127 ((uint32_t)BIT31) /*!< Write protection of page 124 to 127 */ + +/* Values only for APM32 High-density devices */ +#define FLASH_WRP_PAGE_0_1 ((uint32_t)BIT0) /*!< Write protection of page 0 to 1 */ +#define FLASH_WRP_PAGE_2_3 ((uint32_t)BIT1) /*!< Write protection of page 2 to 3 */ +#define FLASH_WRP_PAGE_4_5 ((uint32_t)BIT2) /*!< Write protection of page 4 to 5 */ +#define FLASH_WRP_PAGE_6_7 ((uint32_t)BIT3) /*!< Write protection of page 6 to 7 */ +#define FLASH_WRP_PAGE_8_9 ((uint32_t)BIT4) /*!< Write protection of page 8 to 9 */ +#define FLASH_WRP_PAGE_10_11 ((uint32_t)BIT5) /*!< Write protection of page 10 to 11 */ +#define FLASH_WRP_PAGE_12_13 ((uint32_t)BIT6) /*!< Write protection of page 12 to 13 */ +#define FLASH_WRP_PAGE_14_15 ((uint32_t)BIT7) /*!< Write protection of page 14 to 15 */ +#define FLASH_WRP_PAGE_16_17 ((uint32_t)BIT8) /*!< Write protection of page 16 to 17 */ +#define FLASH_WRP_PAGE_18_19 ((uint32_t)BIT9) /*!< Write protection of page 18 to 19 */ +#define FLASH_WRP_PAGE_20_21 ((uint32_t)BIT10) /*!< Write protection of page 20 to 21 */ +#define FLASH_WRP_PAGE_22_23 ((uint32_t)BIT11) /*!< Write protection of page 22 to 23 */ +#define FLASH_WRP_PAGE_24_25 ((uint32_t)BIT12) /*!< Write protection of page 24 to 25 */ +#define FLASH_WRP_PAGE_26_27 ((uint32_t)BIT13) /*!< Write protection of page 26 to 27 */ +#define FLASH_WRP_PAGE_28_29 ((uint32_t)BIT14) /*!< Write protection of page 28 to 29 */ +#define FLASH_WRP_PAGE_30_31 ((uint32_t)BIT15) /*!< Write protection of page 30 to 31 */ +#define FLASH_WRP_PAGE_32_33 ((uint32_t)BIT16) /*!< Write protection of page 32 to 33 */ +#define FLASH_WRP_PAGE_34_35 ((uint32_t)BIT17) /*!< Write protection of page 34 to 35 */ +#define FLASH_WRP_PAGE_36_37 ((uint32_t)BIT18) /*!< Write protection of page 36 to 37 */ +#define FLASH_WRP_PAGE_38_39 ((uint32_t)BIT19) /*!< Write protection of page 38 to 39 */ +#define FLASH_WRP_PAGE_40_41 ((uint32_t)BIT20) /*!< Write protection of page 40 to 41 */ +#define FLASH_WRP_PAGE_42_43 ((uint32_t)BIT21) /*!< Write protection of page 42 to 43 */ +#define FLASH_WRP_PAGE_44_45 ((uint32_t)BIT22) /*!< Write protection of page 44 to 45 */ +#define FLASH_WRP_PAGE_46_47 ((uint32_t)BIT23) /*!< Write protection of page 46 to 47 */ +#define FLASH_WRP_PAGE_48_49 ((uint32_t)BIT24) /*!< Write protection of page 48 to 49 */ +#define FLASH_WRP_PAGE_50_51 ((uint32_t)BIT25) /*!< Write protection of page 50 to 51 */ +#define FLASH_WRP_PAGE_52_53 ((uint32_t)BIT26) /*!< Write protection of page 52 to 53 */ +#define FLASH_WRP_PAGE_54_55 ((uint32_t)BIT27) /*!< Write protection of page 54 to 55 */ +#define FLASH_WRP_PAGE_56_57 ((uint32_t)BIT28) /*!< Write protection of page 56 to 57 */ +#define FLASH_WRP_PAGE_58_59 ((uint32_t)BIT29) /*!< Write protection of page 58 to 59 */ +#define FLASH_WRP_PAGE_60_61 ((uint32_t)BIT30) /*!< Write protection of page 60 to 61 */ +#define FLASH_WRP_PAGE_62_127 ((uint32_t)BIT31) /*!< Write protection of page 62 to 127 */ +#define FMC_WRP_PAGE_ALL ((uint32_t)0xFFFFFFFF) /*!< Write protection of page all */ + +/**@} end of group FMC_Macros */ + +/** @defgroup FMC_Enumerations Enumerations + @{ +*/ + +/** + * @brief Flash Latency + */ +typedef enum +{ + FMC_LATENCY_0, + FMC_LATENCY_1, + FMC_LATENCY_2 +} FMC_LATENCY_T; + +/** + * @brief FMC Status + */ +typedef enum +{ + FMC_STATUS_BUSY = 1, /*!< flash busy */ + FMC_STATUS_ERROR_PG, /*!< flash programming error */ + FMC_STATUS_ERROR_WRP, /*!< flash write protection error */ + FMC_STATUS_COMPLETE, /*!< flash operation complete */ + FMC_STATUS_TIMEOUT /*!< flash time out */ +} FMC_STATUS_T; + +/** + * @brief Option Bytes IWatchdog + */ +typedef enum +{ + OB_IWDT_HARD = 0x0000, + OB_IWDT_SOTF = 0x0001 +} OB_IWDT_T; + +/** + * @brief Option Bytes nRST STOP + */ +typedef enum +{ + OB_STOP_RST = 0x0000, + OB_STOP_NORST = 0x0002 +} OB_STOP_T; + +/** + * @brief Option Bytes nRST STDBY + */ +typedef enum +{ + OB_STDBY_RST = 0x0000, + OB_STDBY_NORST = 0x0004 +} OB_STDBY_T; + +/** + * @brief FMC Interrupts + */ +typedef enum +{ + FMC_INT_ERR, + FMC_INT_OC +} FMC_INT_T; + +/** + * @brief FMC flag + */ +typedef enum +{ + FMC_FLAG_BUSY = 0x00000001, /*!< FMC Busy flag */ + FMC_FLAG_OC = 0x00000020, /*!< FMC End of Operation flag */ + FMC_FLAG_PE = 0x00000004, /*!< FMC Program error flag */ + FMC_FLAG_WPE = 0x00000010, /*!< FMC Write protected error flag */ + FMC_FLAG_OBE = 0x10000001, /*!< FMC Option Byte error flag */ +} FMC_FLAG_T; + +/**@} end of group FMC_Enumerations */ + +/** @defgroup FMC_Structures Structures + @{ +*/ + +/** + * @brief User Option byte config struct definition + */ +typedef struct +{ + OB_IWDT_T iwdtSet; + OB_STOP_T stopSet; + OB_STDBY_T stdbySet; +} FMC_UserConfig_T; + +/**@} end of group FMC_Structures */ + +/** @defgroup FMC_Functions Functions + @{ +*/ + +/* Initialization and Configuration */ +void FMC_ConfigLatency(FMC_LATENCY_T latency); +void FMC_EnableHalfCycleAccess(void); +void FMC_DisableHalfCycleAccess(void); +void FMC_EnablePrefetchBuffer(void); +void FMC_DisablePrefetchBuffer(void); + +/* Lock management */ +void FMC_Unlock(void); +void FMC_Lock(void); + +/* Erase management */ +FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr); +FMC_STATUS_T FMC_EraseAllPage(void); +FMC_STATUS_T FMC_EraseOptionBytes(void); + +/* Read Write management */ +FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data); +FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data); +FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data); +FMC_STATUS_T FMC_EnableWriteProtection(uint32_t page); +FMC_STATUS_T FMC_EnableReadOutProtection(void); +FMC_STATUS_T FMC_DisableReadOutProtection(void); +FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig); +uint32_t FMC_ReadUserOptionByte(void); +uint32_t FMC_ReadOptionByteWriteProtection(void); +uint8_t FMC_GetReadProtectionStatus(void); +uint8_t FMC_ReadPrefetchBufferStatus(void); + +/* Interrupts and flags */ +void FMC_EnableInterrupt(FMC_INT_T interrupt); +void FMC_DisableInterrupt(FMC_INT_T interrupt); +uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag); +void FMC_ClearStatusFlag(uint32_t flag); + +/* Status management */ +FMC_STATUS_T FMC_ReadStatus(void); +FMC_STATUS_T FMC_WaitForLastOperation(uint32_t timeOut); + +/**@} end of group FMC_Functions */ +/**@} end of group FMC_Driver*/ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_FMC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_gpio.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_gpio.h new file mode 100644 index 0000000000..f224260f25 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_gpio.h @@ -0,0 +1,263 @@ +/*! + * @file apm32e10x_gpio.h + * + * @brief This file contains all the functions prototypes for the GPIO firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_GPIO_H +#define __APM32E10X_GPIO_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup GPIO_Driver + @{ +*/ + +/** @defgroup GPIO_Enumerations Enumerations + @{ +*/ + +/** + * @brief GPIO Output Maximum frequency selection + */ +typedef enum +{ + GPIO_SPEED_10MHz = 1, + GPIO_SPEED_2MHz, + GPIO_SPEED_50MHz +}GPIO_SPEED_T; + +/** + * @brief Configuration Mode enumeration + */ +typedef enum +{ + GPIO_MODE_ANALOG = 0x0, /*!< Analog mode */ + GPIO_MODE_IN_FLOATING = 0x04, /*!< Floating input */ + GPIO_MODE_IN_PD = 0x28, /*!< Input with pull-down */ + GPIO_MODE_IN_PU = 0x48, /*!< Input with pull-up */ + GPIO_MODE_OUT_PP = 0x80, /*!< General purpose output push-pull */ + GPIO_MODE_OUT_OD = 0x84, /*!< General purpose output Open-drain */ + GPIO_MODE_AF_PP = 0x88, /*!< Alternate function output Push-pull */ + GPIO_MODE_AF_OD = 0x8C, /*!< Alternate function output Open-drain */ +}GPIO_MODE_T; + +/** + * @brief Definition of the GPIO pins + */ +typedef enum +{ + GPIO_PIN_0 = ((uint16_t)BIT0), + GPIO_PIN_1 = ((uint16_t)BIT1), + GPIO_PIN_2 = ((uint16_t)BIT2), + GPIO_PIN_3 = ((uint16_t)BIT3), + GPIO_PIN_4 = ((uint16_t)BIT4), + GPIO_PIN_5 = ((uint16_t)BIT5), + GPIO_PIN_6 = ((uint16_t)BIT6), + GPIO_PIN_7 = ((uint16_t)BIT7), + GPIO_PIN_8 = ((uint16_t)BIT8), + GPIO_PIN_9 = ((uint16_t)BIT9), + GPIO_PIN_10 = ((uint16_t)BIT10), + GPIO_PIN_11 = ((uint16_t)BIT11), + GPIO_PIN_12 = ((uint16_t)BIT12), + GPIO_PIN_13 = ((uint16_t)BIT13), + GPIO_PIN_14 = ((uint16_t)BIT14), + GPIO_PIN_15 = ((uint16_t)BIT15), + GPIO_PIN_ALL = ((uint32_t)0XFFFF) +} GPIO_PIN_T; + +/** + * @brief GPIO remap type define + */ +typedef enum +{ + GPIO_NO_REMAP_SPI1 = 0x00000010, + GPIO_REMAP_SPI1 = 0x00000011, + + GPIO_NO_REMAP_I2C1 = 0x00000110, + GPIO_REMAP_I2C1 = 0x00000111, + + GPIO_NO_REMAP_USART1 = 0x00000210, + GPIO_REMAP_USART1 = 0x00000211, + + GPIO_NO_REMAP_USART2 = 0x00000310, + GPIO_REMAP_USART2 = 0x00000311, + + GPIO_NO_REMAP_USART3 = 0x00000430, + GPIO_PARTIAL_REMAP_USART3 = 0x00000431, + GPIO_FULL_REMAP_USART3 = 0x00000433, + + GPIO_NO_REMAP_TMR1 = 0x00000630, + GPIO_PARTIAL_REMAP_TMR1 = 0x00000631, + GPIO_FULL_REMAP_TMR1 = 0x00000633, + + GPIO_NO_REMAP_TMR2 = 0x00000830, + GPIO_PARTIAL_REMAP1_TMR2 = 0x00000831, + GPIO_PARTIAL_REMAP2_TMR2 = 0x00000832, + GPIO_FULL_REMAP_TMR2 = 0x00000833, + + GPIO_NO_REMAP_TMR3 = 0x00000A30, + GPIO_PARTIAL_REMAP_TMR3 = 0x00000A32, + GPIO_FULL_REMAP_TMR3 = 0x00000A33, + + GPIO_NO_REMAP_TMR4 = 0x00000C10, + GPIO_REMAP_TMR4 = 0x00000C11, + + GPIO_NO_REMAP_CAN1 = 0x00000D30, + GPIO_REMAP1_CAN1 = 0x00000D32, + GPIO_REMAP2_CAN1 = 0x00000D33, + + GPIO_NO_REMAP_PD01 = 0x00000F10, + GPIO_REMAP_PD01 = 0x00000F11, + + GPIO_NO_REMAP_TMR5CH4_LSI = 0x00001010, + GPIO_REMAP_TMR5CH4_LSI = 0x00001011, + + GPIO_NO_REMAP_ADC1_ETRGINJ = 0x00001110, + GPIO_REMAP_ADC1_ETRGINJ = 0x00001111, + + GPIO_NO_REMAP_ADC1_ETRGREG = 0x00001210, + GPIO_REMAP_ADC1_ETRGREG = 0x00001211, + + GPIO_NO_REMAP_ADC2_ETRGINJ = 0x00001310, + GPIO_REMAP_ADC2_ETRGINJ = 0x00001311, + + GPIO_NO_REMAP_ADC2_ETRGREG = 0x00001410, + GPIO_REMAP_ADC2_ETRGREG = 0x00001411, + + GPIO_NO_REMAP_CAN2 = 0x00001610, + GPIO_REMAP_CAN2 = 0x00001611, + + GPIO_NO_REMAP_SWJ = 0x00001870, + GPIO_REMAP_SWJ_NOJTRST = 0x00001871, + GPIO_REMAP_SWJ_JTAGDISABLE = 0x00001872, + GPIO_REMAP_SWJ_DISABLE = 0x00001874, + + GPIO_NO_REMAP_EMMC_NADV = 0x00010A10, + GPIO_REMAP_EMMC_NADV = 0x00010A11 +}GPIO_REMAP_T; + +/** + * @brief gpio port source define + */ +typedef enum +{ + GPIO_PORT_SOURCE_A, + GPIO_PORT_SOURCE_B, + GPIO_PORT_SOURCE_C, + GPIO_PORT_SOURCE_D, + GPIO_PORT_SOURCE_E, + GPIO_PORT_SOURCE_F, + GPIO_PORT_SOURCE_G +}GPIO_PORT_SOURCE_T; + +/** + * @brief gpio pin source define + */ +typedef enum +{ + GPIO_PIN_SOURCE_0, + GPIO_PIN_SOURCE_1, + GPIO_PIN_SOURCE_2, + GPIO_PIN_SOURCE_3, + GPIO_PIN_SOURCE_4, + GPIO_PIN_SOURCE_5, + GPIO_PIN_SOURCE_6, + GPIO_PIN_SOURCE_7, + GPIO_PIN_SOURCE_8, + GPIO_PIN_SOURCE_9, + GPIO_PIN_SOURCE_10, + GPIO_PIN_SOURCE_11, + GPIO_PIN_SOURCE_12, + GPIO_PIN_SOURCE_13, + GPIO_PIN_SOURCE_14, + GPIO_PIN_SOURCE_15 +}GPIO_PIN_SOURCE_T; + +/**@} end of group GPIO_Enumerations */ + + +/** @defgroup GPIO_Structures Structures + @{ +*/ + +/** + * @brief GPIO Config structure definition + */ +typedef struct +{ + uint16_t pin; + GPIO_SPEED_T speed; + GPIO_MODE_T mode; +}GPIO_Config_T; + +/**@} end of group GPIO_Structures */ + +/** @defgroup GPIO_Functions Functions + @{ +*/ + +/* Reset and common Configuration */ +void GPIO_Reset(GPIO_T* port); +void GPIO_AFIOReset(void); +void GPIO_Config(GPIO_T* port, GPIO_Config_T* gpioConfig); +void GPIO_ConfigStructInit(GPIO_Config_T* gpioConfig); + +/* Read */ +uint8_t GPIO_ReadInputBit(GPIO_T* port, uint16_t pin); +uint16_t GPIO_ReadInputPort(GPIO_T* port); +uint8_t GPIO_ReadOutputBit(GPIO_T* port, uint16_t pin); +uint16_t GPIO_ReadOutputPort(GPIO_T* port); + +/* Write */ +void GPIO_SetBit(GPIO_T* port, uint16_t pin); +void GPIO_ResetBit(GPIO_T* port, uint16_t pin); +void GPIO_WriteOutputPort(GPIO_T* port, uint16_t portValue); +void GPIO_WriteBitValue(GPIO_T* port, uint16_t pin, uint8_t bitVal); + +/* GPIO Configuration */ +void GPIO_ConfigPinLock(GPIO_T* port, uint16_t pin); +void GPIO_ConfigEventOutput(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource); +void GPIO_EnableEventOutput(void); +void GPIO_DisableEventOutput(void); +void GPIO_ConfigPinRemap(GPIO_REMAP_T remap); +void GPIO_ConfigEINTLine(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource); + +/**@} end of group GPIO_Functions */ +/**@} end of group GPIO_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_GPIO_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_i2c.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_i2c.h new file mode 100644 index 0000000000..ff57ac8c01 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_i2c.h @@ -0,0 +1,350 @@ +/*! + * @file apm32e10x_i2c.h + * + * @brief This file contains all the functions prototypes for the I2C firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_I2C_H +#define __APM32E10X_I2C_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup I2C_Driver + @{ +*/ + +/** @defgroup I2C_Enumerations Enumerations + @{ +*/ + +/** + * @brief I2C Mode + */ +typedef enum +{ + I2C_MODE_I2C = 0x0000, + I2C_MODE_SMBUUSDEVICE = 0x0002, + I2C_MODE_SMBUSHOST = 0x000A +} I2C_MODE_T; + +/** + * @brief I2C duty cycle in fast mode + */ +typedef enum +{ + I2C_DUTYCYCLE_16_9 = 0x4000, + I2C_DUTYCYCLE_2 = 0xBFFF +} I2C_DUTYCYCLE_T; + +/** + * @brief I2C acknowledgement + */ +typedef enum +{ + I2C_ACK_DISABLE, + I2C_ACK_ENABLE +} I2C_ACK_T; + +/** + * @brief I2C acknowledged address + */ +typedef enum +{ + I2C_ACK_ADDRESS_7BIT = 0x4000, + I2C_ACK_ADDRESS_10BIT = 0xC000 +} I2C_ACK_ADDRESS_T; + +/** + * @brief I2C interrupts definition + */ +typedef enum +{ + I2C_INT_BUF = 0x0400, + I2C_INT_EVT = 0x0200, + I2C_INT_ERR = 0x0100 +} I2C_INT_T; + +/** + * @brief I2C transfer direction + */ + +typedef enum +{ + I2C_DIRECTION_TX, + I2C_DIRECTION_RX +} I2C_DIRECTION_T; + +/** + * @brief I2C Register + */ +typedef enum +{ + I2C_REGISTER_CTRL1, + I2C_REGISTER_CTRL2, + I2C_REGISTER_SADDR1, + I2C_REGISTER_SADDR2, + I2C_REGISTER_DATA, + I2C_REGISTER_STS1, + I2C_REGISTER_STS2, + I2C_REGISTER_CLKCTRL, + I2C_REGISTER_RISETMAX, + I2C_REGISTER_SWITCH +} I2C_REGISTER_T; + +/** + * @brief I2C NCAK position + */ +typedef enum +{ + I2C_NACK_POSITION_NEXT, + I2C_NACK_POSITION_CURRENT +} I2C_NACK_POSITION_T; + +/** + * @brief I2C SMBus alert pin level + */ +typedef enum +{ + I2C_SMBUSALER_LOW, + I2C_SMBUSALER_HIGH +} I2C_SMBUSALER_T; + +/** + * @brief I2C PEC position + */ +typedef enum +{ + I2C_PEC_POSITION_NEXT, + I2C_PEC_POSITION_CURRENT +} I2C_PEC_POSITION_T; + +/** + * @brief I2C Events + */ +typedef enum +{ + /* I2C Master Events */ + /* Event 5: Communication start event */ + I2C_EVENT_MASTER_MODE_SELECT = 0x00030001, /*!< BUSBSYFLG, MSFLG and STARTFLG flag */ + + /* + Event 6: 7-bit Address Acknowledge + in case of master receiver + */ + I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED = 0x00070082, /*!< BUSBSYFLG, MSFLG, ADDRFLG, TXBEFLG and TRFLG flags */ + I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED = 0x00030002, /*!< BUSBSYFLG, MSFLG and ADDRFLG flags */ + /** + Event 9: Master has sent the first byte + in 10-bit address mode + */ + I2C_EVENT_MASTER_MODE_ADDRESS10 = 0x00030008, /*!< BUSBSYFLG, MSFLG and ADDR10FLG flags */ + + /* Master RECEIVER mode */ + /* Event 7 */ + I2C_EVENT_MASTER_BYTE_RECEIVED = 0x00030040, /*!< BUSBSYFLG, MSFLG and RXBNEFLG flags */ + + /* Master TRANSMITTER mode */ + /* Event 8 */ + I2C_EVENT_MASTER_BYTE_TRANSMITTING = 0x00070080, /*!< TRFLG, BUSBSYFLG, MSFLG, TXBEFLG flags */ + /* Event 8_2 */ + I2C_EVENT_MASTER_BYTE_TRANSMITTED = 0x00070084, /*!< TRFLG, BUSBSYFLG, MSFLG, TXBEFLG and BTCFLG flags */ + + + /* EV1 (all the events below are variants of EV1) */ + /* 1, Case of One Single Address managed by the slave */ + I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED = 0x00020002, /*!< BUSBSYFLG and ADDRFLG flags */ + I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED = 0x00060082, /*!< TRFLG, BUSBSYFLG, TXBEFLG and ADDRFLG flags */ + + /* 2, Case of Dual address managed by the slave */ + I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED = 0x00820000, /*!< DUALF and BUSBSYFLG flags */ + I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED = 0x00860080, /*!< DUALF, TRFLG, BUSBSYFLG and TXBEFLG flags */ + + /* 3, Case of General Call enabled for the slave */ + I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED = 0x00120000, /*!< GENCALL and BUSBSYFLG flags */ + + + /* Slave RECEIVER mode */ + /* EV2 */ + I2C_EVENT_SLAVE_BYTE_RECEIVED = 0x00020040, /*!< BUSBSYFLG and RXBNEFLG flags */ + /* EV4 */ + I2C_EVENT_SLAVE_STOP_DETECTED = 0x00000010, /*!< STOPFLG flag */ + + /* Slave TRANSMITTER mode */ + /* EV3 */ + I2C_EVENT_SLAVE_BYTE_TRANSMITTED = 0x00060084, /*!< TRFLG, BUSBSYFLG, TXBEFLG and BTCFLG flags */ + I2C_EVENT_SLAVE_BYTE_TRANSMITTING = 0x00060080, /*!< TRFLG, BUSBSYFLG and TXBEFLG flags */ + /* EV3_2 */ + I2C_EVENT_SLAVE_ACK_FAILURE = 0x00000400, /*!< AEFLG flag */ +} I2C_EVENT_T; + +/** + * @brief I2C flags + */ +typedef enum +{ + /* STS2 register flags */ + I2C_FLAG_DUALADDR, + I2C_FLAG_SMMHADDR, + I2C_FLAG_SMBDADDR, + I2C_FLAG_GENCALL, + I2C_FLAG_TR, + I2C_FLAG_BUSBSY, + I2C_FLAG_MS, + + /* STS1 register flags */ + I2C_FLAG_SMBALT, + I2C_FLAG_TTE, + I2C_FLAG_PECE, + I2C_FLAG_OVRUR, + I2C_FLAG_AE, + I2C_FLAG_AL, + I2C_FLAG_BERR, + I2C_FLAG_TXBE, + I2C_FLAG_RXBNE, + I2C_FLAG_STOP, + I2C_FLAG_ADDR10, + I2C_FLAG_BTC, + I2C_FLAG_ADDR, + I2C_FLAG_START, +} I2C_FLAG_T; + +/** + * @brief I2C interrupt + */ +typedef enum +{ + I2C_INT_FLAG_SMBALT = 0x01008000, + I2C_INT_FLAG_TTE = 0x01004000, + I2C_INT_FLAG_PECE = 0x01001000, + I2C_INT_FLAG_OVRUR = 0x01000800, + I2C_INT_FLAG_AE = 0x01000400, + I2C_INT_FLAG_AL = 0x01000200, + I2C_INT_FLAG_BERR = 0x01000100, + I2C_INT_FLAG_TXBE = 0x06000080, + I2C_INT_FLAG_RXBNE = 0x06000040, + I2C_INT_FLAG_STOP = 0x02000010, + I2C_INT_FLAG_ADDR10 = 0x02000008, + I2C_INT_FLAG_BTC = 0x02000004, + I2C_INT_FLAG_ADDR = 0x02000002, + I2C_INT_FLAG_START = 0x02000001, +} I2C_INT_FLAG_T; + +/**@} end of group I2C_Enumerations */ + +/** @defgroup I2C_Structures Structures + @{ +*/ + +/** + * @brief I2C Config structure definition + */ +typedef struct +{ + uint32_t clockSpeed; + I2C_MODE_T mode; + I2C_DUTYCYCLE_T dutyCycle; + uint16_t ownAddress1; + I2C_ACK_T ack; + I2C_ACK_ADDRESS_T ackAddress; +} I2C_Config_T; + +/**@} end of group I2C_Structures */ + + +/** @defgroup I2C_Functions Functions + @{ +*/ + +/* I2C reset and configuration */ +void I2C_Reset(I2C_T* i2c); +void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig); +void I2C_ConfigStructInit(I2C_Config_T* i2cConfig); +void I2C_Enable(I2C_T* i2c); +void I2C_Disable(I2C_T* i2c); +void I2C_EnableGenerateStart(I2C_T* i2c); +void I2C_DisableGenerateStart(I2C_T* i2c); +void I2C_EnableGenerateStop(I2C_T* i2c); +void I2C_DisableGenerateStop(I2C_T* i2c); +void I2C_EnableAcknowledge(I2C_T* i2c); +void I2C_DisableAcknowledge(I2C_T* i2c); +void I2C_ConfigOwnAddress2(I2C_T* i2c, uint8_t address); +void I2C_EnableDualAddress(I2C_T* i2c); +void I2C_DisableDualAddress(I2C_T* i2c); +void I2C_EnableGeneralCall(I2C_T* i2c); +void I2C_DisableGeneralCall(I2C_T* i2c); + +/* Transmit Configuration */ +void I2C_TxData(I2C_T* i2c, uint8_t data); +uint8_t I2C_RxData(I2C_T* i2c); +void I2C_Tx7BitAddress(I2C_T* i2c, uint8_t address, I2C_DIRECTION_T direction); +uint16_t I2C_ReadRegister(I2C_T* i2c, I2C_REGISTER_T i2cRegister); +void I2C_EnableSoftwareReset(I2C_T* i2c); +void I2C_DisableSoftwareReset(I2C_T* i2c); +void I2C_ConfigNACKPosition(I2C_T* i2c, I2C_NACK_POSITION_T NACKPosition); +void I2C_ConfigSMBusAlert(I2C_T* i2c, I2C_SMBUSALER_T SMBusState); +void I2C_EnablePECTransmit(I2C_T* i2c); +void I2C_DisablePECTransmit(I2C_T* i2c); +void I2C_ConfigPECPosition(I2C_T* i2c, I2C_PEC_POSITION_T PECPosition); +void I2C_EnablePEC(I2C_T* i2c); +void I2C_DisablePEC(I2C_T* i2c); +uint8_t I2C_ReadPEC(I2C_T* i2c); +void I2C_EnableARP(I2C_T* i2c); +void I2C_DisableARP(I2C_T* i2c); +void I2C_EnableStretchClock(I2C_T* i2c); +void I2C_DisableStretchClock(I2C_T* i2c); +void I2C_ConfigFastModeDutyCycle(I2C_T* i2c, I2C_DUTYCYCLE_T dutyCycle); + +/* DMA */ +void I2C_EnableDMA(I2C_T* i2c); +void I2C_DisableDMA(I2C_T* i2c); +void I2C_EnableDMALastTransfer(I2C_T* i2c); +void I2C_DisableDMALastTransfer(I2C_T* i2c); + +/* Interrupts and flags */ +void I2C_EnableInterrupt(I2C_T* i2c, uint16_t interrupt); +void I2C_DisableInterrupt(I2C_T* i2c, uint16_t interrupt); +uint8_t I2C_ReadEventStatus(I2C_T* i2c, I2C_EVENT_T i2cEvent); +uint32_t I2C_ReadLastEvent(I2C_T* i2c); +uint8_t I2C_ReadStatusFlag(I2C_T* i2c, I2C_FLAG_T flag); +void I2C_ClearStatusFlag(I2C_T* i2c, I2C_FLAG_T flag); +uint8_t I2C_ReadIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag); +void I2C_ClearIntFlag(I2C_T* i2c, uint32_t flag); + +/**@} end of group I2C_Functions*/ +/**@} end of group I2C_Driver*/ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_I2C_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_iwdt.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_iwdt.h new file mode 100644 index 0000000000..5d1a044a4e --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_iwdt.h @@ -0,0 +1,124 @@ +/*! + * @file apm32e10x_iwdt.h + * + * @brief This file contains all the functions prototypes for the IWDT firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_IWDT_H +#define __APM32E10X_IWDT_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup IWDT_Driver + @{ +*/ + +/** @defgroup IWDT_Enumerations Enumerations + @{ +*/ + +/** + * @brief IWDT KEYWORD define + */ +typedef enum +{ + IWDT_KEYWORD_RELOAD = 0xAAAA, + IWDT_KEYWORD_ENABLE = 0xCCCC +}IWDT_KEYWORD_T; + +/** + * @brief IWDT Write Access define + */ +typedef enum +{ + IWDT_WRITEACCESS_ENABLE = 0x5555, + IWDT_WRITEACCESS_DISABLE = 0x0000 +}IWDT_WRITEACCESS_T; + +/** + * @brief IWDT Divider + */ +typedef enum +{ + IWDT_DIVIDER_4 = 0x00, + IWDT_DIVIDER_8 = 0x01, + IWDT_DIVIDER_16 = 0x02, + IWDT_DIVIDER_32 = 0x03, + IWDT_DIVIDER_64 = 0x04, + IWDT_DIVIDER_128 = 0x05, + IWDT_DIVIDER_256 = 0x06 +}IWDT_DIVIDER_T; + +/** + * @brief IWDT Flag + */ +typedef enum +{ + IWDT_FLAG_PSCU = BIT0, + IWDT_FLAG_CNTU = BIT1 +}IWDT_FLAG_T; + +/**@} end of group IWDT_Enumerations */ + + +/** @defgroup IWDT_Functions Functions + @{ +*/ + +/* Enable IWDT */ +void IWDT_Enable(void); + +/* Refresh IWDT */ +void IWDT_Refresh(void); + +/* Counter reload */ +void IWDT_ConfigReload(uint16_t reload); + +/* Divider */ +void IWDT_ConfigDivider(uint8_t div); + +/* Write Access */ +void IWDT_EnableWriteAccess(void); +void IWDT_DisableWriteAccess(void); + +/* flag */ +uint8_t IWDT_ReadStatusFlag(uint16_t flag); + +/**@} end of group IWDT_Functions*/ +/**@} end of group IWDT_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_IWDT_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_misc.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_misc.h new file mode 100644 index 0000000000..e2bbaf79d6 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_misc.h @@ -0,0 +1,120 @@ +/*! + * @file apm32e10x_misc.h + * + * @brief This file provides all the miscellaneous firmware functions. + * Include NVIC,SystemTick and Power management. + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_MISC_H +#define __APM32E10X_MISC_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup MISC_Driver + @{ +*/ + +/** @defgroup MISC_Enumerations Enumerations + @{ +*/ + +/** + * @brief NVIC Vect table + */ +typedef enum +{ + NVIC_VECT_TAB_RAM = 0x20000000, + NVIC_VECT_TAB_FLASH = 0x08000000 +}NVIC_VECT_TAB_T; + +/** + * @brief system low power mode + */ +typedef enum +{ + NVIC_LOWPOWER_SEVONPEND = 0x10, + NVIC_LOWPOWER_SLEEPDEEP = 0x04, + NVIC_LOWPOWER_SLEEPONEXIT = 0x02 +}NVIC_LOWPOWER_T; + +/** + * @brief nvic priority group + */ +typedef enum +{ + NVIC_PRIORITY_GROUP_0 = 0x700, /*!< 0 bits for pre-emption priority,4 bits for subpriority */ + NVIC_PRIORITY_GROUP_1 = 0x600, /*!< 1 bits for pre-emption priority,3 bits for subpriority */ + NVIC_PRIORITY_GROUP_2 = 0x500, /*!< 2 bits for pre-emption priority,2 bits for subpriority */ + NVIC_PRIORITY_GROUP_3 = 0x400, /*!< 3 bits for pre-emption priority,1 bits for subpriority */ + NVIC_PRIORITY_GROUP_4 = 0x300 /*!< 4 bits for pre-emption priority,0 bits for subpriority */ +}NVIC_PRIORITY_GROUP_T; + +/** + * @brief SysTick Clock source + */ +typedef enum +{ + SYSTICK_CLK_SOURCE_HCLK_DIV8 = 0x00, + SYSTICK_CLK_SOURCE_HCLK = 0x01 +}SYSTICK_CLK_SOURCE_T; + +/**@} end of group MISC_Enumerations*/ + + +/** @defgroup MISC_Functions + @{ +*/ + +/* NVIC */ +void NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_T priorityGroup); +void NVIC_EnableIRQRequest(IRQn_Type irq, uint8_t preemptionPriority, uint8_t subPriority); +void NVIC_DisableIRQRequest(IRQn_Type irq); + +/* Vector Table */ +void NVIC_ConfigVectorTable(NVIC_VECT_TAB_T vectTab, uint32_t offset); + +/* Power */ +void NVIC_SetSystemLowPower(NVIC_LOWPOWER_T lowPowerMode); +void NVIC_ResetystemLowPower(NVIC_LOWPOWER_T lowPowerMode); + +/* Systick */ +void SysTick_ConfigCLKSource(SYSTICK_CLK_SOURCE_T clkSource); + +/**@} end of group MISC_Functions */ +/**@} end of group MISC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_MISC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_pmu.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_pmu.h new file mode 100644 index 0000000000..b455c1c6c5 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_pmu.h @@ -0,0 +1,122 @@ +/*! + * @file apm32e10x_pmu.h + * + * @brief This file contains all the functions prototypes for the PMU firmware library. + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_PMU_H +#define __APM32E10X_PMU_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup PMU_Driver + @{ +*/ + +/** @defgroup PMU_Enumerations Enumerations + @{ +*/ + +/** + * @brief PMU PVD detection level + */ +typedef enum +{ + PMU_PVD_LEVEL_2V2 = 0x00, /*!< PVD detection level set to 2.2V */ + PMU_PVD_LEVEL_2V3 = 0x01, /*!< PVD detection level set to 2.3V */ + PMU_PVD_LEVEL_2V4 = 0x02, /*!< PVD detection level set to 2.4V */ + PMU_PVD_LEVEL_2V5 = 0x03, /*!< PVD detection level set to 2.5V */ + PMU_PVD_LEVEL_2V6 = 0x04, /*!< PVD detection level set to 2.6V */ + PMU_PVD_LEVEL_2V7 = 0x05, /*!< PVD detection level set to 2.7V */ + PMU_PVD_LEVEL_2V8 = 0x06, /*!< PVD detection level set to 2.8V */ + PMU_PVD_LEVEL_2V9 = 0x07, /*!< PVD detection level set to 2.9V */ +} PMU_PVD_LEVEL_T; + +/** + * @brief PMU Regulator state in STOP mode + */ +typedef enum +{ + PMU_REGULATOR_ON = 0x00, + PMU_REGULATOR_LOWPOWER = 0x01 +} PMU_REGULATOR_T; + +typedef enum +{ + PMU_STOP_ENTRY_WFI = 0x01, + PMU_STOP_ENTRY_WFE = 0x02 +} PMU_STOP_ENTRY_T; + +/** + * @brief PMU Flag + */ +typedef enum +{ + PMU_FLAG_WUE, + PMU_FLAG_SB, + PMU_FLAG_PVDO +} PMU_FLAG_T; + +/**@} end of group PMU_Enumerations */ + + +/** @addtogroup PMU_Functions Functions + @{ +*/ + +/* PMU Reset */ +void PMU_Reset(void); + +/* Configuration and Operation modes */ +void PMU_EnableBackupAccess(void); +void PMU_DisableBackupAccess(void); +void PMU_EnablePVD(void); +void PMU_DisablePVD(void); +void PMU_ConfigPVDLevel(PMU_PVD_LEVEL_T level); +void PMU_EnableWakeUpPin(void); +void PMU_DisableWakeUpPin(void); +void PMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry); +void PMU_EnterSTANDBYMode(void); + +/* flags */ +uint8_t PMU_ReadStatusFlag(PMU_FLAG_T flag); +void PMU_ClearStatusFlag(PMU_FLAG_T flag); + +/**@} end of group PMU_Functions */ +/**@} end of group PMU_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_PMU_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_rcm.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_rcm.h new file mode 100644 index 0000000000..fded72fd10 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_rcm.h @@ -0,0 +1,381 @@ +/*! + * @file apm32e10x_rcm.h + * + * @brief This file contains all the functions prototypes for the RCM firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_RCM_H +#define __APM32E10X_RCM_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup RCM_Driver + @{ +*/ + +/** @defgroup RCM_Enumerations Enumerations + @{ +*/ + +/** + * @brief HSE state + */ +typedef enum +{ + RCM_HSE_CLOSE, /*!< CLOSE HSE */ + RCM_HSE_OPEN, /*!< OPEN HSE */ + RCM_HSE_BYPASS, /*!< HSE BYPASS */ +} RCM_HSE_T; + +/** + * @brief PLL multiplication factor + */ +typedef enum +{ + RCM_PLLMF_2, + RCM_PLLMF_3, + RCM_PLLMF_4, + RCM_PLLMF_5, + RCM_PLLMF_6, + RCM_PLLMF_7, + RCM_PLLMF_8, + RCM_PLLMF_9, + RCM_PLLMF_10, + RCM_PLLMF_11, + RCM_PLLMF_12, + RCM_PLLMF_13, + RCM_PLLMF_14, + RCM_PLLMF_15, + RCM_PLLMF_16 +} RCM_PLLMF_T; + +/** + * @brief System clock select + */ +typedef enum +{ + RCM_SYSCLK_SEL_HSI, + RCM_SYSCLK_SEL_HSE, + RCM_SYSCLK_SEL_PLL +} RCM_SYSCLK_SEL_T; + +/** + * @brief AHB divider Number + */ +typedef enum +{ + RCM_AHB_DIV_1 = 7, + RCM_AHB_DIV_2, + RCM_AHB_DIV_4, + RCM_AHB_DIV_8, + RCM_AHB_DIV_16, + RCM_AHB_DIV_64, + RCM_AHB_DIV_128, + RCM_AHB_DIV_256, + RCM_AHB_DIV_512 +} RCM_AHB_DIV_T; + +/** + * @brief APB divider Number + */ +typedef enum +{ + RCM_APB_DIV_1 = 3, + RCM_APB_DIV_2, + RCM_APB_DIV_4, + RCM_APB_DIV_8, + RCM_APB_DIV_16 +} RCM_APB_DIV_T; + +/** + * @brief USB divider Number + */ +typedef enum +{ + RCM_USB_DIV_1_5, + RCM_USB_DIV_1, + RCM_USB_DIV_2, + RCM_USB_DIV_2_5 +} RCM_USB_DIV_T; + +/** + * @brief FPU divider Number + */ +typedef enum +{ + RCM_FPU_DIV_1, + RCM_FPU_DIV_2 +} RCM_FPU_DIV_T; + +/** + * @brief ADC divider Number + */ +typedef enum +{ + RCM_PCLK2_DIV_2, + RCM_PCLK2_DIV_4, + RCM_PCLK2_DIV_6, + RCM_PCLK2_DIV_8 +} RCM_PCLK2_DIV_T; + +/** + * @brief LSE State + */ +typedef enum +{ + RCM_LSE_CLOSE, + RCM_LSE_OPEN, + RCM_LSE_BYPASS +} RCM_LSE_T; + +/** + * @brief RTC clock select + */ +typedef enum +{ + RCM_RTCCLK_LSE = 1, + RCM_RTCCLK_LSI, + RCM_RTCCLK_HSE_DIV_128 +} RCM_RTCCLK_T; + +/** + * @brief Clock output control + */ +typedef enum +{ + RCM_MCOCLK_NO_CLOCK = 3, + RCM_MCOCLK_SYSCLK, + RCM_MCOCLK_HSI, + RCM_MCOCLK_HSE, + RCM_MCOCLK_PLLCLK_DIV_2 +} RCM_MCOCLK_T; + +/** + * @brief PLL entry clock select + */ +typedef enum +{ + RCM_PLLSEL_HSI_DIV_2 = 0, + RCM_PLLSEL_HSE = 1, + RCM_PLLSEL_HSE_DIV2 = 3, +} RCM_PLLSEL_T; + +/** + * @brief RCM Interrupt Source + */ +typedef enum +{ + RCM_INT_LSIRDY = BIT0, /*!< LSI ready interrupt */ + RCM_INT_LSERDY = BIT1, /*!< LSE ready interrupt */ + RCM_INT_HSIRDY = BIT2, /*!< HSI ready interrupt */ + RCM_INT_HSERDY = BIT3, /*!< HSE ready interrupt */ + RCM_INT_PLLRDY = BIT4, /*!< PLL ready interrupt */ + RCM_INT_CSS = BIT7 /*!< Clock security system interrupt */ +} RCM_INT_T; + +/** + * @brief AHB peripheral + */ +typedef enum +{ + RCM_AHB_PERIPH_DMA1 = BIT0, + RCM_AHB_PERIPH_DMA2 = BIT1, + RCM_AHB_PERIPH_SRAM = BIT2, + RCM_AHB_PERIPH_FPU = BIT3, + RCM_AHB_PERIPH_FMC = BIT4, + RCM_AHB_PERIPH_QSPI = BIT5, + RCM_AHB_PERIPH_CRC = BIT6, + RCM_AHB_PERIPH_SMC = BIT8, + RCM_AHB_PERIPH_SDIO = BIT10 +} RCM_AHB_PERIPH_T; + +/** + * @brief AHB2 peripheral + */ +typedef enum +{ + RCM_APB2_PERIPH_AFIO = BIT0, + RCM_APB2_PERIPH_GPIOA = BIT2, + RCM_APB2_PERIPH_GPIOB = BIT3, + RCM_APB2_PERIPH_GPIOC = BIT4, + RCM_APB2_PERIPH_GPIOD = BIT5, + RCM_APB2_PERIPH_GPIOE = BIT6, + RCM_APB2_PERIPH_GPIOF = BIT7, + RCM_APB2_PERIPH_GPIOG = BIT8, + RCM_APB2_PERIPH_ADC1 = BIT9, + RCM_APB2_PERIPH_ADC2 = BIT10, + RCM_APB2_PERIPH_TMR1 = BIT11, + RCM_APB2_PERIPH_SPI1 = BIT12, + RCM_APB2_PERIPH_TMR8 = BIT13, + RCM_APB2_PERIPH_USART1 = BIT14, + RCM_APB2_PERIPH_ADC3 = BIT15 +} RCM_APB2_PERIPH_T; + +/** + * @brief AHB1 peripheral + */ +typedef enum +{ + RCM_APB1_PERIPH_TMR2 = BIT0, + RCM_APB1_PERIPH_TMR3 = BIT1, + RCM_APB1_PERIPH_TMR4 = BIT2, + RCM_APB1_PERIPH_TMR5 = BIT3, + RCM_APB1_PERIPH_TMR6 = BIT4, + RCM_APB1_PERIPH_TMR7 = BIT5, + RCM_APB1_PERIPH_WWDT = BIT11, + RCM_APB1_PERIPH_SPI2 = BIT14, + RCM_APB1_PERIPH_SPI3 = BIT15, + RCM_APB1_PERIPH_USART2 = BIT17, + RCM_APB1_PERIPH_USART3 = BIT18, + RCM_APB1_PERIPH_UART4 = BIT19, + RCM_APB1_PERIPH_UART5 = BIT20, + RCM_APB1_PERIPH_I2C1 = BIT21, + RCM_APB1_PERIPH_I2C2 = BIT22, + RCM_APB1_PERIPH_USB = BIT23, + RCM_APB1_PERIPH_CAN1 = BIT25, + RCM_APB1_PERIPH_CAN2 = BIT26, + RCM_APB1_PERIPH_BAKR = BIT27, + RCM_APB1_PERIPH_PMU = BIT28, + RCM_APB1_PERIPH_DAC = BIT29 +} RCM_APB1_PERIPH_T; + +/** + * @brief RCM FLAG define + */ +typedef enum +{ + RCM_FLAG_HSIRDY = 0x001, /*!< HSI Ready Flag */ + RCM_FLAG_HSERDY = 0x011, /*!< HSE Ready Flag */ + RCM_FLAG_PLLRDY = 0x019, /*!< PLL Ready Flag */ + RCM_FLAG_LSERDY = 0x101, /*!< LSE Ready Flag */ + RCM_FLAG_LSIRDY = 0x201, /*!< LSI Ready Flag */ + RCM_FLAG_PINRST = 0x21A, /*!< PIN reset flag */ + RCM_FLAG_PORRST = 0x21B, /*!< POR/PDR reset flag */ + RCM_FLAG_SWRST = 0x21C, /*!< Software reset flag */ + RCM_FLAG_IWDTRST = 0x21D, /*!< Independent watchdog reset flag */ + RCM_FLAG_WWDTRST = 0x21E, /*!< Window watchdog reset flag */ + RCM_FLAG_LPRRST = 0x21F /*!< Low-power reset flag */ +} RCM_FLAG_T; + +/**@} end of group RCM_Enumerations */ + + +/** @defgroup RCM_Functions Functions + @{ +*/ + +/* Function description */ + +/* RCM Reset */ +void RCM_Reset(void); + +/* HSE clock */ +void RCM_ConfigHSE(RCM_HSE_T state); +uint8_t RCM_WaitHSEReady(void); + +/* HSI clock */ +void RCM_ConfigHSITrim(uint8_t HSITrim); +void RCM_EnableHSI(void); +void RCM_DisableHSI(void); + +/* LSE and LSI clock */ +void RCM_ConfigLSE(RCM_LSE_T state); +void RCM_EnableLSI(void); +void RCM_DisableLSI(void); + +/* PLL clock */ +void RCM_ConfigPLL(RCM_PLLSEL_T pllSelect, RCM_PLLMF_T pllMf); +void RCM_EnablePLL(void); +void RCM_DisablePLL(void); + +/* Clock Security System */ +void RCM_EnableCSS(void); +void RCM_DisableCSS(void); + +void RCM_ConfigMCO(RCM_MCOCLK_T mcoClock); +void RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_T sysClkSelect); +RCM_SYSCLK_SEL_T RCM_ReadSYSCLKSource(void); + +/* Config clock prescaler of AHB, APB1, APB2, USB and ADC */ +void RCM_ConfigAHB(RCM_AHB_DIV_T AHBDiv); +void RCM_ConfigAPB1(RCM_APB_DIV_T APB1Div); +void RCM_ConfigAPB2(RCM_APB_DIV_T APB2Div); +void RCM_ConfigUSBCLK(RCM_USB_DIV_T USBDiv); +void RCM_ConfigFPUCLK(RCM_FPU_DIV_T FPUDiv); +void RCM_ConfigADCCLK(RCM_PCLK2_DIV_T ADCDiv); + +/* RTC clock */ +void RCM_ConfigRTCCLK(RCM_RTCCLK_T rtcClkSelect); +void RCM_EnableRTCCLK(void); +void RCM_DisableRTCCLK(void); + +/* Reads the clock frequency */ +uint32_t RCM_ReadSYSCLKFreq(void); +uint32_t RCM_ReadHCLKFreq(void); +void RCM_ReadPCLKFreq(uint32_t* PCLK1, uint32_t* PCLK2); +uint32_t RCM_ReadADCCLKFreq(void); + +/* Enable or disable Periph Clock */ +void RCM_EnableAHBPeriphClock(uint32_t AHBPeriph); +void RCM_DisableAHBPeriphClock(uint32_t AHBPeriph); +void RCM_EnableAPB2PeriphClock(uint32_t APB2Periph); +void RCM_DisableAPB2PeriphClock(uint32_t APB2Periph); +void RCM_EnableAPB1PeriphClock(uint32_t APB1Periph); +void RCM_DisableAPB1PeriphClock(uint32_t APB1Periph); + +/* Enable or disable Periph Reset */ +void RCM_EnableAPB2PeriphReset(uint32_t APB2Periph); +void RCM_DisableAPB2PeriphReset(uint32_t APB2Periph); +void RCM_EnableAPB1PeriphReset(uint32_t APB1Periph); +void RCM_DisableAPB1PeriphReset(uint32_t APB1Periph); + +/* Backup domain reset */ +void RCM_EnableBackupReset(void); +void RCM_DisableBackupReset(void); + +/* Interrupts and flags */ +void RCM_EnableInterrupt(uint32_t interrupt); +void RCM_DisableInterrupt(uint32_t interrupt); +uint8_t RCM_ReadStatusFlag(RCM_FLAG_T flag); +void RCM_ClearStatusFlag(void); +uint8_t RCM_ReadIntFlag(RCM_INT_T flag); +void RCM_ClearIntFlag(uint32_t flag); + +/**@} end of group RCM_Functions */ +/**@} end of group RCM_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_RCM_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_rtc.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_rtc.h new file mode 100644 index 0000000000..6840d00af5 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_rtc.h @@ -0,0 +1,101 @@ +/*! + * @file apm32e10x_rtc.h + * + * @brief This file contains all the functions prototypes for the RTC firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_RTC_H +#define __APM32E10X_RTC_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup RTC_Driver + @{ +*/ + +/** @defgroup RTC_Enumerations Enumerations + @{ +*/ + +typedef enum +{ + RTC_FLAG_OC = 0x0020, /*!< RTC Operation Complete flag */ + RTC_FLAG_RSYNC = 0x0008, /*!< Registers Synchronized flag */ + RTC_FLAG_OVR = 0x0004, /*!< Overflow flag */ + RTC_FLAG_ALR = 0x0002, /*!< Alarm flag */ + RTC_FLAG_SEC = 0x0001 /*!< Second flag */ +} RTC_FLAG_T; + +typedef enum +{ + RTC_INT_OVR = 0x0004, /*!< Overflow interrupt */ + RTC_INT_ALR = 0x0002, /*!< Alarm interrupt */ + RTC_INT_SEC = 0x0001 /*!< Second interrupt */ +} RTC_INT_T; + +/**@} end of group RTC_Enumerations*/ + + +/** @defgroup RTC_Functions Functions + @{ +*/ + +/* Operation modes */ +void RTC_EnableConfigMode(void); +void RTC_DisableConfigMode(void); + +/* Configuration */ +uint32_t RTC_ReadCounter(void); +void RTC_ConfigCounter(uint32_t value); +void RTC_ConfigPrescaler(uint32_t value); +void RTC_ConfigAlarm(uint32_t value); +uint32_t RTC_ReadDivider(void); +void RTC_WaitForLastTask(void); +void RTC_WaitForSynchro(void); + +/* Interrupts and flags */ +void RTC_EnableInterrupt(uint16_t interrupt); +void RTC_DisableInterrupt(uint16_t interrupt); +uint8_t RTC_ReadStatusFlag(RTC_FLAG_T flag); +void RTC_ClearStatusFlag(uint16_t flag); +uint8_t RTC_ReadIntFlag(RTC_INT_T flag); +void RTC_ClearIntFlag(uint16_t flag); + +/**@} end of group RTC_Functions*/ +/**@} end of group RTC_Driver*/ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_RTC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_sci2c.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_sci2c.h new file mode 100644 index 0000000000..06939ff210 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_sci2c.h @@ -0,0 +1,325 @@ +/*! + * @file apm32e10x_sci2c.h + * + * @brief This file contains all the prototypes,enumeration and macros for the SCI2C(I2C3, I2C4) peripheral + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_SCI2C_H +#define __APM32E10X_SCI2C_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SCI2C_Driver + @{ +*/ + +/** @defgroup SCI2C_Macros Macros + @{ +*/ + +/* Macros description */ + +#define SCI2C_CTRL1_RESET_VALUE ((uint32_t)0x3E) +#define SCI2C_TARADDR_RESET_VALUE ((uint32_t)0x1055) +#define SCI2C_SLAADDR_RESET_VALUE ((uint32_t)0x55) +#define SCI2C_HSMC_RESET_VALUE ((uint32_t)0x07) +#define SCI2C_DATA_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_SSCHC_RESET_VALUE ((uint32_t)0x190) +#define SCI2C_SSCLC_RESET_VALUE ((uint32_t)0x1D6) +#define SCI2C_FSCHC_RESET_VALUE ((uint32_t)0x3C) +#define SCI2C_FSCLC_RESET_VALUE ((uint32_t)0x82) +#define SCI2C_HSCHC_RESET_VALUE ((uint32_t)0x06) +#define SCI2C_HSCLC_RESET_VALUE ((uint32_t)0x10) +#define SCI2C_INTEN_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_RFT_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_TFT_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_CTRL2_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_TFL_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_RFL_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_SDAHOLD_RESET_VALUE ((uint32_t)0x01) +#define SCI2C_SDNO_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_DMACTRL_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_DTDL_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_DRDL_RESET_VALUE ((uint32_t)0x00) +#define SCI2C_SDADLY_RESET_VALUE ((uint32_t)0x64) +#define SCI2C_GCA_RESET_VALUE ((uint32_t)0x01) +#define SCI2C_LSSSL_RESET_VALUE ((uint32_t)0x05) +#define SCI2C_HSSSL_RESET_VALUE ((uint32_t)0x01) + +#define SCI2C_FIFO_DEPTH (0X08) +/**@} end of group SCI2C_Macros */ + +/** @defgroup SCI2C_Enumerations Enumerations + @{ +*/ + +/** + * @brief SCI2C speed enumeration + */ +typedef enum +{ + SCI2C_SPEED_STANDARD = 1, + SCI2C_SPEED_FAST, + SCI2C_SPEED_HIGH +}SCI2C_SPEED_T; + +/** + * @brief Address mode + */ +typedef enum +{ + SCI2C_ADDR_MODE_7BIT, + SCI2C_ADDR_MODE_10BIT +}SCI2C_ADDR_MODE_T; + +/** + * @brief SCI2C mode enumeration + */ +typedef enum +{ + SCI2C_MODE_MASTER, + SCI2C_MODE_SLAVE +}SCI2C_MODE_T; + +/** + * @brief Restart enable or disable + */ +typedef enum +{ + SCI2C_RESTART_DISABLE, + SCI2C_RESTART_ENABLE +}SCI2C_RESTART_T; + +/** + * @brief Enable or disable generate stop condition + */ +typedef enum +{ + SCI2C_STOP_DISABLE, + SCI2C_STOP_ENABLE +}SCI2C_STOP_T; +/** + * @brief Data direction + */ +typedef enum +{ + SCI2C_DATA_DIR_WRITE, + SCI2C_DATA_DIR_READ, +}SCI2C_DATA_DIR_T; + +/** + * @brief SCI2C interrupt + */ +typedef enum +{ + SCI2C_INT_RFU = BIT0, /*!< Rx FIFO underflow interrupt */ + SCI2C_INT_RFO = BIT1, /*!< Rx FIFO onverflow interrupt */ + SCI2C_INT_RFF = BIT2, /*!< Rx FIFO full interrupt */ + SCI2C_INT_TFO = BIT3, /*!< Tx FIFO onverflow interrupt */ + SCI2C_INT_TFE = BIT4, /*!< Tx FIFO empty interrupt */ + SCI2C_INT_RR = BIT5, /*!< Read request interrupt */ + SCI2C_INT_TA = BIT6, /*!< Tx abort interrupt */ + SCI2C_INT_RD = BIT7, /*!< Read done interrupt */ + SCI2C_INT_ACT = BIT8, /*!< Activity interrupt */ + SCI2C_INT_STPD = BIT9, /*!< Stop detect interrupt */ + SCI2C_INT_STAD = BIT10, /*!< Start detect interrupt */ + SCI2C_INT_GC = BIT11, /*!< Gernal call interrupt */ + SCI2C_INT_RSTAD = BIT12, /*!< Restart detect interrupt */ + SCI2C_INT_MOH = BIT13, /*!< Master on hold interrupt */ + SCI2C_INT_ALL = BIT15 /*!< All interrupt */ +}SCI2C_INT_T; + +/** + * @brief Flag enumeration + */ +typedef enum +{ + SCI2C_FLAG_ACT = BIT0, /*!< Activity flag */ + SCI2C_FLAG_TFNF = BIT1, /*!< Tx FIFO not full flag */ + SCI2C_FLAG_TFE = BIT2, /*!< Tx FIFO empty flag */ + SCI2C_FLAG_RFNE = BIT3, /*!< Rx FIFO not empty flag */ + SCI2C_FLAG_RFF = BIT4, /*!< Rx FIFO full flag */ + SCI2C_FLAG_MA = BIT5, /*!< Master activity flag */ + SCI2C_FLAG_SA = BIT6, /*!< Slave activity flag */ + SCI2C_FLAG_I2CEN = BIT8 | BIT0, /*!< I2C enable flag */ + SCI2C_FLAG_SDWB = BIT8 | BIT1, /*!< Slave disable while busy flag */ + SCI2C_FLAG_SRDL = BIT8 | BIT2 /*!< Slave receive data lost flag */ +}SCI2C_FLAG_T; + +/** + * @brief Tx abort source + */ +typedef enum +{ + SCI2C_TAS_AD7NA = BIT0, /*!< 7 bit address mode NACK */ + SCI2C_TAS_AD10FBNA = BIT1, /*!< 10 bit address mode first byte NACK */ + SCI2C_TAS_AD10SBNA = BIT2, /*!< 10 bit address mode second byte NACK */ + SCI2C_TAS_TDNA = BIT3, /*!< Tx data NACK */ + SCI2C_TAS_GCNA = BIT4, /*!< Gernal call NACK */ + SCI2C_TAS_GCR = BIT5, /*!< Gernal call read */ + SCI2C_TAS_HSAD = BIT6, /*!< High speed ack detected */ + SCI2C_TAS_SNR = BIT7, /*!< Start byte no restart */ + SCI2C_TAS_RNR10B = BIT8, /*!< Read 10bit address mode when restart disable */ + SCI2C_TAS_MSTDIS = BIT9, /*!< Master disable */ + SCI2C_TAS_ARBLOST = BIT10, /*!< Arbitration lost */ + SCI2C_TAS_LFTF = BIT11, /*!< Slave flush tx FIFO */ + SCI2C_TAS_SAL = BIT12, /*!< Slave arbitration lost */ + SCI2C_TAS_SRI = BIT13, /*!< Slave read done */ + SCI2C_TAS_USRARB = BIT14, /*!< User abort */ + SCI2C_TAS_FLUCNT = BIT15 /*!< Tx flush counter */ +}SCI2C_TAS_T; + +/** + * @brief DMA Enable + */ +typedef enum +{ + SCI2C_DMA_RX = BIT0, + SCI2C_DMA_TX = BIT1, +}SCI2C_DMA_T; + +/**@} end of group SCI2C_Enumerations */ + +/** @defgroup SCI2C_Structures + @{ +*/ + +/** + * @brief Struct description + */ +typedef struct +{ + uint16_t slaveAddr; /*!< Slave address. */ + SCI2C_MODE_T mode; /*!< Specifies mode, master mode or slave mode */ + SCI2C_SPEED_T speed; /*!< Specifies speed. Standard speed, fast speed or high speed. */ + uint16_t clkLowPeriod; /*!< SCL high period */ + uint16_t clkHighPeriod; /*!< SCL low period */ + uint8_t rxFifoThreshold; /*!< Rx FIFO threshold */ + uint8_t txFifoThreshold; /*!< Tx FIFO threshold */ + SCI2C_RESTART_T restart; /*!< Enable or disable restart */ + SCI2C_ADDR_MODE_T addrMode; /*!< Address mode. 7-bit or 10-bit mode. */ +}SCI2C_Config_T; + +/**@} end of group SCI2C_Structures */ + + +/** @defgroup SCI2C_Functions Functions + @{ +*/ + +/* Reset */ +void SCI2C_Reset(SCI2C_T *i2c); + +/* Configuration */ +void SCI2C_Config(SCI2C_T *i2c, SCI2C_Config_T *sci2cConfig); +void SCI2C_ConfigStructInit(SCI2C_Config_T *sci2cConfig); + +/* Stop detect */ +void SCI2C_EnableStopDetectAddressed(SCI2C_T *i2c); +void SCI2C_DisableStopDetectAddressed(SCI2C_T *i2c); +void SCI2C_EnableStopDetectMasterActivity(SCI2C_T *i2c); +void SCI2C_DisableStopDetectMasterActivity(SCI2C_T *i2c); + +/* Restart */ +void SCI2C_EnableRestart(SCI2C_T *i2c); +void SCI2C_DisableRestart(SCI2C_T *i2c); + +/* Speed */ +void SCI2C_ConfigSpeed(SCI2C_T *i2c, SCI2C_SPEED_T speed); + +/* Address */ +void SCI2C_ConfigMasterAddr(SCI2C_T *i2c, SCI2C_ADDR_MODE_T mode, uint16_t addr); +void SCI2C_ConfigSlaveAddr(SCI2C_T *i2c, SCI2C_ADDR_MODE_T mode, uint16_t addr); + +/* Master mode and slave mode */ +void SCI2C_EnableMasterMode(SCI2C_T *i2c); +void SCI2C_DisableMasterMode(SCI2C_T *i2c); +void SCI2C_EnableSlaveMode(SCI2C_T *i2c); +void SCI2C_DisableSlaveMode(SCI2C_T *i2c); +void SCI2C_ConfigMasterCode(SCI2C_T *i2c, uint8_t code); + +/* Data */ +void SCI2C_ConfigDataDir(SCI2C_T *i2c, SCI2C_DATA_DIR_T dir); +void SCI2C_TxData(SCI2C_T *i2c, uint8_t data); +uint8_t SCI2C_RxData(SCI2C_T *i2c); +void SCI2C_ConfigDataRegister(SCI2C_T *i2c, SCI2C_STOP_T stop, SCI2C_DATA_DIR_T dataDir, uint8_t data); + +/* Rx and Tx FIFO */ +uint8_t SCI2C_ReadRxFifoDataCnt(SCI2C_T *i2c); +uint8_t SCI2C_ReadTxFifoDataCnt(SCI2C_T *i2c); +void SCI2C_ConfigRxFifoThreshold(SCI2C_T *i2c, uint8_t threshold); +void SCI2C_ConfigTxFifoThreshold(SCI2C_T *i2c, uint8_t threshold); + +/* I2C Enable, disable, abort, block */ +void SCI2C_Enable(SCI2C_T *i2c); +void SCI2C_Disable(SCI2C_T *i2c); +void SCI2C_Abort(SCI2C_T *i2c); +void SCI2C_BlockTxCmd(SCI2C_T *i2c, uint8_t enable); + +/* SCL and SDA */ +void SCI2C_ConfigClkPeriod(SCI2C_T *i2c, SCI2C_SPEED_T speed, uint16_t highPeriod, uint16_t lowPeriod); +void SCI2C_ConfigSDAHoldTime(SCI2C_T *i2c, uint16_t txHold, uint8_t rxHold); +void SCI2C_ConfigSDADelayTime(SCI2C_T *i2c, uint8_t delay); + +/* ACK and NACK */ +void SCI2C_GernalCallAck(SCI2C_T *i2c, uint8_t enable); +void SCI2C_SlaveDataNackOnly(SCI2C_T *i2c, uint8_t enable); + +/* Abort */ +uint32_t SCI2C_ReadTxAbortSource(SCI2C_T *i2c); + +/* DMA */ +void SCI2C_EnableDMA(SCI2C_T *i2c, SCI2C_DMA_T dma); +void SCI2C_DisableDMA(SCI2C_T *i2c, SCI2C_DMA_T dma); +void SCI2C_ConfigDMATxDataLevel(SCI2C_T *i2c, uint8_t cnt); +void SCI2C_ConfigDMARxDataLevel(SCI2C_T *i2c, uint8_t cnt); + +/* Spike suppression limit */ +void SCI2C_ConfigSpikeSuppressionLimit(SCI2C_T *i2c, SCI2C_SPEED_T speed, uint8_t limit); + +/* Ingerrupt and flag */ +uint8_t SCI2C_ReadStatusFlag(SCI2C_T *i2c, SCI2C_FLAG_T flag); +void SCI2C_ClearIntFlag(SCI2C_T *i2c, SCI2C_INT_T flag); +uint8_t SCI2C_ReadIntFlag(SCI2C_T *i2c, SCI2C_INT_T flag); +uint8_t SCI2C_ReadRawIntFlag(SCI2C_T *i2c, SCI2C_INT_T flag); +void SCI2C_EnableInterrupt(SCI2C_T *i2c, uint16_t interrupt); +void SCI2C_DisableInterrupt(SCI2C_T *i2c, uint16_t interrupt); + +/**@} end of group SCI2C_Functions */ +/**@} end of group SCI2C_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_SCI2C_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_sdio.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_sdio.h new file mode 100644 index 0000000000..9728c1ee38 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_sdio.h @@ -0,0 +1,434 @@ +/*! + * @file apm32e10x_sdio.h + * + * @brief This file contains all the functions prototypes for the SDIO firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_SDIO_H +#define __APM32E10X_SDIO_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SDIO_Driver + @{ +*/ + +/** @defgroup SDIO_Macros Macros + @{ +*/ + +/* ------------ SDIO registers bit address in the alias region ----------- */ +#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) + +/* --- CLKCTRL Register ---*/ + +/* Alias word address of CLKEN bit */ +#define CLKCTRL_OFFSET (SDIO_OFFSET + 0x04) +#define CLKEN_BitNumber 0x08 +#define CLKCTRL_CLKEN_BB (PERIPH_BB_BASE + (CLKCTRL_OFFSET * 32) + (CLKEN_BitNumber * 4)) + +/* --- CMD Register --- */ + +/* Alias word address of SDIOSC bit */ +#define CMD_OFFSET (SDIO_OFFSET + 0x0C) +#define SDIOSC_BitNumber 0x0B +#define CMD_SDIOSC_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSC_BitNumber * 4)) + +/* Alias word address of CMDCPEN bit */ +#define CMDCPEN_BitNumber 0x0C +#define CMD_CMDCPEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (CMDCPEN_BitNumber * 4)) + +/* Alias word address of INTEN bit */ +#define INTEN_BitNumber 0x0D +#define CMD_INTEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (INTEN_BitNumber * 4)) + +/* Alias word address of ATACMD bit */ +#define ATACMD_BitNumber 0x0E +#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4)) + +/* --- DCTRL Register --- */ + +/* Alias word address of DMAEN bit */ +#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) +#define DMAEN_BitNumber 0x03 +#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4)) + +/* Alias word address of RWSTR bit */ +#define RWSTR_BitNumber 0x08 +#define DCTRL_RWSTR_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTR_BitNumber * 4)) + +/* Alias word address of RWSTOP bit */ +#define RWSTOP_BitNumber 0x09 +#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4)) + +/* Alias word address of RDWAIT bit */ +#define RDWAIT_BitNumber 0x0A +#define DCTRL_RDWAIT_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RDWAIT_BitNumber * 4)) + +/* Alias word address of SDIOF bit */ +#define SDIOF_BitNumber 0x0B +#define DCTRL_SDIOF_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOF_BitNumber * 4)) + +/**@} end of group SDIO_Macros */ + +/** @defgroup SDIO_Enumerations Enumerations + @{ +*/ + +/** + * @brief SDIO clock edge + */ +typedef enum +{ + SDIO_CLOCK_EDGE_RISING = 0x00000000, + SDIO_CLOCK_EDGE_FALLING = 0x00002000 +}SDIO_CLOCK_EDGE_T; + +/** + * @brief SDIO clock bypass + */ +typedef enum +{ + SDIO_CLOCK_BYPASS_DISABLE = 0x00000000, + SDIO_CLOCK_BYPASS_ENABLE = 0x00000400 +}SDIO_CLOCK_BYPASS_T; + +/** + * @brief SDIO clock power save + */ +typedef enum +{ + SDIO_CLOCK_POWER_SAVE_DISABLE = 0x00000000, + SDIO_CLOCK_POWER_SAVE_ENABLE = 0x00000200 +}SDIO_CLOCK_POWER_SAVE_T; + +/** + * @brief SDIO bus wide + */ +typedef enum +{ + SDIO_BUSWIDE_1B = 0x00000000, + SDIO_BUSWIDE_4B = 0x00000800, + SDIO_BUSWIDE_8B = 0x00001000 +}SDIO_BUSWIDE_T; + +/** + * @brief SDIO hardware flow control + */ +typedef enum +{ + SDIO_HARDWARE_FLOW_CONTROL_DISABLE = 0x00000000, + SDIO_HARDWARE_FLOW_CONTROL_ENABLE = 0x00004000 +}SDIO_HARDWARE_FLOW_CONTROL_T; + +/** + * @brief SDIO power state + */ +typedef enum +{ + SDIO_POWER_STATE_OFF = 0x00000000, + SDIO_POWER_STATE_ON = 0x00000003 +}SDIO_POWER_STATE_T; + +/** + * @brief SDIO interrupt sources + */ +typedef enum +{ + SDIO_INT_COMRESP = 0x00000001, + SDIO_INT_DBDR = 0x00000002, + SDIO_INT_CMDRESTO = 0x00000004, + SDIO_INT_DATATO = 0x00000008, + SDIO_INT_TXUDRER = 0x00000010, + SDIO_INT_RXOVRER = 0x00000020, + SDIO_INT_CMDRES = 0x00000040, + SDIO_INT_CMDSENT = 0x00000080, + SDIO_INT_DATAEND = 0x00000100, + SDIO_INT_SBE = 0x00000200, + SDIO_INT_DBCP = 0x00000400, + SDIO_INT_CMDACT = 0x00000800, + SDIO_INT_TXACT = 0x00001000, + SDIO_INT_RXACT = 0x00002000, + SDIO_INT_TXFHF = 0x00004000, + SDIO_INT_RXFHF = 0x00008000, + SDIO_INT_TXFF = 0x00010000, + SDIO_INT_RXFF = 0x00020000, + SDIO_INT_TXFE = 0x00040000, + SDIO_INT_RXFE = 0x00080000, + SDIO_INT_TXDA = 0x00100000, + SDIO_INT_RXDA = 0x00200000, + SDIO_INT_SDIOINT = 0x00400000, + SDIO_INT_ATAEND = 0x00800000 +}SDIO_INT_T; + +/** + * @brief SDIO response + */ +typedef enum +{ + SDIO_RESPONSE_NO = 0x00000000, + SDIO_RESPONSE_SHORT = 0x00000040, + SDIO_RESPONSE_LONG = 0x000000C0 +}SDIO_RESPONSE_T; + +/** + * @brief SDIO wait interrupt state + */ +typedef enum +{ + SDIO_WAIT_NO = 0x00000000, + SDIO_WAIT_INT = 0x00000100, + SDIO_WAIT_PEND = 0x00000200 +}SDIO_WAIT_T; + +/** + * @brief SDIO CPSM state + */ +typedef enum +{ + SDIO_CPSM_DISABLE = 0x00000000, + SDIO_CPSM_ENABLE = 0x00000400 +}SDIO_CPSM_T; + +/** + * @brief SDIO response registers + */ +typedef enum +{ + SDIO_RES1 = 0x00000000, + SDIO_RES2 = 0x00000004, + SDIO_RES3 = 0x00000008, + SDIO_RES4 = 0x0000000C +}SDIO_RES_T; + +/** + * @brief SDIO data block size + */ +typedef enum +{ + SDIO_DATA_BLOCKSIZE_1B = 0x00000000, + SDIO_DATA_BLOCKSIZE_2B = 0x00000010, + SDIO_DATA_BLOCKSIZE_4B = 0x00000020, + SDIO_DATA_BLOCKSIZE_8B = 0x00000030, + SDIO_DATA_BLOCKSIZE_16B = 0x00000040, + SDIO_DATA_BLOCKSIZE_32B = 0x00000050, + SDIO_DATA_BLOCKSIZE_64B = 0x00000060, + SDIO_DATA_BLOCKSIZE_128B = 0x00000070, + SDIO_DATA_BLOCKSIZE_256B = 0x00000080, + SDIO_DATA_BLOCKSIZE_512B = 0x00000090, + SDIO_DATA_BLOCKSIZE_1024B = 0x000000A0, + SDIO_DATA_BLOCKSIZE_2048B = 0x000000B0, + SDIO_DATA_BLOCKSIZE_496B = 0x000000C0, + SDIO_DATA_BLOCKSIZE_8192B = 0x000000D0, + SDIO_DATA_BLOCKSIZE_16384B = 0x000000E0 +}SDIO_DATA_BLOCKSIZE_T; + +/** + * @brief SDIO transfer direction + */ +typedef enum +{ + SDIO_TRANSFER_DIR_TOCARD = 0x00000000, + SDIO_TRANSFER_DIR_TOSDIO = 0x00000002 +}SDIO_TRANSFER_DIR_T; + +/** + * @brief SDIO transfer type + */ +typedef enum +{ + SDIO_TRANSFER_MODE_BLOCK = 0x00000000, + SDIO_TRANSFER_MODE_STREAM = 0x00000004 +}SDIO_TRANSFER_MODE_T; + +/** + * @brief SDIO DPSM state + */ +typedef enum +{ + SDIO_DPSM_DISABLE = 0x00000000, + SDIO_DPSM_ENABLE = 0x00000001 +}SDIO_DPSM_T; + +/** + * @brief SDIO flag + */ +typedef enum +{ + SDIO_FLAG_COMRESP = 0x00000001, + SDIO_FLAG_DBDR = 0x00000002, + SDIO_FLAG_CMDRESTO = 0x00000004, + SDIO_FLAG_DATATO = 0x00000008, + SDIO_FLAG_TXUDRER = 0x00000010, + SDIO_FLAG_RXOVRER = 0x00000020, + SDIO_FLAG_CMDRES = 0x00000040, + SDIO_FLAG_CMDSENT = 0x00000080, + SDIO_FLAG_DATAEND = 0x00000100, + SDIO_FLAG_SBE = 0x00000200, + SDIO_FLAG_DBCP = 0x00000400, + SDIO_FLAG_CMDACT = 0x00000800, + SDIO_FLAG_TXACT = 0x00001000, + SDIO_FLAG_RXACT = 0x00002000, + SDIO_FLAG_TXFHF = 0x00004000, + SDIO_FLAG_RXFHF = 0x00008000, + SDIO_FLAG_TXFF = 0x00010000, + SDIO_FLAG_RXFF = 0x00020000, + SDIO_FLAG_TXFE = 0x00040000, + SDIO_FLAG_RXFE = 0x00080000, + SDIO_FLAG_TXDA = 0x00100000, + SDIO_FLAG_RXDA = 0x00200000, + SDIO_FLAG_SDIOINT = 0x00400000, + SDIO_FLAG_ATAEND = 0x00800000 +}SDIO_FLAG_T; + +/** + * @brief SDIO read wait mode + */ +typedef enum +{ + SDIO_READ_WAIT_MODE_CLK = 0x00000001, + SDIO_READ_WAIT_MODE_DATA2 = 0x00000000 +}SDIO_READ_WAIT_MODE_T; + +/**@} end of group SDIO_Enumerations */ + + +/** @defgroup SDIO_Structures Structures + @{ +*/ + +/** + * @brief SDIO Config structure definition + */ +typedef struct +{ + SDIO_CLOCK_EDGE_T clockEdge; + SDIO_CLOCK_BYPASS_T clockBypass; + SDIO_CLOCK_POWER_SAVE_T clockPowerSave; + SDIO_BUSWIDE_T busWide; + SDIO_HARDWARE_FLOW_CONTROL_T hardwareFlowControl; + uint8_t clockDiv; +}SDIO_Config_T; + +/** + * @brief SDIO CMD Config structure definition + */ +typedef struct +{ + uint32_t argument; + uint32_t cmdIndex; + SDIO_RESPONSE_T response; + SDIO_WAIT_T wait; + SDIO_CPSM_T CPSM; +}SDIO_CMDConfig_T; + +/** + * @brief SDIO Data Config structure definition + */ +typedef struct +{ + uint32_t dataTimeOut; + uint32_t dataLength; + SDIO_DATA_BLOCKSIZE_T dataBlockSize; + SDIO_TRANSFER_DIR_T transferDir; + SDIO_TRANSFER_MODE_T transferMode; + SDIO_DPSM_T DPSM; +}SDIO_DataConfig_T; + +/**@} end of group SDIO_Structures */ + + +/** @defgroup SDIO_Functions Functions + @{ +*/ + +/* SDIO reset and configuration */ +void SDIO_Reset(void); +void SDIO_Config(SDIO_Config_T* sdioConfig); +void SDIO_ConfigStructInit(SDIO_Config_T* sdioConfig); +void SDIO_EnableClock(void); +void SDIO_DisableClock(void); +void SDIO_ConfigPowerState(SDIO_POWER_STATE_T powerState); +uint32_t SDIO_ReadPowerState(void); + +/* DMA */ +void SDIO_EnableDMA(void); +void SDIO_DisableDMA(void); + +/* Command */ +void SDIO_TxCommand(SDIO_CMDConfig_T *cmdConfig); +void SDIO_TxCommandStructInit(SDIO_CMDConfig_T* cmdconfig); +uint8_t SDIO_ReadCommandResponse(void); +uint32_t SDIO_ReadResponse(SDIO_RES_T res); + +/* SDIO data configuration */ +void SDIO_ConfigData(SDIO_DataConfig_T* dataConfig); +void SDIO_ConfigDataStructInit(SDIO_DataConfig_T* dataConfig); +uint32_t SDIO_ReadDataCounter(void); +void SDIO_WriteData(uint32_t data); +uint32_t SDIO_ReadData(void); +uint32_t SDIO_ReadFIFOCount(void); + +/* SDIO mode */ +void SDIO_EnableStartReadWait(void); +void SDIO_DisableStartReadWait(void); +void SDIO_EnableStopReadWait(void); +void SDIO_DisableStopReadWait(void); +void SDIO_ConfigSDIOReadWaitMode(SDIO_READ_WAIT_MODE_T readWaitMode); +void SDIO_EnableSDIO(void); +void SDIO_DisableSDIO(void); +void SDIO_EnableTxSDIOSuspend(void); +void SDIO_DisableTxSDIOSuspend(void); +void SDIO_EnableCommandCompletion(void); +void SDIO_DisableCommandCompletion(void); +void SDIO_EnableCEATAInterrupt(void); +void SDIO_DisableCEATAInterrupt(void); +void SDIO_EnableTxCEATA(void); +void SDIO_DisableTxCEATA(void); + +/* Interrupt and flags */ +void SDIO_EnableInterrupt(uint32_t interrupt); +void SDIO_DisableInterrupt(uint32_t interrupt); +uint8_t SDIO_ReadStatusFlag(SDIO_FLAG_T flag); +void SDIO_ClearStatusFlag(uint32_t flag); +uint8_t SDIO_ReadIntFlag(SDIO_INT_T flag); +void SDIO_ClearIntFlag(uint32_t flag); + +/**@} end of group SDIO_Functions*/ +/**@} end of group SDIO_Driver*/ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_SDIO_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_smc.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_smc.h new file mode 100644 index 0000000000..e21a9364a1 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_smc.h @@ -0,0 +1,370 @@ +/*! + * @file apm32e10x_smc.h + * + * @brief This file contains all the functions prototypes for the SMC firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_SMC_H +#define __APM32E10X_SMC_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SMC_Driver + @{ +*/ + +/** @defgroup SMC_Enumerations Enumerations + @{ +*/ + +/** + * @brief SMC NORSRAM_Bank + */ +typedef enum +{ + SMC_BANK1_NORSRAM_1, /*!< SMC Bank1 NOR/SRAM1 */ + SMC_BANK1_NORSRAM_2, /*!< SMC Bank1 NOR/SRAM2 */ + SMC_BANK1_NORSRAM_3, /*!< SMC Bank1 NOR/SRAM3 */ + SMC_BANK1_NORSRAM_4 /*!< SMC Bank1 NOR/SRAM4 */ +} SMC_BANK1_NORSRAM_T; + +/** + * @brief SMC NAND and PC Card Bank + */ +typedef enum +{ + SMC_BANK2_NAND, /*!< SMC Bank2 NAND */ + SMC_BANK3_NAND, /*!< SMC Bank3 NAND */ + SMC_BANK4_PCCARD /*!< SMC Bank4 PCCARD */ +} SMC_BANK_NAND_T; + +/** + * @brief SMC_Data_Address_Bus_Multiplexing + */ +typedef enum +{ + SMC_DATA_ADDRESS_MUX_DISABLE, /*!< Disable data address multiplexing */ + SMC_DATA_ADDRESS_MUX_ENABLE /*!< Enable data address multiplexing */ +} SMC_DATA_ADDRESS_MUX_T; + +/** + * @brief SMC_Memory_Type + */ +typedef enum +{ + SMC_MEMORY_TYPE_SRAM, /*!< SRAM memory */ + SMC_MEMORY_TYPE_PSRAM, /*!< PSRAM memory */ + SMC_MEMORY_TYPE_NOR /*!< NORFlash memory */ +} SMC_MEMORY_TYPE_T; + +/** + * @brief SMC_Data_Width + */ +typedef enum +{ + SMC_MEMORY_DATA_WIDTH_8BIT, /*!< Set memory data width to 8-bit */ + SMC_MEMORY_DATA_WIDTH_16BIT /*!< Set memory data width to 16-bit */ +} SMC_MEMORY_DATA_WIDTH_T; + +/** + * @brief SMC_Burst_Access_Mode + */ +typedef enum +{ + SMC_BURST_ACCESS_MODE_DISABLE, /*!< Disable burst access mode */ + SMC_BURST_ACCESS_MODE_ENABLE /*!< Enable burst access mode */ +} SMC_BURST_ACCESS_MODE_T; + +/** + * @brief SMC_AsynchronousWait + */ +typedef enum +{ + SMC_ASYNCHRONOUS_WAIT_DISABLE, /*!< Disable asynchronous wait */ + SMC_ASYNCHRONOUS_WAIT_ENABLE /*!< Enable asynchronous wait */ +} SMC_ASYNCHRONOUS_WAIT_T; + +/** + * @brief SMC_Wait_Signal_Polarity + */ +typedef enum +{ + SMC_WAIT_SIGNAL_POLARITY_LOW, /*!< Set low polarity valid */ + SMC_WAIT_SIGNAL_POLARITY_HIGH /*!< Set high polarity valid */ +} SMC_WAIT_SIGNAL_POLARITY_T; + +/** + * @brief SMC_Wrap_Mode + */ +typedef enum +{ + SMC_WRAP_MODE_DISABLE, /*!< Disable wrapped burst mode */ + SMC_WRAP_MODE_ENABLE /*!< Enable wrapped burst mode */ +} SMC_WRAP_MODE_T; + +/** + * @brief SMC_Wait_Timing + */ +typedef enum +{ + SMC_WAIT_SIGNAL_ACTIVE_BEFORE_WAIT_STATE, /*!< Set wait active before wait state */ + SMC_WAIT_SIGNAL_ACTIVE_DURING_WAIT_STATE /*!< Set wait active during wait state */ +} SMC_WAIT_SIGNAL_ACTIVE_T; + +/** + * @brief SMC_Write_Operation + */ +typedef enum +{ + SMC_WRITE_OPERATION_DISABLE, /*!< Disable write operation */ + SMC_WRITE_OPERATION_ENABLE /*!< Enable write operation */ +} SMC_WRITE_OPERATION_T; + +/** + * @brief SMC_Wait_Signal + */ +typedef enum +{ + SMC_WAITE_SIGNAL_DISABLE, /*!< Disable wait signal */ + SMC_WAITE_SIGNAL_ENABLE /*!< Enable wait signal */ +} SMC_WAITE_SIGNAL_T; + +/** + * @brief SMC_Extended_Mode + */ +typedef enum +{ + SMC_EXTENDEN_MODE_DISABLE, /*!< Disable extended mode */ + SMC_EXTENDEN_MODE_ENABLE /*!< Enable extended mode */ +} SMC_EXTENDEN_MODE_T; +/** + * @brief SMC_Write_Burst + */ +typedef enum +{ + SMC_WRITE_BURST_DISABLE, /*!< Disable write PSRAM burst */ + SMC_WRITE_BURST_ENABLE /*!< Enable write PSRAM burst */ +} SMC_WRITE_BURST_T; + +/** + * @brief SMC_WAIT_FEATURE + */ +typedef enum +{ + SMC_WAIT_FEATURE_DISABLE, /*!< Disable wait feature */ + SMC_WAIT_FEATURE_ENABLE /*!< Enable wait feature */ +} SMC_WAIT_FEATURE_T; + +/** + * @brief SMC_ECC + */ +typedef enum +{ + SMC_ECC_DISABLE, /*!< Disable ECC */ + SMC_ECC_ENABLE /*!< Enable ECC */ +} SMC_ECC_T; + +/** + * @brief SMC_ECC_Page_Size + */ +typedef enum +{ + SMC_ECC_PAGE_SIZE_BYTE_256, /*!< ECC page size = 256 bytes */ + SMC_ECC_PAGE_SIZE_BYTE_512, /*!< ECC page size = 512 bytes */ + SMC_ECC_PAGE_SIZE_BYTE_1024, /*!< ECC page size = 1024 bytes */ + SMC_ECC_PAGE_SIZE_BYTE_2048, /*!< ECC page size = 2048 bytes */ + SMC_ECC_PAGE_SIZE_BYTE_4096, /*!< ECC page size = 4096 bytes */ + SMC_ECC_PAGE_SIZE_BYTE_8192 /*!< ECC page size = 8192 bytes */ +} SMC_ECC_PAGE_SIZE_BYTE_T; + +/** + * @brief SMC_Access_Mode + */ +typedef enum +{ + SMC_ACCESS_MODE_A, /*!< Access mode A */ + SMC_ACCESS_MODE_B, /*!< Access mode B */ + SMC_ACCESS_MODE_C, /*!< Access mode C */ + SMC_ACCESS_MODE_D /*!< Access mode D */ +} SMC_ACCESS_MODE_T; + +/** + * @brief SMC_Interrupt_sources + */ +typedef enum +{ + SMC_INT_EDGE_RISING = 0x00000008, /*!< Rising edge detection interrupt */ + SMC_INT_LEVEL_HIGH = 0x00000010, /*!< High level detection interrupt */ + SMC_INT_EDGE_FALLING = 0x00000020 /*!< Falling edge detection interrupt */ +} SMC_INT_T; + +/** + * @brief SMC_Flags + */ +typedef enum +{ + SMC_FLAG_EDGE_RISING = 0x00000001, /*!< Rising egde detection Flag */ + SMC_FLAG_LEVEL_HIGH = 0x00000002, /*!< High level detection Flag */ + SMC_FLAG_EDGE_FALLING = 0x00000004, /*!< Falling egde detection Flag */ + SMC_FLAG_FIFO_EMPTY = 0x00000040 /*!< FIFO empty Flag */ +} SMC_FLAG_T; + +/**@} end of group SMC_Enumerations */ + + +/** @defgroup SMC_Structures Structures + @{ +*/ + +/** + * @brief Timing parameters for NOR/SRAM Banks + */ +typedef struct +{ + uint8_t addressSetupTime; /*!< Set address setup time */ + uint8_t addressHodeTime; /*!< Set address-hold setup time */ + uint8_t dataSetupTime; /*!< Set data setup time */ + uint8_t busTurnaroundTime; /*!< Set bus turnaround time */ + uint8_t clockDivision; /*!< Set clock divide radio */ + uint8_t dataLatency; /*!< Set data latency */ + SMC_ACCESS_MODE_T accessMode; /*!< Set access mode */ +} SMC_NORSRAMTimingConfig_T; + +/** + * @brief SMC NOR/SRAM Config structure + */ +typedef struct +{ + SMC_BANK1_NORSRAM_T bank; /*!< NORSRAM bank selection */ + SMC_DATA_ADDRESS_MUX_T dataAddressMux; /*!< Data address bus multiplexing selection */ + SMC_MEMORY_TYPE_T memoryType; /*!< Memory type selection */ + SMC_MEMORY_DATA_WIDTH_T memoryDataWidth; /*!< Data width selection */ + SMC_BURST_ACCESS_MODE_T burstAcceesMode; /*!< Set burst access mode */ + SMC_ASYNCHRONOUS_WAIT_T asynchronousWait; /*!< Set asynchronous wait */ + SMC_WAIT_SIGNAL_POLARITY_T waitSignalPolarity; /*!< Set wait signal polarity */ + SMC_WRAP_MODE_T wrapMode; /*!< Set wrapped burst mode */ + SMC_WAIT_SIGNAL_ACTIVE_T waitSignalActive; /*!< Set wait timing */ + SMC_WRITE_OPERATION_T writeOperation; /*!< Set write operation */ + SMC_WAITE_SIGNAL_T waiteSignal; /*!< Set wait signal */ + SMC_EXTENDEN_MODE_T extendedMode; /*!< Set extended mode */ + SMC_WRITE_BURST_T writeBurst; /*!< Set write burst */ + SMC_NORSRAMTimingConfig_T* readWriteTimingStruct; /*!< Read and write timing */ + SMC_NORSRAMTimingConfig_T* writeTimingStruct; /*!< Write timing */ +} SMC_NORSRAMConfig_T; + +/** + * @brief Timing parameters for NAND and PCCARD Banks + */ +typedef struct +{ + uint8_t setupTime; /*!< Set setup address time( 0x01 ~ 0xFE ) */ + uint8_t waitSetupTime; /*!< Set assert the command time ( 0x01 ~ 0xFE ) */ + uint8_t holdSetupTime; /*!< Set hold address time ( 0x01 ~ 0xFE ) */ + uint8_t HiZSetupTime; /*!< Set the time of keep in HiZ ( 0x00 ~ 0xFE ) */ +} SMC_NAND_PCCARDTimingConfig_T; + +/** + * @brief SMC NAND Config structure + */ +typedef struct +{ + SMC_BANK_NAND_T bank; /*!< SMC NAND and PC Card Bank */ + SMC_WAIT_FEATURE_T waitFeature; /*!< Set wait feature */ + SMC_MEMORY_DATA_WIDTH_T memoryDataWidth; /*!< Data width selection */ + SMC_ECC_T ECC; /*!< Set ECC */ + SMC_ECC_PAGE_SIZE_BYTE_T ECCPageSize; /*!< Set ECC page size */ + uint8_t TCLRSetupTime; /*!< Set the delay time of CLE to RE */ + uint8_t TARSetupTime; /*!< Set the delay time of ALE to RE */ + SMC_NAND_PCCARDTimingConfig_T* commonSpaceTimingStruct; /*!< Common space timing */ + SMC_NAND_PCCARDTimingConfig_T* attributeSpaceTimingStruct; /*!< Attribute space timing */ +} SMC_NANDConfig_T; + +/** + * @brief SMC PCCARD Config structure + */ +typedef struct +{ + SMC_WAIT_FEATURE_T waitFeature; /*!< Set wait feature */ + uint32_t TCLRSetupTime; /*!< Set the delay time of CLE to RE */ + uint32_t TARSetupTime; /*!< Set the delay time of ALE to RE */ + SMC_NAND_PCCARDTimingConfig_T* commonSpaceTimingStruct; /*!< Common space timing */ + SMC_NAND_PCCARDTimingConfig_T* attributeSpaceTimingStruct; /*!< Attribute space timing */ + SMC_NAND_PCCARDTimingConfig_T* IOSpaceTimingStruct; /*!< IO space timing */ +} SMC_PCCARDConfig_T; + +/**@} end of group SMC_Structures */ + +/** @defgroup SMC_Functions Functions + @{ +*/ + +/* SMC reset */ +void SMC_ResetNORSRAM(SMC_BANK1_NORSRAM_T bank); +void SMC_ResetNAND(SMC_BANK_NAND_T bank); +void SMC_ResetPCCard(void); + +/* SMC Configuration */ +void SMC_ConfigNORSRAM(SMC_NORSRAMConfig_T* smcNORSRAMConfig); +void SMC_ConfigNAND(SMC_NANDConfig_T* smcNANDConfig); +void SMC_ConfigPCCard(SMC_PCCARDConfig_T* smcPCCardConfig); +void SMC_ConfigNORSRAMStructInit(SMC_NORSRAMConfig_T* smcNORSRAMConfig); +void SMC_ConfigNANDStructInit(SMC_NANDConfig_T* smcNANDConfig); +void SMC_ConfigPCCardStructInit(SMC_PCCARDConfig_T* smcPCCardConfig); + +/* SMC bank control */ +void SMC_EnableNORSRAM(SMC_BANK1_NORSRAM_T bank); +void SMC_DisableNORSRAM(SMC_BANK1_NORSRAM_T bank); +void SMC_EnableNAND(SMC_BANK_NAND_T bank); +void SMC_DisableNAND(SMC_BANK_NAND_T bank); +void SMC_EnablePCCARD(void); +void SMC_DisablePCCARD(void); +void SMC_EnableNANDECC(SMC_BANK_NAND_T bank); +void SMC_DisableNANDECC(SMC_BANK_NAND_T bank); +uint32_t SMC_ReadECC(SMC_BANK_NAND_T bank); + +/* Interrupt and flag */ +void SMC_EnableInterrupt(SMC_BANK_NAND_T bank, uint32_t interrupt); +void SMC_DisableInterrupt(SMC_BANK_NAND_T bank, uint32_t interrupt); +uint16_t SMC_ReadStatusFlag(SMC_BANK_NAND_T bank, SMC_FLAG_T flag); +void SMC_ClearStatusFlag(SMC_BANK_NAND_T bank, uint32_t flag); +uint16_t SMC_ReadIntFlag(SMC_BANK_NAND_T bank, SMC_INT_T flag); +void SMC_ClearIntFlag(SMC_BANK_NAND_T bank, uint32_t flag); + +/**@} end of group SMC_Functions*/ +/**@} end of group SMC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_SMC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_spi.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_spi.h new file mode 100644 index 0000000000..ff94711414 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_spi.h @@ -0,0 +1,335 @@ +/*! + * @file apm32e10x_spi.h + * + * @brief This file contains all the functions prototypes for the SPI firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_SPI_H +#define __APM32E10X_SPI_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SPI_Driver + @{ +*/ + +/** @defgroup SPI_Enumerations Enumerations + @{ +*/ + +/** + * @brief SPI data direction mode + */ +typedef enum +{ + SPI_DIRECTION_2LINES_FULLDUPLEX = 0x0000, + SPI_DIRECTION_2LINES_RXONLY = 0x0400, + SPI_DIRECTION_1LINE_RX = 0x8000, + SPI_DIRECTION_1LINE_TX = 0xC000 +}SPI_DIRECTION_T; + +/** + * @brief SPI mode + */ +typedef enum +{ + SPI_MODE_MASTER = 0x0104, + SPI_MODE_SLAVE = 0x0000 +}SPI_MODE_T; + +/** + * @brief SPI Data length + */ +typedef enum +{ + SPI_DATA_LENGTH_16B = 0x0800, + SPI_DATA_LENGTH_8B = 0x0000 +}SPI_DATA_LENGTH_T; + +/** + * @brief SPI Clock Polarity + */ +typedef enum +{ + SPI_CLKPOL_LOW = 0x0000, + SPI_CLKPOL_HIGH = 0x0002 +}SPI_CLKPOL_T; + +/** + * @brief SPI Clock Phase + */ +typedef enum +{ + SPI_CLKPHA_1EDGE = 0x0000, + SPI_CLKPHA_2EDGE = 0x0001 +}SPI_CLKPHA_T; + +/** + * @brief SPI Slave Select management + */ +typedef enum +{ + SPI_NSS_SOFT = 0x0200, + SPI_NSS_HARD = 0x0000 +}SPI_NSS_T; + +/** + * @brief SPI BaudRate Prescaler + */ +typedef enum +{ + SPI_BAUDRATE_DIV_2 = 0x0000, + SPI_BAUDRATE_DIV_4 = 0x0008, + SPI_BAUDRATE_DIV_8 = 0x0010, + SPI_BAUDRATE_DIV_16 = 0x0018, + SPI_BAUDRATE_DIV_32 = 0x0020, + SPI_BAUDRATE_DIV_64 = 0x0028, + SPI_BAUDRATE_DIV_128 = 0x0030, + SPI_BAUDRATE_DIV_256 = 0x0038 +}SPI_BAUDRATE_DIV_T; + +/** + * @brief SPI MSB LSB transmission + */ +typedef enum +{ + SPI_FIRSTBIT_MSB = 0x0000, + SPI_FIRSTBIT_LSB = 0x0080 +}SPI_FIRSTBIT_T; + +/** + * @brief I2S Mode + */ +typedef enum +{ + I2S_MODE_SLAVE_TX = 0x0000, + I2S_MODE_SLAVE_RX = 0x0100, + I2S_MODE_MASTER_TX = 0x0200, + I2S_MODE_MASTER_RX = 0x0300 +}I2S_MODE_T; + +/** + * @brief I2S Standard + */ +typedef enum +{ + I2S_STANDARD_PHILLIPS = 0x0000, + I2S_STANDARD_MSB = 0x0010, + I2S_STANDARD_LSB = 0x0020, + I2S_STANDARD_PCMSHORT = 0x0030, + I2S_STANDARD_PCMLONG = 0x00B0 +}I2S_STANDARD_T; + +/** + * @brief I2S data length + */ +typedef enum +{ + I2S_DATA_LENGHT_16B = 0x0000, + I2S_DATA_LENGHT_16BEX = 0x0001, + I2S_DATA_LENGHT_24B = 0x0003, + I2S_DATA_LENGHT_32B = 0x0005 +} I2S_DATA_LENGTH_T; + +/** + * @brief I2S_MCLK_Output + */ +typedef enum +{ + I2S_MCLK_OUTPUT_DISABLE = 0x0000, + I2S_MCLK_OUTPUT_ENABLE = 0x0200 +}I2S_MCLK_OUTPUT_T; + +/** + * @brief I2S Audio divider + */ +typedef enum +{ + I2S_AUDIO_DIV_192K = 192000, + I2S_AUDIO_DIV_96K = 96000, + I2S_AUDIO_DIV_48K = 48000, + I2S_AUDIO_DIV_44K = 44100, + I2S_AUDIO_DIV_32K = 32000, + I2S_AUDIO_DIV_22K = 22050, + I2S_AUDIO_DIV_16K = 16000, + I2S_AUDIO_DIV_11K = 11025, + I2S_AUDIO_DIV_8K = 8000, + I2S_AUDIO_DIV_DEFAULT = 2 +}I2S_AUDIO_DIV_T; + +/** + * @brief I2S Clock Polarity + */ +typedef enum +{ + I2S_CLKPOL_LOW = 0x0000, + I2S_CLKPOL_HIGH = 0x0008 +}I2S_CLKPOL_T; + +/** + * @brief SPI Direction select + */ +typedef enum +{ + SPI_DIRECTION_RX = 0xBFFF, + SPI_DIRECTION_TX = 0x4000 +}SPI_DIRECTION_SELECT_T; + +/** + * @brief SPI interrupts definition + */ +typedef enum +{ + SPI_I2S_INT_TXBE = 0x8002, + SPI_I2S_INT_RXBNE = 0x4001, + SPI_I2S_INT_ERR = 0x2000, + SPI_I2S_INT_OVR = 0x2040, + SPI_INT_CRCE = 0x2010, + SPI_INT_ME = 0x2020, + I2S_INT_UDR = 0x2008 +}SPI_I2S_INT_T; + +/** + * @brief SPI flags definition + */ +typedef enum +{ + SPI_FLAG_RXBNE = 0x0001, + SPI_FLAG_TXBE = 0x0002, + I2S_FLAG_SCHDIR = 0x0004, + I2S_FLAG_UDR = 0x0008, + SPI_FLAG_CRCE = 0x0010, + SPI_FLAG_ME = 0x0020, + SPI_FLAG_OVR = 0x0040, + SPI_FLAG_BSY = 0x0080 +}SPI_FLAG_T; + +/** + * @brief SPI I2S DMA requests + */ +typedef enum +{ + SPI_I2S_DMA_REQ_TX = 0x0002, + SPI_I2S_DMA_REQ_RX = 0x0001 +}SPI_I2S_DMA_REQ_T; + +/**@} end of group SPI_Enumerations */ + + +/** @addtogroup SPI_Structures Structures + @{ +*/ + +/** + * @brief SPI Config structure definition + */ +typedef struct +{ + SPI_MODE_T mode; + SPI_DATA_LENGTH_T length; + SPI_CLKPHA_T phase; + SPI_CLKPOL_T polarity; + SPI_NSS_T nss; + SPI_FIRSTBIT_T firstBit; + SPI_DIRECTION_T direction; + SPI_BAUDRATE_DIV_T baudrateDiv; + uint16_t crcPolynomial; +}SPI_Config_T; + +/** + * @brief I2S Config structure definition + */ +typedef struct +{ + I2S_MODE_T mode; + I2S_STANDARD_T standard; + I2S_DATA_LENGTH_T length; + I2S_MCLK_OUTPUT_T MCLKOutput; + I2S_AUDIO_DIV_T audioDiv; + I2S_CLKPOL_T polarity; +}I2S_Config_T; + +/**@} end of group SPI_Structures */ + +/** @defgroup SPI_Functions Functions + @{ +*/ + +/* Reset and Configuration */ +void SPI_I2S_Reset(SPI_T* spi); +void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig); +void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig); +void SPI_ConfigStructInit(SPI_Config_T* spiConfig); +void I2S_ConfigStructInit(I2S_Config_T* i2sConfig); +void SPI_Enable(SPI_T* spi); +void SPI_Disable(SPI_T* spi); +void I2S_Enable(SPI_T* spi); +void I2S_Disable(SPI_T* spi); + +void SPI_I2S_TxData(SPI_T* spi, uint16_t data); +uint16_t SPI_I2S_RxData(SPI_T* spi); +void SPI_SetSoftwareNSS(SPI_T* spi); +void SPI_ResetSoftwareNSS(SPI_T* spi); +void SPI_EnableSSOutput(SPI_T* spi); +void SPI_DisableSSOutput(SPI_T* spi); +void SPI_ConfigDataSize(SPI_T* spi, SPI_DATA_LENGTH_T length); + +/* DMA */ +void SPI_I2S_EnableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq); +void SPI_I2S_DisableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq); + +/* CRC */ +void SPI_TxCRC(SPI_T* spi); +void SPI_EnableCRC(SPI_T* spi); +void SPI_DisableCRC(SPI_T* spi); +uint16_t SPI_ReadTxCRC(SPI_T* spi); +uint16_t SPI_ReadRxCRC(SPI_T* spi); +uint16_t SPI_ReadCRCPolynomial(SPI_T* spi); +void SPI_ConfigBiDirectionalLine(SPI_T* spi, SPI_DIRECTION_SELECT_T direction); + +/* Interrupts and flag */ +void SPI_I2S_EnableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt); +void SPI_I2S_DisableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt); +uint8_t SPI_I2S_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag); +void SPI_I2S_ClearStatusFlag(SPI_T* spi, SPI_FLAG_T flag); +uint8_t SPI_I2S_ReadIntFlag(SPI_T* spi, SPI_I2S_INT_T flag); +void SPI_I2S_ClearIntFlag(SPI_T* spi, SPI_I2S_INT_T flag); + +/**@} end of group SPI_Functions*/ +/**@} end of group SPI_Driver*/ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_SPI_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_tmr.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_tmr.h new file mode 100644 index 0000000000..276fd4e857 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_tmr.h @@ -0,0 +1,678 @@ +/*! + * @file apm32e10x_tmr.h + * + * @brief This file contains all the functions prototypes for the TMR firmware library. + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_TMR_H +#define __APM32E10X_TMR_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup TMR_Driver + @{ +*/ + +/** @defgroup TMR_Enumerations Enumerations + @{ +*/ + +/** + * @brief TMR Counter Mode + */ +typedef enum +{ + TMR_COUNTER_MODE_UP = 0x0000, + TMR_COUNTER_MODE_DOWN = 0x0010, + TMR_COUNTER_MODE_CENTERALIGNED1 = 0x0020, + TMR_COUNTER_MODE_CENTERALIGNED2 = 0x0040, + TMR_COUNTER_MODE_CENTERALIGNED3 = 0x0060 +} TMR_COUNTER_MODE_T; + +/** + * @brief TMR Clock division + */ +typedef enum +{ + TMR_CLOCK_DIV_1, + TMR_CLOCK_DIV_2, + TMR_CLOCK_DIV_4 +} TMR_CLOCK_DIV_T; + +/** + * @brief TMR Output Compare and PWM modes + */ +typedef enum +{ + TMR_OC_MODE_TMRING = 0x00, + TMR_OC_MODE_ACTIVE = 0x01, + TMR_OC_MODE_INACTIVE = 0x02, + TMR_OC_MODE_TOGGEL = 0x03, + TMR_OC_MODE_LOWLEVEL = 0x04, + TMR_OC_MODE_HIGHLEVEL = 0x05, + TMR_OC_MODE_PWM1 = 0x06, + TMR_OC_MODE_PWM2 = 0x07 +} TMR_OC_MODE_T; + +/** + * @brief TMR Output Compare state + */ +typedef enum +{ + TMR_OC_STATE_DISABLE, + TMR_OC_STATE_ENABLE +} TMR_OC_STATE_T; + +/** + * @brief TMR Output Compare N state + */ +typedef enum +{ + TMR_OC_NSTATE_DISABLE, + TMR_OC_NSTATE_ENABLE +} TMR_OC_NSTATE_T; + +/** + * @brief TMR Output Compare Polarity + */ +typedef enum +{ + TMR_OC_POLARITY_HIGH, + TMR_OC_POLARITY_LOW +} TMR_OC_POLARITY_T; + +/** + * @brief TMR Output Compare N Polarity + */ +typedef enum +{ + TMR_OC_NPOLARITY_HIGH, + TMR_OC_NPOLARITY_LOW +} TMR_OC_NPOLARITY_T; + +/** + * @brief TMR Output Compare Idle State + */ +typedef enum +{ + TMR_OC_IDLE_STATE_RESET, + TMR_OC_IDLE_STATE_SET +} TMR_OC_IDLE_STATE_T; + +/** + * @brief TMR Output Compare N Idle State + */ +typedef enum +{ + TMR_OC_NIDLE_STATE_RESET, + TMR_OC_NIDLE_STATE_SET +} TMR_OC_NIDLE_STATE_T; + +/** + * @brief TMR Input Capture Init structure definition + */ +typedef enum +{ + TMR_CHANNEL_1 = 0x0000, + TMR_CHANNEL_2 = 0x0004, + TMR_CHANNEL_3 = 0x0008, + TMR_CHANNEL_4 = 0x000C +} TMR_CHANNEL_T; + +/** + * @brief TMR Input Capture Polarity + */ +typedef enum +{ + TMR_IC_POLARITY_RISING = 0x00, + TMR_IC_POLARITY_FALLING = 0x02, + TMR_IC_POLARITY_BOTHEDGE = 0x0A +} TMR_IC_POLARITY_T; + +/** + * @brief TMR Input Capture Selection + */ +typedef enum +{ + TMR_IC_SELECTION_DIRECT_TI = 0x01, + TMR_IC_SELECTION_INDIRECT_TI = 0x02, + TMR_IC_SELECTION_TRC = 0x03 +} TMR_IC_SELECTION_T; + +/** + * @brief TMR Input Capture Prescaler + */ +typedef enum +{ + TMR_IC_PSC_1, + TMR_IC_PSC_2, + TMR_IC_PSC_4, + TMR_IC_PSC_8 +} TMR_IC_PSC_T; + +/** + * @brief TMR Specifies the Off-State selection used in Run mode + */ +typedef enum +{ + TMR_RMOS_STATE_DISABLE, + TMR_RMOS_STATE_ENABLE +} TMR_RMOS_STATE_T; + +/** + * @brief TMR Closed state configuration in idle mode + */ +typedef enum +{ + TMR_IMOS_STATE_DISABLE, + TMR_IMOS_STATE_ENABLE +} TMR_IMOS_STATE_T; + +/** + * @brief TMR Protect mode configuration values + */ +typedef enum +{ + TMR_LOCK_LEVEL_OFF, + TMR_LOCK_LEVEL_1, + TMR_LOCK_LEVEL_2, + TMR_LOCK_LEVEL_3 +} TMR_LOCK_LEVEL_T; + +/** + * @brief TMR BRK state + */ +typedef enum +{ + TMR_BRK_STATE_DISABLE, + TMR_BRK_STATE_ENABLE +} TMR_BRK_STATE_T; + +/** + * @brief TMR Specifies the Break Input pin polarity. + */ +typedef enum +{ + TMR_BRK_POLARITY_LOW, + TMR_BRK_POLARITY_HIGH +} TMR_BRK_POLARITY_T; + +/** + * @brief TMR Specifies the Break Input pin polarity. + */ +typedef enum +{ + TMR_AUTOMATIC_OUTPUT_DISABLE, + TMR_AUTOMATIC_OUTPUT_ENABLE +} TMR_AUTOMATIC_OUTPUT_T; + +/** + * @brief TMR_interrupt_sources + */ +typedef enum +{ + TMR_INT_UPDATE = 0x0001, + TMR_INT_CC1 = 0x0002, + TMR_INT_CC2 = 0x0004, + TMR_INT_CC3 = 0x0008, + TMR_INT_CC4 = 0x0010, + TMR_INT_COM = 0x0020, + TMR_INT_TRG = 0x0040, + TMR_INT_BRK = 0x0080 +} TMR_INT_T; + +/** + * @brief TMR event sources + */ +typedef enum +{ + TMR_EVENT_UPDATE = 0x001, + TMR_EVENT_CC1 = 0x002, + TMR_EVENT_CC2 = 0x004, + TMR_EVENT_CC3 = 0x008, + TMR_EVENT_CC4 = 0x010, + TMR_EVENT_COM = 0x020, + TMR_EVENT_TRG = 0x040, + TMR_EVENT_BRK = 0x080 +} TMR_EVENT_T; + +/** + * @brief TMR DMA Base Address + */ +typedef enum +{ + TMR_DMA_BASE_CTRL1 = 0x0000, + TMR_DMA_BASE_CTRL2 = 0x0001, + TMR_DMA_BASE_SMCTRL = 0x0002, + TMR_DMA_BASE_DIEN = 0x0003, + TMR_DMA_BASE_STS = 0x0004, + TMR_DMA_BASE_CEG = 0x0005, + TMR_DMA_BASE_CCM1 = 0x0006, + TMR_DMA_BASE_CCM2 = 0x0007, + TMR_DMA_BASE_CCEN = 0x0008, + TMR_DMA_BASE_CNT = 0x0009, + TMR_DMA_BASE_PSC = 0x000A, + TMR_DMA_BASE_AUTORLD = 0x000B, + TMR_DMA_BASE_REPCNT = 0x000C, + TMR_DMA_BASE_CC1 = 0x000D, + TMR_DMA_BASE_CC2 = 0x000E, + TMR_DMA_BASE_CC3 = 0x000F, + TMR_DMA_BASE_CC4 = 0x0010, + TMR_DMA_BASE_BDT = 0x0011, + TMR_DMA_BASE_DCTRL = 0x0012 +} TMR_DMA_BASE_T; + +/** + * @brief TMR DMA Burst Length + */ +typedef enum +{ + TMR_DMA_BURSTLENGTH_1TRANSFER = 0x0000, + TMR_DMA_BURSTLENGTH_2TRANSFERS = 0x0100, + TMR_DMA_BURSTLENGTH_3TRANSFERS = 0x0200, + TMR_DMA_BURSTLENGTH_4TRANSFERS = 0x0300, + TMR_DMA_BURSTLENGTH_5TRANSFERS = 0x0400, + TMR_DMA_BURSTLENGTH_6TRANSFERS = 0x0500, + TMR_DMA_BURSTLENGTH_7TRANSFERS = 0x0600, + TMR_DMA_BURSTLENGTH_8TRANSFERS = 0x0700, + TMR_DMA_BURSTLENGTH_9TRANSFERS = 0x0800, + TMR_DMA_BURSTLENGTH_10TRANSFERS = 0x0900, + TMR_DMA_BURSTLENGTH_11TRANSFERS = 0x0A00, + TMR_DMA_BURSTLENGTH_12TRANSFERS = 0x0B00, + TMR_DMA_BURSTLENGTH_13TRANSFERS = 0x0C00, + TMR_DMA_BURSTLENGTH_14TRANSFERS = 0x0D00, + TMR_DMA_BURSTLENGTH_15TRANSFERS = 0x0E00, + TMR_DMA_BURSTLENGTH_16TRANSFERS = 0x0F00, + TMR_DMA_BURSTLENGTH_17TRANSFERS = 0x1000, + TMR_DMA_BURSTLENGTH_18TRANSFERS = 0x1100 +} TMR_DMA_BURSTLENGTH_T; + +/** + * @brief TMR DMA Soueces + */ +typedef enum +{ + TMR_DMA_SOURCE_UPDATE = 0x0100, + TMR_DMA_SOURCE_CC1 = 0x0200, + TMR_DMA_SOURCE_CC2 = 0x0400, + TMR_DMA_SOURCE_CC3 = 0x0800, + TMR_DMA_SOURCE_CC4 = 0x1000, + TMR_DMA_SOURCE_COM = 0x2000, + TMR_DMA_SOURCE_TRG = 0x4000 +} TMR_DMA_SOURCE_T; + +/** + * @brief TMR Internal Trigger Selection + */ +typedef enum +{ + TMR_TRIGGER_SOURCE_ITR0 = 0x00, + TMR_TRIGGER_SOURCE_ITR1 = 0x01, + TMR_TRIGGER_SOURCE_ITR2 = 0x02, + TMR_TRIGGER_SOURCE_ITR3 = 0x03, + TMR_TRIGGER_SOURCE_TI1F_ED = 0x04, + TMR_TRIGGER_SOURCE_TI1FP1 = 0x05, + TMR_TRIGGER_SOURCE_TI2FP2 = 0x06, + TMR_TRIGGER_SOURCE_ETRF = 0x07 +} TMR_TRIGGER_SOURCE_T; + +/** + * @brief TMR The external Trigger Prescaler. + */ +typedef enum +{ + TMR_EXTTRG_PSC_OFF = 0x00, + TMR_EXTTRG_PSC_DIV2 = 0x01, + TMR_EXTTRG_PSC_DIV4 = 0x02, + TMR_EXTTRG_PSC_DIV8 = 0x03 +} TMR_EXTTRG_PSC_T; + +/** + * @brief TMR External Trigger Polarity + */ +typedef enum +{ + TMR_EXTTGR_POL_NONINVERTED, + TMR_EXTTRG_POL_INVERTED +} TMR_EXTTRG_POL_T; + +/** + * @brief TMR Prescaler Reload Mode + */ +typedef enum +{ + TMR_PSC_RELOAD_UPDATE, + TMR_PSC_RELOAD_IMMEDIATE +} TMR_PSC_RELOAD_T; + +/** + * @brief TMR Encoder Mode + */ +typedef enum +{ + TMR_ENCODER_MODE_TI1 = 0x01, + TMR_ENCODER_MODE_TI2 = 0x02, + TMR_ENCODER_MODE_TI12 = 0x03 +} TMR_ENCODER_MODE_T; + +/** + * @brief TMR Forced Action + */ +typedef enum +{ + TMR_FORCED_ACTION_INACTIVE = 0x04, + TMR_FORCED_ACTION_ACTIVE = 0x05 +} TMR_FORCED_ACTION_T; + +/** + * @brief TMR Output Compare Preload State + */ +typedef enum +{ + TMR_OC_PRELOAD_DISABLE, + TMR_OC_PRELOAD_ENABLE +} TMR_OC_PRELOAD_T; + +/** + * @brief TMR Output Compare Preload State + */ +typedef enum +{ + TMR_OC_FAST_DISABLE, + TMR_OC_FAST_ENABLE +} TMR_OC_FAST_T; + +/** + * @brief TMR Output Compare Preload State + */ +typedef enum +{ + TMR_OC_CLEAR_DISABLE, + TMR_OC_CLEAR_ENABLE +} TMR_OC_CLEAR_T; + +/** + * @brief TMR UpdateSource + */ +typedef enum +{ + TMR_UPDATE_SOURCE_GLOBAL, + TMR_UPDATE_SOURCE_REGULAR +} TMR_UPDATE_SOURCE_T; + +/** + * @brief TMR Single Pulse Mode + */ +typedef enum +{ + TMR_SPM_REPETITIVE, + TMR_SPM_SINGLE +} TMR_SPM_T; + +/** + * @brief TMR Trigger Output Source + */ +typedef enum +{ + TMR_TRGO_SOURCE_RESET, + TMR_TRGO_SOURCE_ENABLE, + TMR_TRGO_SOURCE_UPDATE, + TMR_TRGO_SOURCE_OC1, + TMR_TRGO_SOURCE_OC1REF, + TMR_TRGO_SOURCE_OC2REF, + TMR_TRGO_SOURCE_OC3REF, + TMR_TRGO_SOURCE_OC4REF +} TMR_TRGO_SOURCE_T; + +/** + * @brief TMR Slave Mode + */ +typedef enum +{ + TMR_SLAVE_MODE_RESET = 0x04, + TMR_SLAVE_MODE_GATED = 0x05, + TMR_SLAVE_MODE_TRIGGER = 0x06, + TMR_SLAVE_MODE_EXTERNAL1 = 0x07 +} TMR_SLAVE_MODE_T; + +/** + * @brief TMR Flag + */ +typedef enum +{ + TMR_FLAG_UPDATE = 0x0001, + TMR_FLAG_CC1 = 0x0002, + TMR_FLAG_CC2 = 0x0004, + TMR_FLAG_CC3 = 0x0008, + TMR_FLAG_CC4 = 0x0010, + TMR_FLAG_COM = 0x0020, + TMR_FLAG_TRG = 0x0040, + TMR_FLAG_BRK = 0x0080, + TMR_FLAG_CC1RC = 0x0200, + TMR_FLAG_CC2RC = 0x0400, + TMR_FLAG_CC3RC = 0x0800, + TMR_FLAG_CC4RC = 0x1000 +} TMR_FLAG_T; + +/**@} end of group TMR_Enumerations */ + +/** @defgroup TMR_Structures Structures + @{ +*/ + +/** + * @brief TMR Config struct definition + */ +typedef struct +{ + TMR_COUNTER_MODE_T countMode; + TMR_CLOCK_DIV_T clockDivision; + uint16_t period; /*!< This must between 0x0000 and 0xFFFF */ + uint16_t division; /*!< This must between 0x0000 and 0xFFFF */ + uint8_t repetitionCounter; /*!< This must between 0x00 and 0xFF, only for TMR1 and TMR8. */ +} TMR_BaseConfig_T; ; + +/** + * @brief TMR Config struct definition + */ +typedef struct +{ + TMR_OC_MODE_T mode; + TMR_OC_STATE_T outputState; + TMR_OC_NSTATE_T outputNState; + TMR_OC_POLARITY_T polarity; + TMR_OC_NPOLARITY_T nPolarity; + TMR_OC_IDLE_STATE_T idleState; + TMR_OC_NIDLE_STATE_T nIdleState; + uint16_t pulse; /*!< This must between 0x0000 and 0xFFFF */ +} TMR_OCConfig_T; + +/** + * @brief TMR BDT structure definition + */ +typedef struct +{ + TMR_RMOS_STATE_T RMOS; + TMR_IMOS_STATE_T IMOS; + TMR_LOCK_LEVEL_T lockLevel; + uint16_t deadTime; + TMR_BRK_STATE_T BRKState; + TMR_BRK_POLARITY_T BRKPolarity; + TMR_AUTOMATIC_OUTPUT_T automaticOutput; +} TMR_BDTConfig_T; + +/** + * @brief TMR Input Capture Config struct definition + */ +typedef struct +{ + TMR_CHANNEL_T channel; + TMR_IC_POLARITY_T polarity; + TMR_IC_SELECTION_T selection; + TMR_IC_PSC_T prescaler; + uint16_t filter; /*!< This must between 0x00 and 0x0F */ +} TMR_ICConfig_T; + +/**@} end of group TMR_Structures */ + +/** @defgroup TMR_Functions Functions + @{ +*/ + +/* Reset and Configuration */ +void TMR_Reset(TMR_T* tmr); +void TMR_ConfigTimeBase(TMR_T* tmr, TMR_BaseConfig_T *baseConfig); +void TMR_ConfigOC1(TMR_T* tmr, TMR_OCConfig_T *OC1Config); +void TMR_ConfigOC2(TMR_T* tmr, TMR_OCConfig_T *OC2Config); +void TMR_ConfigOC3(TMR_T* tmr, TMR_OCConfig_T *OC3Config); +void TMR_ConfigOC4(TMR_T* tmr, TMR_OCConfig_T *OC4Config); +void TMR_ConfigIC(TMR_T* tmr, TMR_ICConfig_T *ICConfig); +void TMR_ConfigBDT(TMR_T* tmr, TMR_BDTConfig_T *BDTConfig); +void TMR_ConfigTimeBaseStructInit(TMR_BaseConfig_T *baseConfig); +void TMR_ConfigOCStructInit(TMR_OCConfig_T *OCConfig); +void TMR_ConfigICStructInit(TMR_ICConfig_T *ICConfig); +void TMR_ConfigBDTStructInit( TMR_BDTConfig_T *BDTConfig); +void TMR_ConfigSinglePulseMode(TMR_T* tmr, TMR_SPM_T singlePulseMode); +void TMR_ConfigClockDivision(TMR_T* tmr, TMR_CLOCK_DIV_T clockDivision); +void TMR_Enable(TMR_T* tmr); +void TMR_Disable(TMR_T* tmr); + +/* PWM Configuration */ +void TMR_ConfigPWM(TMR_T* tmr, TMR_ICConfig_T *PWMConfig); +void TMR_EnablePWMOutputs(TMR_T* tmr); +void TMR_DisablePWMOutputs(TMR_T* tmr); + +/* DMA */ +void TMR_ConfigDMA(TMR_T* tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T burstLength); +void TMR_EnableDMASoure(TMR_T* tmr, uint16_t dmaSource); +void TMR_DisableDMASoure(TMR_T* tmr, uint16_t dmaSource); + +/* Configuration */ +void TMR_ConfigInternalClock(TMR_T* tmr); +void TMR_ConfigIntTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource); +void TMR_ConfigTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource, + TMR_IC_POLARITY_T ICpolarity, uint16_t ICfilter); +void TMR_ConfigETRClockMode1(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter); +void TMR_ConfigETRClockMode2(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter); +void TMR_ConfigETR(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter); +void TMR_ConfigPrescaler(TMR_T* tmr, uint16_t prescaler, TMR_PSC_RELOAD_T pscReloadMode); +void TMR_ConfigCounterMode(TMR_T* tmr, TMR_COUNTER_MODE_T countMode); +void TMR_SelectInputTrigger(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSouce); +void TMR_ConfigEncodeInterface(TMR_T* tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC_POLARITY_T IC1Polarity, + TMR_IC_POLARITY_T IC2Polarity); +void TMR_ConfigForcedOC1(TMR_T* tmr,TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC2(TMR_T* tmr,TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC3(TMR_T* tmr,TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC4(TMR_T* tmr,TMR_FORCED_ACTION_T forcesAction); +void TMR_EnableAutoReload(TMR_T* tmr); +void TMR_DisableAutoReload(TMR_T* tmr); +void TMR_EnableSelectCOM(TMR_T* tmr); +void TMR_DisableSelectCOM(TMR_T* tmr); +void TMR_EnableCCDMA(TMR_T* tmr); +void TMR_DisableCCDMA(TMR_T* tmr); +void TMR_EnableCCPreload(TMR_T* tmr); +void TMR_DisableCCPreload(TMR_T* tmr); +void TMR_ConfigOC1Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC2Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC3Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC4Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC1Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC2Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC3Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC4Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); +void TMR_ClearOC1Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC2Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC3Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC4Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ConfigOC1Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC1NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC2Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC2NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC3Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC3NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC4Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_EnableCCxChannel(TMR_T* tmr,TMR_CHANNEL_T channel); +void TMR_DisableCCxChannel(TMR_T* tmr,TMR_CHANNEL_T channel); +void TMR_EnableCCxNChannel(TMR_T* tmr,TMR_CHANNEL_T channel); +void TMR_DisableCCxNChannel(TMR_T* tmr,TMR_CHANNEL_T channel); +void TMR_SelectOCxMode(TMR_T* tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T OCMode); +void TMR_EnableUpdate(TMR_T* tmr); +void TMR_DisableUpdate(TMR_T* tmr); +void TMR_ConfigUPdateRequest(TMR_T* tmr, TMR_UPDATE_SOURCE_T updateSource); +void TMR_EnableHallSensor(TMR_T* tmr); +void TMR_DisableHallSensor(TMR_T* tmr); + +void TMR_SelectOutputTrigger(TMR_T* tmr, TMR_TRGO_SOURCE_T TRGOSource); +void TMR_SelectSlaveMode(TMR_T* tmr, TMR_SLAVE_MODE_T slaveMode); +void TMR_EnableMasterSlaveMode(TMR_T* tmr); +void TMR_DisableMasterSlaveMode(TMR_T* tmr); +void TMR_ConfigCounter(TMR_T* tmr, uint16_t counter); +void TMR_ConfigAutoreload(TMR_T* tmr, uint16_t autoReload); +void TMR_ConfigCompare1(TMR_T* tmr, uint16_t compare1); +void TMR_ConfigCompare2(TMR_T* tmr, uint16_t compare2); +void TMR_ConfigCompare3(TMR_T* tmr, uint16_t compare3); +void TMR_ConfigCompare4(TMR_T* tmr, uint16_t compare4); +void TMR_ConfigIC1Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC2Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC3Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC4Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); + +uint16_t TMR_ReadCaputer1(TMR_T* tmr); +uint16_t TMR_ReadCaputer2(TMR_T* tmr); +uint16_t TMR_ReadCaputer3(TMR_T* tmr); +uint16_t TMR_ReadCaputer4(TMR_T* tmr); +uint16_t TMR_ReadCounter(TMR_T* tmr); +uint16_t TMR_ReadPrescaler(TMR_T* tmr); + +/* Interrupts and Event */ +void TMR_EnableInterrupt(TMR_T* tmr, uint16_t interrupt); +void TMR_DisableInterrupt(TMR_T* tmr, uint16_t interrupt); +void TMR_GenerateEvent(TMR_T* tmr,uint16_t eventSources); + +/* flags */ +uint16_t TMR_ReadStatusFlag(TMR_T* tmr, TMR_FLAG_T flag); +void TMR_ClearStatusFlag(TMR_T* tmr, uint16_t flag); +uint16_t TMR_ReadIntFlag(TMR_T* tmr, TMR_INT_T flag); +void TMR_ClearIntFlag(TMR_T* tmr, uint16_t flag); + +/**@} end of group TMR_Functions*/ +/**@} end of group TMR_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_TMR_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_usart.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_usart.h new file mode 100644 index 0000000000..3a0d89e002 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_usart.h @@ -0,0 +1,312 @@ +/*! + * @file apm32e10x_usart.h + * + * @brief This file contains all the functions prototypes for the USART firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_USART_H +#define __APM32E10X_USART_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup USART_Driver + @{ +*/ + +/** @defgroup USART_Enumerations Enumerations + @{ +*/ + +/** + * @brief USART Word Length define + */ +typedef enum +{ + USART_WORD_LEN_8B = 0, + USART_WORD_LEN_9B = BIT12 +} USART_WORD_LEN_T; + +/** + * @brief USART Stop bits define + */ +typedef enum +{ + USART_STOP_BIT_1 = 0, + USART_STOP_BIT_0_5 = BIT12, + USART_STOP_BIT_2 = BIT13, + USART_STOP_BIT_1_5 = BIT12 | BIT13 +} USART_STOP_BIT_T; + +/** + * @brief USART Parity define + */ +typedef enum +{ + USART_PARITY_NONE = 0, + USART_PARITY_EVEN = BIT10, + USART_PARITY_ODD = BIT10 | BIT9 +} USART_PARITY_T; + +/** + * @brief USART mode define + */ +typedef enum +{ + USART_MODE_RX = BIT2, + USART_MODE_TX = BIT3, + USART_MODE_TX_RX = BIT2 | BIT3 +} USART_MODE_T; + +/** + * @brief USART hardware flow control define + */ +typedef enum +{ + USART_HARDWARE_FLOW_NONE = 0, + USART_HARDWARE_FLOW_RTS = BIT8, + USART_HARDWARE_FLOW_CTS = BIT9, + USART_HARDWARE_FLOW_RTS_CTS = BIT8 | BIT9 +} USART_HARDWARE_FLOW_T; + +/** + * @brief USART Clock enable + */ +typedef enum +{ + USART_CLKEN_DISABLE, + USART_CLKEN_ENABLE +} USART_CLKEN_T; + +/** + * @brief USART Clock polarity define + */ +typedef enum +{ + USART_CLKPOL_LOW, + USART_CLKPOL_HIGH +} USART_CLKPOL_T; + +/** + * @brief USART Clock phase define + */ +typedef enum +{ + USART_CLKPHA_1EDGE, + USART_CLKPHA_2EDGE +} USART_CLKPHA_T; + +/** + * @brief USART Last bit clock pulse enable + */ +typedef enum +{ + USART_LBCP_DISABLE, + USART_LBCP_ENABLE +} USART_LBCP_T; + +/** + * @brief USART Interrupt Source + */ +typedef enum +{ + USART_INT_PE = 0x0010100, + USART_INT_TXBE = 0x7010080, + USART_INT_TXC = 0x6010040, + USART_INT_RXBNE = 0x5010020, + USART_INT_IDLE = 0x4010010, + USART_INT_LBD = 0x8020040, + USART_INT_CTS = 0x9040400, + USART_INT_ERR = 0x0040001, + USART_INT_OVRE = 0x3040001, + USART_INT_NE = 0x2040001, + USART_INT_FE = 0x1040001 +} USART_INT_T; + +/** + * @brief USART DMA enable + */ +typedef enum +{ + USART_DMA_TX = BIT7, + USART_DMA_RX = BIT6, + USART_DMA_TX_RX = BIT6 | BIT7 +} USART_DMA_T; + +/** + * @brief USART Wakeup method + */ +typedef enum +{ + USART_WAKEUP_IDLE_LINE, + USART_WAKEUP_ADDRESS_MARK +} USART_WAKEUP_T; + +/** + * @brief USART LIN break detection length + */ +typedef enum +{ + USART_LBDL_10B, + USART_LBDL_11B +} USART_LBDL_T; + +/** + * @brief USART IrDA low-power + */ +typedef enum +{ + USART_IRDALP_NORMAL, + USART_IRDALP_LOWPOWER +} USART_IRDALP_T; + +/** + * @brief USART flag define + */ +typedef enum +{ + USART_FLAG_CTS = 0x0200, + USART_FLAG_LBD = 0x0100, + USART_FLAG_TXBE = 0x0080, + USART_FLAG_TXC = 0x0040, + USART_FLAG_RXBNE = 0x0020, + USART_FLAG_IDLE = 0x0010, + USART_FLAG_OVRE = 0x0008, + USART_FLAG_NE = 0x0004, + USART_FLAG_FE = 0x0002, + USART_FLAG_PE = 0x0001 +} USART_FLAG_T; + +/**@} end of group USART_Enumerations */ + +/** @defgroup USART_Structures Structures + @{ +*/ + +/** + * @brief USART Config struct definition + */ +typedef struct +{ + uint32_t baudRate; /*!< Specifies the baud rate */ + USART_WORD_LEN_T wordLength; /*!< Specifies the word length */ + USART_STOP_BIT_T stopBits; /*!< Specifies the stop bits */ + USART_PARITY_T parity; /*!< Specifies the parity */ + USART_MODE_T mode; /*!< Specifies the mode */ + USART_HARDWARE_FLOW_T hardwareFlow; /*!< Specifies the hardware flow control */ +} USART_Config_T; + +/** + * @brief USART synchronous communication clock config struct definition + */ +typedef struct +{ + USART_CLKEN_T clock; /*!< Enable or Disable Clock */ + USART_CLKPOL_T polarity; /*!< Specifies the clock polarity */ + USART_CLKPHA_T phase; /*!< Specifies the clock phase */ + USART_LBCP_T lastBit; /*!< Enable or Disable last bit clock */ +} USART_ClockConfig_T; + +/**@} end of group USART_Structures */ + +/** @defgroup USART_Functions Functions + @{ +*/ + +/* USART Reset and Configuration */ +void USART_Reset(USART_T* usart); +void USART_Config(USART_T* uart, USART_Config_T* usartConfig); +void USART_ConfigStructInit(USART_Config_T* usartConfig); +void USART_Address(USART_T* usart, uint8_t address); +void USART_Enable(USART_T* usart); +void USART_Disable(USART_T* usart); + +/* Clock communication */ +void USART_ConfigClock(USART_T* usart, USART_ClockConfig_T* clockConfig); +void USART_ConfigClockStructInit(USART_ClockConfig_T* clockConfig); + +/* DMA mode */ +void USART_EnableDMA(USART_T* usart, USART_DMA_T dmaReq); +void USART_DisableDMA(USART_T* usart, USART_DMA_T dmaReq); + +/* Mute mode */ +void USART_ConfigWakeUp(USART_T* usart, USART_WAKEUP_T wakeup); +void USART_EnableMuteMode(USART_T* usart); +void USART_DisableMuteMode(USART_T* usart); + +/* LIN mode */ +void USART_ConfigLINBreakDetectLength(USART_T* usart, USART_LBDL_T length); +void USART_EnableLIN(USART_T* usart); +void USART_DisableLIN(USART_T* usart); + +/* Transmit and receive */ +void USART_EnableTx(USART_T* usart); +void USART_DisableTx(USART_T* usart); +void USART_EnableRx(USART_T* usart); +void USART_DisableRx(USART_T* usart); +void USART_TxData(USART_T* usart, uint16_t data); +uint16_t USART_RxData(USART_T* usart); +void USART_TxBreak(USART_T* usart); + +/* Smartcard mode */ +void USART_ConfigGuardTime(USART_T* usart, uint8_t guardTime); +void USART_ConfigPrescaler(USART_T* usart, uint8_t div); +void USART_EnableSmartCard(USART_T* usart); +void USART_DisableSmartCard(USART_T* usart); +void USART_EnableSmartCardNACK(USART_T* usart); +void USART_DisableSmartCardNACK(USART_T* usart); + +/* Half-duplex mode */ +void USART_EnableHalfDuplex(USART_T* usart); +void USART_DisableHalfDuplex(USART_T* usart); + +/* IrDA mode */ +void USART_ConfigIrDA(USART_T* usart, USART_IRDALP_T IrDAMode); +void USART_EnableIrDA(USART_T* usart); +void USART_DisableIrDA(USART_T* usart); + +/* Interrupt and flag */ +void USART_EnableInterrupt(USART_T* usart, USART_INT_T interrupt); +void USART_DisableInterrupt(USART_T* usart, USART_INT_T interrupt); +uint8_t USART_ReadStatusFlag(USART_T* usart, USART_FLAG_T flag); +void USART_ClearStatusFlag(USART_T* usart, USART_FLAG_T flag); +uint8_t USART_ReadIntFlag(USART_T* usart, USART_INT_T flag); +void USART_ClearIntFlag(USART_T* usart, USART_INT_T flag); + +/**@} end of group USART_Functions */ +/**@} end of group USART_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_USART_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_usb.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_usb.h new file mode 100644 index 0000000000..ce8cd07e11 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_usb.h @@ -0,0 +1,597 @@ +/*! + * @file apm32e10x_usb.h + * + * @brief This file contains all the prototypes,enumeration and macros for USBD peripheral + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_USBD_H_ +#define __APM32E10X_USBD_H_ + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup USBD_Driver + @{ +*/ + +/** @defgroup USBD_Macros Macros + @{ +*/ + +/* USBD packet memory area base address */ +#define USBD_PMA_ADDR (0x40006000L) + +/* Endpoint register mask value default */ +#define USBD_EP_MASK_DEFAULT (USBD_EP_BIT_CTFR | USBD_EP_BIT_SETUP | USBD_EP_BIT_TYPE | USBD_EP_BIT_KIND | USBD_EP_BIT_CTFT |USBD_EP_BIT_ADDR) + +/** + * @brief USBD interrupt source + */ +#define USBD_INT_ESOF 0X100 +#define USBD_INT_SOF 0X200 +#define USBD_INT_RST 0X400 +#define USBD_INT_SUS 0x800 +#define USBD_INT_WKUP 0X1000 +#define USBD_INT_ERR 0X2000 +#define USBD_INT_PMAOU 0X4000 +#define USBD_INT_CTR 0X8000 +#define USBD_INT_ALL 0XFF00 + +/*! + * @brief Set CTRL register + * + * @param val: Register value + * + * @retval None + * + */ +#define USBD_SetRegCTRL(val) (USBD->CTRL = val) + +/*! + * @brief Set INTSTS register + * + * @param val: Register value + * + * @retval None + */ +#define USBD_SetRegINTSTS(val) (USBD->INTSTS = val) + +/*! + * @brief Set force reset + * + * @param None + * + * @retval None + */ +#define USBD_SetForceReset() (USBD->CTRL_B.FORRST = BIT_SET) + +/*! + * @brief Reset force reset + * + * @param None + * + * @retval None + */ +#define USBD_ResetForceReset() (USBD->CTRL_B.FORRST = BIT_RESET) + +/*! + * @brief Set power down + * + * @param None + * + * @retval None + */ +#define USBD_SetPowerDown() (USBD->CTRL_B.PWRDOWN = BIT_SET) + +/*! + * @brief Reset power down + * + * @param None + * + * @retval None + */ +#define USBD_ResetPowerDown() (USBD->CTRL_B.PWRDOWN = BIT_RESET) + +/*! + * @brief Set low power mode + * + * @param None + * + * @retval None + */ +#define USBD_SetLowerPowerMode() (USBD->CTRL_B.LPWREN = BIT_SET) + +/*! + * @brief Ret low power mode + * + * @param None + * + * @retval None + */ +#define USBD_ResetLowerPowerMode() (USBD->CTRL_B.LPWREN = BIT_RESET) + +/*! + * @brief Set force suspend + * + * @param None + * + * @retval None + */ +#define USBD_SetForceSuspend() (USBD->CTRL_B.FORSUS = BIT_SET) + +/*! + * @brief Reset force suspend + * + * @param None + * + * @retval None + */ +#define USBD_ResetForceSuspend() (USBD->CTRL_B.FORSUS = BIT_RESET) + +/*! + * @brief Read force suspend status + * + * @param None + * + * @retval None + */ +#define USBD_ReadForceSuspend() (USBD->CTRL_B.FORSUS) + +/*! + * @brief Set resume + * + * @param None + * + * @retval None + */ +#define USBD_SetResume() (USBD->CTRL_B.WUPREQ = BIT_SET) + +/*! + * @brief Reset resume + * + * @param None + * + * @retval None + */ +#define USBD_ResetResume() (USBD->CTRL_B.WUPREQ = BIT_RESET) + +/*! + * @brief Enable interrupt + * + * @param int: Interrupt source + * + * @retval None + */ +#define USBD_EnableInterrupt(int) (USBD->CTRL |= int) + +/*! + * @brief Disable interrupt + * + * @param int: Interrupt source + * + * @retval None + */ +#define USBD_DisableInterrupt(int) (USBD->CTRL &= (uint32_t)~int) + +/*! + * @brief Read the specified interrupt flag status + * + * @param int: Interrupt source + * + * @retval Flag status.0 or not 0 + */ +#define USBD_ReadIntFlag(int) (USBD->INTSTS & int) + +/*! + * @brief Clear the specified interrupt flag status + * + * @param int: Interrupt source + * + * @retval None + */ +#define USBD_ClearIntFlag(int) (USBD->INTSTS &= (uint32_t)~int) + +/*! + * @brief Read DOT field value in INTSTS rigister + * + * @param None + * + * @retval DOT field value + */ +#define USBD_ReadDir() (USBD->INTSTS_B.DOT) + +/*! + * @brief Read EPID field value in INTSTS rigister + * + * @param None + * + * @retval EPIDfield value + */ +#define USBD_ReadEP() ((USBD_EP_T)(USBD->INTSTS_B.EPID)) + +/*! + * @brief Read EP type + * + * @param ep: EP number + * + * @retval EP type + */ +#define USBD_ReadEPType(ep) (USBD->EP[ep].EP_B.TYPE) + +/*! + * @brief Read EP Tx status + * + * @param ep: EP number + * + * @retval EP Tx status + */ +#define USBD_ReadEPTxStatus(ep) ((USBD_EP_STATUS_T)(USBD->EP[ep].EP_B.TXSTS)) + +/*! + * @brief Read EP Rx status + * + * @param ep: EP number + * + * @retval EP Rx status + */ +#define USBD_ReadEPRxStatus(ep) ((USBD_EP_STATUS_T)(USBD->EP[ep].EP_B.RXSTS)) + +/*! + * @brief Read EP Tx address pointer + * + * @param ep: EP number + * + * @retval EP Tx address pointer + */ +#define USBD_ReadEPTxAddrPointer(ep) (uint32_t *)((USBD->BUFFTB + ep * 8) * 2 + USBD_PMA_ADDR) + + +/*! + * @brief Read EP Tx count pointer + * + * @param ep: EP number + * + * @retval EP Tx count pointer + */ +#define USBD_ReadEPTxCntPointer(ep) (uint32_t *)((USBD->BUFFTB + ep * 8 + 2) * 2 + USBD_PMA_ADDR) + +/*! + * @brief Read EP Rx address pointer + * + * @param ep: EP number + * + * @retval EP Rx address pointer + */ +#define USBD_ReadEPRxAddrPointer(ep) (uint32_t *)((USBD->BUFFTB + ep * 8 + 4) * 2 + USBD_PMA_ADDR) + +/*! + * @brief Read EP Rx count pointer + * + * @param ep: EP number + * + * @retval EP Rx count pointer + */ +#define USBD_ReadEPRxCntPointer(ep) (uint32_t *)((USBD->BUFFTB + ep * 8 + 6) * 2 + USBD_PMA_ADDR) + +/*! + * @brief Set EP Tx addr + * + * @param ep: EP number + * + * @param addr: Tx addr + * + * @retval None + */ +#define USBD_SetEPTxAddr(ep, addr) (*USBD_ReadEPTxAddrPointer(ep) = (addr >> 1) << 1) + +/*! + * @brief Set EP Rx addr + * + * @param ep: EP number + * + * @param addr: Rx addr + * + * @retval None + */ +#define USBD_SetEPRxAddr(ep, addr) (*USBD_ReadEPRxAddrPointer(ep) = (addr >> 1) << 1) + +/*! + * @brief Read EP Tx addr + * + * @param ep: EP number + * + * @retval EP Tx addr + */ +#define USBD_ReadEPTxAddr(ep) ((uint16_t)*USBD_ReadEPTxAddrPointer(ep)) + +/*! + * @brief Read EP Rx addr + * + * @param ep: EP number + * + * @retval EP Rx addr + */ +#define USBD_ReadEPRxAddr(ep) ((uint16_t)*USBD_ReadEPRxAddrPointer(ep)) + +/*! + * @brief Set EP Rx Count + * + * @param ep: EP number + * + * @param cnt: Tx count + * + * @retval None + */ +#define USBD_SetEPTxCnt(ep, cnt) (*USBD_ReadEPTxCntPointer(ep) = cnt) + +/*! + * @brief Read EP Tx count + * + * @param ep: EP number + * + * @retval EP Tx count + */ +#define USBD_ReadEPTxCnt(ep) ((uint16_t)*USBD_ReadEPTxCntPointer(ep) & 0x3ff) + +/*! + * @brief Read EP Rx count + * + * @param ep: EP number + * + * @retval EP Rx count + */ +#define USBD_ReadEPRxCnt(ep) ((uint16_t)*USBD_ReadEPRxCntPointer(ep) & 0x3ff) + +/*! + * @brief Read SETUP field value in EP register + * + * @param ep: EP number + * + * @retval SETUP field value + */ +#define USBD_ReadEPSetup(ep) (USBD->EP[ep].EP_B.SETUP) + +/*! + * @brief Set buffer table value + * + * @param tab: Buffer table value + * + * @retval None + */ +#define USBD_SetBufferTable(tab) (USBD->BUFFTB_B.BUFFTB = tab) + +/*! + * @brief Set device address + * + * @param addr: Device address + * + * @retval None + */ +#define USBD_SetDeviceAddr(addr) (USBD->ADDR_B.ADDR = addr) + +/*! + * @brief Read CTFR field value in EP register + * + * @param ep: Endpoint number + * + * @retval CTFR field value + */ +#define USBD_ReadEPRxFlag(ep) (USBD->EP[ep].EP_B.CTFR) + +/*! + * @brief Read CTFT field value in EP register + * + * @param ep: Endpoint number + * + * @retval CTFT field value + */ +#define USBD_ReadEPTxFlag(ep) (USBD->EP[ep].EP_B.CTFT) + +/*! + * @brief Enable USBD peripheral + * + * @param None + * + * @retval None + */ +#define USBD_Enable() (USBD->ADDR_B.USBDEN = BIT_SET) + +/*! + * @brief Disable USBD peripheral + * + * @param None + * + * @retval None + */ +#define USBD_Disable() (USBD->ADDR_B.USBDEN = BIT_RESET) + +/*! + * @brief Enable USBD2 peripheral + * + * @param None + * + * @retval None + */ +#define USBD2_Enable() (USBD->USB_SWITCH = BIT_SET) + +/*! + * @brief Disable USBD2 peripheral + * + * @param None + * + * @retval None + */ +#define USBD2_Disable() (USBD->USB_SWITCH = BIT_RESET) + +/*! + * @brief Read RXDPSTS field value in FRANUM register + * + * @param None + * + * @retval RXDPSTS field value + */ +#define USBD_ReadRDPS() (USBD->FRANUM_B.RXDPSTS) + +/*! + * @brief Read RXDMSTS field value in FRANUM register + * + * @param None + * + * @retval RXDMSTS field value + */ +#define USBD_ReadRDMS() (USBD->FRANUM_B.RXDMSTS) + +/*! + * @brief Read LOCK field value in FRANUM register + * + * @param None + * + * @retval LOCK field value + */ +#define USBD_ReadLOCK() (USBD->FRANUM_B.LOCK) + +/*! + * @brief Read LSOFNUM field value in FRANUM register + * + * @param None + * + * @retval LSOFNUM field value + */ +#define USBD_ReadLSOF() (USBD->FRANUM_B.LSOFNUM) + +/*! + * @brief Read FRANUM field value in FRANUM register + * + * @param None + * + * @retval FRANUM field value + */ +#define USBD_ReadFRANUM() (USBD->FRANUM_B.FRANUM) + +/**@} end of group USBD_Macros */ + +/** @defgroup USBD_Enumerations Enumerations + @{ +*/ + +/** + * @brief USBD Endpoint register bit definition + */ +typedef enum +{ + USBD_EP_BIT_ADDR = (uint32_t)(BIT0 | BIT1 | BIT2 | BIT3), + USBD_EP_BIT_TXSTS = (uint32_t)(BIT4 | BIT5), + USBD_EP_BIT_TXDTOG = (uint32_t)(BIT6), + USBD_EP_BIT_CTFT = (uint32_t)(BIT7), + USBD_EP_BIT_KIND = (uint32_t)(BIT8), + USBD_EP_BIT_TYPE = (uint32_t)(BIT9 | BIT10), + USBD_EP_BIT_SETUP = (uint32_t)(BIT11), + USBD_EP_BIT_RXSTS = (uint32_t)(BIT12 | BIT13), + USBD_EP_BIT_RXDTOG = (uint32_t)(BIT14), + USBD_EP_BIT_CTFR = (uint32_t)(BIT15) +}USBD_EP_BIT_T; + +/** + * @brief Endpoint id + */ +typedef enum +{ + USBD_EP_0, + USBD_EP_1, + USBD_EP_2, + USBD_EP_3, + USBD_EP_4, + USBD_EP_5, + USBD_EP_6, + USBD_EP_7 +}USBD_EP_T; + +/** + * @brief Endpoint status + */ +typedef enum +{ + USBD_EP_STATUS_DISABLE = ((uint32_t)0), + USBD_EP_STATUS_STALL = ((uint32_t)1), + USBD_EP_STATUS_NAK = ((uint32_t)2), + USBD_EP_STATUS_VALID = ((uint32_t)3) +}USBD_EP_STATUS_T; + +/** + * @brief USBD Endpoint type + */ +typedef enum +{ + USBD_EP_TYPE_BULK, + USBD_EP_TYPE_CONTROL, + USBD_EP_TYPE_ISO, + USBD_EP_TYPE_INTERRUPT +}USBD_EP_TYPE_T; + +/**@} end of group USBD_Enumerations */ + +/** @defgroup USBD_Functions Functions + @{ +*/ + +void USBD_SetEPType(USBD_EP_T ep, USBD_EP_TYPE_T type); + +void USBD_SetEPKind(USBD_EP_T ep); +void USBD_ResetEPKind(USBD_EP_T ep); + +void USBD_ResetEPRxFlag(USBD_EP_T ep); +void USBD_ResetEPTxFlag(USBD_EP_T ep); + +void USBD_ToggleTx(USBD_EP_T ep); +void USBD_ToggleRx(USBD_EP_T ep); +void USBD_ResetTxToggle(USBD_EP_T ep); +void USBD_ResetRxToggle(USBD_EP_T ep); + +void USBD_SetEpAddr(USBD_EP_T ep, uint8_t addr); + +void USBD_SetEPTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status); +void USBD_SetEPRxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status); +void USBD_SetEPRxTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T txStatus, USBD_EP_STATUS_T rxStatus); + +void USBD_SetEPRxCnt(USBD_EP_T ep, uint32_t cnt); + +void USBD_WriteDataToEP(USBD_EP_T ep, uint8_t *wBuf, uint32_t wLen); +void USBD_ReadDataFromEP(USBD_EP_T ep, uint8_t *rBuf, uint32_t rLen); + +/**@} end of group USBD_Functions */ +/**@} end of group USBD_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_USBD_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_wwdt.h b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_wwdt.h new file mode 100644 index 0000000000..4aecfa2364 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/inc/apm32e10x_wwdt.h @@ -0,0 +1,94 @@ +/*! + * @file apm32e10x_wwdt.h + * + * @brief This file contains all the functions prototypes for the WWDT firmware library + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10X_WWDT_H +#define __APM32E10X_WWDT_H + +/* Includes */ +#include "apm32e10x.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup WWDT_Driver + @{ +*/ + +/** @defgroup WWDT_Enumerations Enumerations + @{ +*/ + +/** + * @brief WWDT Timebase(Prescaler) define + */ +typedef enum +{ + WWDT_TIME_BASE_1 = 0x00000000, + WWDT_TIME_BASE_2 = 0x00000080, + WWDT_TIME_BASE_4 = 0x00000100, + WWDT_TIME_BASE_8 = 0x00000180 +}WWDT_TIME_BASE_T; + +/**@} end of group WWDT_Enumerations */ + +/** @defgroup WWDT_Functions Functions + @{ +*/ + +/* WWDT reset */ +void WWDT_Reset(void); + +/* Config WWDT Timebase */ +void WWDT_ConfigTimebase(WWDT_TIME_BASE_T timeBase); + +/* Config Window Data */ +void WWDT_ConfigWindowData(uint8_t windowData); + +/* Config Couter */ +void WWDT_ConfigCounter(uint8_t counter); + +/* Enable WWDT and Early Wakeup interrupt */ +void WWDT_EnableEWI(void); +void WWDT_Enable(uint8_t count); + +/* Read Flag and Clear Flag */ +uint8_t WWDT_ReadFlag(void); +void WWDT_ClearFlag(void); + +/**@} end of group WWDT_Functions */ +/**@} end of group WWDT_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10X_WWDT_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_adc.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_adc.c new file mode 100644 index 0000000000..97ba0695c4 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_adc.c @@ -0,0 +1,1064 @@ +/*! + * @file apm32e10x_adc.c + * + * @brief This file provides all the ADC firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_adc.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup ADC_Driver + * @brief ADC driver modules + @{ +*/ + +/** @defgroup ADC_Functions Functions + @{ +*/ + +/*! + * @brief Reset ADC peripheral registers to their default reset values. + * + * @param adc: Select ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_Reset(ADC_T* adc) +{ + if(adc == ADC1) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_ADC1); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_ADC1); + } + else if(adc == ADC2) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_ADC2); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_ADC2); + } + else if (adc == ADC3) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_ADC3); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_ADC3); + } +} + +/*! + * @brief Config the ADC peripheral according to the specified parameters in the adcConfig. + * + * @param adc: Select ADC peripheral. + * + * @param adcConfig: pointer to a ADC_Config_T structure. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig) +{ + uint32_t reg; + + reg = adc->CTRL1; + reg &= 0xFFF0FEFF; + reg |= (uint32_t)((adcConfig->mode) | ((uint32_t)adcConfig->scanConvMode << 8)); + adc->CTRL1 = reg; + + reg = adc->CTRL2; + reg &= 0xFFF1F7FD; + reg |= (uint32_t)adcConfig->dataAlign | \ + (uint32_t)adcConfig->externalTrigConv | \ + ((uint32_t)adcConfig->continuosConvMode << 1); + adc->CTRL2 = reg; + + reg = adc->REGSEQ1; + reg &= 0xFF0FFFFF; + reg |= (uint32_t)((adcConfig->nbrOfChannel - (uint8_t)1) << 20); + adc->REGSEQ1 = reg; +} + +/*! + * @brief Fills each ADC_Config_T member with its default value. + * + * @param adcConfig: pointer to a ADC_Config_T structure which will be initialized. + * + * @retval None + */ +void ADC_ConfigStructInit(ADC_Config_T* adcConfig) +{ + adcConfig->mode = ADC_MODE_INDEPENDENT; + adcConfig->scanConvMode = DISABLE; + adcConfig->continuosConvMode = DISABLE; + adcConfig->externalTrigConv = ADC_EXT_TRIG_CONV_TMR1_CC1; + adcConfig->dataAlign = ADC_DATA_ALIGN_RIGHT; + adcConfig->nbrOfChannel = 1; +} + +/*! + * @brief Enables the specified ADC peripheral. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_Enable(ADC_T* adc) +{ + adc->CTRL2_B.ADCEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC peripheral. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_Disable(ADC_T* adc) +{ + adc->CTRL2_B.ADCEN = BIT_RESET; +} + +/*! + * @brief Disable the specified ADC DMA request. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableDMA(ADC_T* adc) +{ + adc->CTRL2_B.DMAEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC DMA request. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableDMA(ADC_T* adc) +{ + adc->CTRL2_B.DMAEN = BIT_RESET; +} + +/*! + * @brief Reset the specified ADC calibration registers. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ResetCalibration(ADC_T* adc) +{ + adc->CTRL2_B.CALRST = BIT_SET; +} + +/*! + * @brief Reads the specified ADC calibration reset status. + * + * @param adc: Select the ADC peripheral. + * + * @retval The status of ADC calibration reset. + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint8_t ADC_ReadResetCalibrationStatus(ADC_T* adc) +{ + uint8_t ret; + ret = (adc->CTRL2_B.CALRST) ? BIT_SET : BIT_RESET; + return ret; +} + +/*! + * @brief Starts the specified ADC calibration. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_StartCalibration(ADC_T* adc) +{ + adc->CTRL2_B.CAL = BIT_SET; +} + +/*! + * @brief Reads the specified ADC calibration start flag. + * + * @param adc: Select the ADC peripheral. + * + * @retval The status of ADC calibration start. + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint8_t ADC_ReadCalibrationStartFlag(ADC_T* adc) +{ + uint8_t ret; + ret = (adc->CTRL2_B.CAL) ? BIT_SET : BIT_RESET; + return ret; +} + +/*! + * @brief Enables the specified ADC software start conversion. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableSoftwareStartConv(ADC_T* adc) +{ + adc->CTRL2 |= 0x00500000; +} + +/*! + * @brief Disable the specified ADC software start conversion. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableSoftwareStartConv(ADC_T* adc) +{ + adc->CTRL2 &= 0xFFAFFFFF; +} + +/*! + * @brief Reads the specified ADC Software start conversion Status. + * + * @param adc: Select the ADC peripheral. + * + * @retval The status of ADC Software start conversion registers. + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T* adc) +{ + uint8_t ret; + ret = (adc->CTRL2_B.REGSWSC) ? BIT_SET : BIT_RESET; + return ret; +} + +/*! + * @brief Configures the specified ADC regular discontinuous mode. + * + * @param adc: Select the ADC peripheral. + * + * @param number: The number of the discontinuous mode regular channels. + * This parameter can be between 1 and 8. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ConfigDiscMode(ADC_T* adc, uint8_t number) +{ + adc->CTRL1_B.DISCNUMCFG |= number - 1; +} + +/*! + * @brief Enable the specified ADC regular discontinuous mode. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableDiscMode(ADC_T* adc) +{ + adc->CTRL1_B.REGDISCEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC regular discontinuous mode. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableDiscMode(ADC_T* adc) +{ + adc->CTRL1_B.REGDISCEN = BIT_RESET; +} + +/*! + * @brief Configures the specified ADC regular channel. + * + * @param adc: Select the ADC peripheral. + * + * @param channel: Select the ADC channel. + * This parameter can be one of the following values: + * @arg ADC_CHANNEL_0: ADC channel 0 + * @arg ADC_CHANNEL_1: ADC channel 1 + * @arg ADC_CHANNEL_2: ADC channel 2 + * @arg ADC_CHANNEL_3: ADC channel 3 + * @arg ADC_CHANNEL_4: ADC channel 4 + * @arg ADC_CHANNEL_5: ADC channel 5 + * @arg ADC_CHANNEL_6: ADC channel 6 + * @arg ADC_CHANNEL_7: ADC channel 7 + * @arg ADC_CHANNEL_8: ADC channel 8 + * @arg ADC_CHANNEL_9: ADC channel 9 + * @arg ADC_CHANNEL_10: ADC channel 10 + * @arg ADC_CHANNEL_11: ADC channel 11 + * @arg ADC_CHANNEL_12: ADC channel 12 + * @arg ADC_CHANNEL_13: ADC channel 13 + * @arg ADC_CHANNEL_14: ADC channel 14 + * @arg ADC_CHANNEL_15: ADC channel 15 + * @arg ADC_CHANNEL_16: ADC channel 16 which is connected to TempSensor + * @arg ADC_CHANNEL_17: ADC channel 17 which is connected to Vrefint + * + * @param rank: The rank in the regular group sequencer + * This parameter must be between 1 to 16. + * + * @param sampleTime: the specified ADC channel SampleTime + * The parameter can be one of following values: + * @arg ADC_SAMPLETIME_1CYCLES5: ADC 1.5 clock cycles + * @arg ADC_SAMPLETIME_7CYCLES5: ADC 7.5 clock cycles + * @arg ADC_SAMPLETIME_13CYCLES5: ADC 13.5 clock cycles + * @arg ADC_SAMPLETIME_28CYCLES5: ADC 28.5 clock cycles + * @arg ADC_SAMPLETIME_41CYCLES5: ADC 41.5 clock cycles + * @arg ADC_SAMPLETIME_55CYCLES5: ADC 55.5 clock cycles + * @arg ADC_SAMPLETIME_71CYCLES5: ADC 71.5 clock cycles + * @arg ADC_SAMPLETIME_239CYCLES5: ADC 239.5 clock cycles + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel,uint8_t rank, uint8_t sampleTime) +{ + uint32_t temp1 = 0; + uint32_t temp2 = 0; + if(channel > ADC_CHANNEL_9) + { + temp1 = adc->SMPTIM1; + temp2 = SMPCYCCFG_SET_SMPTIM1 << (3 * (channel - 10)); + temp1 &= ~temp2; + temp2 = (uint32_t)sampleTime << (3 * (channel - 10)); + temp1 |= temp2; + adc->SMPTIM1 = temp1; + } + else + { + temp1 = adc->SMPTIM2; + temp2 = SMPCYCCFG_SET_SMPTIM2 << (3 * channel); + temp1 &= ~temp2; + temp2 = (uint32_t)sampleTime << (3 * channel); + temp1 |= temp2; + adc->SMPTIM2 = temp1; + } + + if(rank < 7) + { + temp1 = adc->REGSEQ3; + temp2 = REGSEQC_SET_REGSEQ3 << (5 * (rank - 1)); + temp1 &= ~temp2; + temp2 = (uint32_t)channel << (5 * (rank - 1)); + temp1 |= temp2; + adc->REGSEQ3 = temp1; + } + else if(rank < 13) + { + temp1 = adc->REGSEQ2; + temp2 = REGSEQC_SET_REGSEQ2 << (5 * (rank - 7)); + temp1 &= ~temp2; + temp2 = (uint32_t)channel << (5 * (rank - 7)); + temp1 |= temp2; + adc->REGSEQ2 = temp1; + } + else + { + temp1 = adc->REGSEQ1; + temp2 = REGSEQC_SET_REGSEQ1 << (5 * (rank - 13)); + temp1 &= ~temp2; + temp2 = (uint32_t)channel << (5 * (rank - 13)); + temp1 |= temp2; + adc->REGSEQ1 = temp1; + } +} + +/*! + * @brief Enable the specified ADC regular channel external trigger. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableExternalTrigConv(ADC_T* adc) +{ + adc->CTRL2_B.REGEXTTRGEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC regular channel external trigger. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableExternalTrigConv(ADC_T* adc) +{ + adc->CTRL2_B.REGEXTTRGEN = BIT_RESET; +} + +/*! + * @brief Reads the specified ADC conversion result data. + * + * @param adc: Select the ADC peripheral. + * + * @retval The Data conversion value. + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint16_t ADC_ReadConversionValue(ADC_T* adc) +{ + return (uint16_t) adc->REGDATA; +} + +/*! + * @brief Reads the specified ADC conversion result data in dual mode. + * + * @param adc: Select the ADC peripheral. + * + * @retval The Data conversion value. + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint32_t ADC_ReadDualModeConversionValue(ADC_T* adc) +{ + return (*(__IOM uint32_t *) RDG_ADDRESS); +} + +/*! + * @brief Enable the specified ADC automatic injected group. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableAutoInjectedConv(ADC_T* adc) +{ + adc->CTRL1_B.INJGACEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC automatic injected group. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableAutoInjectedConv(ADC_T* adc) +{ + adc->CTRL1_B.INJGACEN = BIT_RESET; +} + +/*! + * @brief Enable the specified ADC discontinuous mode for injected group. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableInjectedDiscMode(ADC_T* adc) +{ + adc->CTRL1_B.INJDISCEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC discontinuous mode for injected group. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableInjectedDiscMode(ADC_T* adc) +{ + adc->CTRL1_B.INJDISCEN = BIT_RESET; +} + +/*! + * @brief Configures the specified ADC external trigger for injected channels conversion + * + * @param adc: Select the ADC peripheral + * + * @param extTrigInjecConv: Select the ADC trigger to start injected conversion + * This parameter can be one of the following values: + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR1_TRGO : Select Timer1 TRGO event (for ADC1, ADC2 and ADC3) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR1_CC4 : Select Timer1 capture compare4 (for ADC1, ADC2 and ADC3) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR2_TRGO : Select Timer2 TRGO event (for ADC1 and ADC2) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR2_CC1 : Select Timer2 capture compare1 (for ADC1 and ADC2) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR3_CC4 : Select Timer3 capture compare4 (for ADC1 and ADC2) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR4_TRGO : Select Timer4 TRGO event selected (for ADC1 and ADC2) + * @arg ADC_EXT_TRIG_INJEC_CONV_EINT15_T8_CC4: External interrupt line 15 or Timer8 capture compare4 event + * (for ADC1 and ADC2) + * + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR4_CC3 : Timer4 capture compare3 selected (for ADC3 only) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR8_CC2 : Timer8 capture compare2 selected (for ADC3 only) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR8_CC4 : Timer8 capture compare4 selected (for ADC3 only) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR5_TRGO: Timer5 TRGO event selected (for ADC3 only) + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR5_CC4 : Timer5 capture compare4 selected (for ADC3 only) + * @arg ADC_EXT_TRIG_INJEC_CONV_NONE : Injected conversion started by software instead of external trigger + * (for ADC1, ADC2 and ADC3) + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ConfigExternalTrigInjectedConv(ADC_T* adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv) +{ + adc->CTRL2_B.INJGEXTTRGSEL = RESET; + adc->CTRL2_B.INJGEXTTRGSEL |= extTrigInjecConv; +} + +/*! + * @brief Ensable the specified ADC injected channels conversion through + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableExternalTrigInjectedConv(ADC_T* adc) +{ + adc->CTRL2_B.INJEXTTRGEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC injected channels conversion through + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableExternalTrigInjectedConv(ADC_T* adc) +{ + adc->CTRL2_B.INJEXTTRGEN = BIT_RESET; +} + +/*! + * @brief Enable the specified ADC start of the injected + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableSoftwareStartInjectedConv(ADC_T* adc) +{ + adc->CTRL2_B.INJEXTTRGEN = BIT_SET; + adc->CTRL2_B.INJSWSC = BIT_SET; +} + +/*! + * @brief Disable the specified ADC start of the injected + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableSoftwareStartInjectedConv(ADC_T* adc) +{ + adc->CTRL2_B.INJEXTTRGEN = BIT_RESET; + adc->CTRL2_B.INJSWSC = BIT_RESET; +} + +/*! + * @brief Reads the specified ADC Software start injected conversion Status + * + * @param adc: Select the ADC peripheral + * + * @retval The status of ADC Software start injected conversion + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T* adc) +{ + uint8_t ret; + ret = (adc->CTRL2_B.INJSWSC) ? BIT_SET : BIT_RESET; + return ret; +} + +/*! + * @brief Configures the specified ADC injected channel. + * + * @param adc: Select the ADC peripheral. + * + * @param channel: Select the ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_CHANNEL_0: ADC channel 0 + * @arg ADC_CHANNEL_1: ADC channel 1 + * @arg ADC_CHANNEL_2: ADC channel 2 + * @arg ADC_CHANNEL_3: ADC channel 3 + * @arg ADC_CHANNEL_4: ADC channel 4 + * @arg ADC_CHANNEL_5: ADC channel 5 + * @arg ADC_CHANNEL_6: ADC channel 6 + * @arg ADC_CHANNEL_7: ADC channel 7 + * @arg ADC_CHANNEL_8: ADC channel 8 + * @arg ADC_CHANNEL_9: ADC channel 9 + * @arg ADC_CHANNEL_10: ADC channel 10 + * @arg ADC_CHANNEL_11: ADC channel 11 + * @arg ADC_CHANNEL_12: ADC channel 12 + * @arg ADC_CHANNEL_13: ADC channel 13 + * @arg ADC_CHANNEL_14: ADC channel 14 + * @arg ADC_CHANNEL_15: ADC channel 15 + * @arg ADC_CHANNEL_16: ADC channel 16 which is connected to TempSensor + * @arg ADC_CHANNEL_17: ADC channel 17 which is connected to Vrefint + * + * @param rank: The rank in the injected group sequencer. + * This parameter must be between 1 to 4. + * + * @param sampleTime: the specified ADC channel SampleTime + * The parameter can be one of following values: + * @arg ADC_SAMPLETIME_1CYCLES5: ADC 1.5 clock cycles + * @arg ADC_SAMPLETIME_7CYCLES5: ADC 7.5 clock cycles + * @arg ADC_SAMPLETIME_13CYCLES5: ADC 13.5 clock cycles + * @arg ADC_SAMPLETIME_28CYCLES5: ADC 28.5 clock cycles + * @arg ADC_SAMPLETIME_41CYCLES5: ADC 41.5 clock cycles + * @arg ADC_SAMPLETIME_55CYCLES5: ADC 55.5 clock cycles + * @arg ADC_SAMPLETIME_71CYCLES5: ADC 71.5 clock cycles + * @arg ADC_SAMPLETIME_239CYCLES5: ADC 239.5 clock cycles + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime) +{ + uint32_t temp1 = 0; + uint32_t temp2 = 0; + uint32_t temp3 = 0; + if (channel > ADC_CHANNEL_9) + { + temp1 = adc->SMPTIM1; + temp2 = SMPCYCCFG_SET_SMPTIM1 << (3*(channel - 10)); + temp1 &= ~temp2; + temp2 = (uint32_t)sampleTime << (3*(channel - 10)); + temp1 |= temp2; + adc->SMPTIM1 = temp1; + } + else + { + temp1 = adc->SMPTIM2; + temp2 = SMPCYCCFG_SET_SMPTIM2 << (3 * channel); + temp1 &= ~temp2; + temp2 = (uint32_t)sampleTime << (3 * channel); + temp1 |= temp2; + adc->SMPTIM2 = temp1; + } + temp1 = adc->INJSEQ; + temp3 = (temp1 & INJSEQ_SET_INJSEQLEN)>> 20; + temp2 = INJSEQ_SET_INJSEQC << (5 * (uint8_t)((rank + 3) - (temp3 + 1))); + temp1 &= ~temp2; + temp2 = (uint32_t)channel << (5 * (uint8_t)((rank + 3) - (temp3 + 1))); + temp1 |= temp2; + adc->INJSEQ = temp1; +} + +/*! + * @brief Configures the specified ADC injected channel. + * + * @param adc: Select the ADC peripheral. + * + * @param length: The sequencer length. + * This parameter must be a number between 1 to 4. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ConfigInjectedSequencerLength(ADC_T* adc, uint8_t length) +{ + adc->INJSEQ_B.INJSEQLEN = RESET; + adc->INJSEQ_B.INJSEQLEN |= length - 1; +} + +/*! + * @brief Configures the specified ADC injected channel conversion value offset. + * + * @param adc: Select the ADC peripheral. + * + * @param channel: Select the ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_INJEC_CHANNEL_1: select Injected Channel 1 + * @arg ADC_INJEC_CHANNEL_2: select Injected Channel 2 + * @arg ADC_INJEC_CHANNEL_3: select Injected Channel 3 + * @arg ADC_INJEC_CHANNEL_4: select Injected Channel 4 + * + * @param offSet: The specified ADC injected channel offset. + * This parameter must be a 12bit value. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ConfigInjectedOffset(ADC_T* adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet) +{ + __IOM uint32_t tmp = 0; + + tmp = (uint32_t)adc; + tmp += channel; + + *(__IOM uint32_t *) tmp = (uint32_t)offSet; +} + +/*! + * @brief Reads the ADC injected channel conversion value. + * + * @param adc: Select the ADC peripheral. + * + * @param channel: Select the ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_INJEC_CHANNEL_1: select Injected Channel 1 + * @arg ADC_INJEC_CHANNEL_2: select Injected Channel 2 + * @arg ADC_INJEC_CHANNEL_3: select Injected Channel 3 + * @arg ADC_INJEC_CHANNEL_4: select Injected Channel 4 + * + * @retval The Data of conversion value. + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint16_t ADC_ReadInjectedConversionValue(ADC_T* adc, ADC_INJEC_CHANNEL_T channel) +{ + __IOM uint32_t temp = 0; + + temp = (uint32_t)adc; + temp += channel + INJDATA_OFFSET; + + return (uint16_t) (*(__IOM uint32_t*) temp); +} + +/*! + * @brief Enable the specified ADC analog watchdog. + * + * @param adc: Select the ADC peripheral. + * + * @param analogWatchdog: The ADC analog watchdog configuration + * This parameter can be one of the following values: + * @arg ADC_ANALOG_WATCHDOG_SINGLE_REG : Analog watchdog on a single regular channel + * @arg ADC_ANALOG_WATCHDOG_SINGLE_INJEC : Analog watchdog on a single injected channel + * @arg ADC_ANALOG_WATCHDOG_SINGLE_REG_INJEC : Analog watchdog on a single regular or injected channel + * @arg ADC_ANALOG_WATCHDOG_ALL_REG : Analog watchdog on all regular channel + * @arg ADC_ANALOG_WATCHDOG_ALL_INJEC : Analog watchdog on all injected channel + * @arg ADC_ANALOG_WATCHDOG_ALL_REG_ALL_INJEC : Analog watchdog on all regular and injected channels + * @arg ADC_ANALOG_WATCHDOG_NONE : No channel guarded by the analog watchdog + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableAnalogWatchdog(ADC_T* adc, uint32_t analogWatchdog) +{ + adc->CTRL1 &= 0xFF3FFDFF; + adc->CTRL1 |= analogWatchdog; +} + +/*! + * @brief Disable the specified ADC analog watchdog. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableAnalogWatchdog(ADC_T* adc) +{ + adc->CTRL1 &= 0xFF3FFDFF; +} + +/*! + * @brief Configures the specified ADC high and low thresholds of the analog watchdog. + * + * @param adc: Select the ADC peripheral. + * + * @param highThreshold: The ADC analog watchdog High threshold value. + * This parameter must be a 12bit value. + * + * @param lowThreshold: The ADC analog watchdog Low threshold value. + * This parameter must be a 12bit value. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ConfigAnalogWatchdogThresholds(ADC_T* adc, uint16_t highThreshold, uint16_t lowThreshold) +{ + adc->AWDHT = highThreshold; + adc->AWDLT = lowThreshold; +} + +/*! + * @brief Configures the specified ADC analog watchdog guarded single channel + * + * @param adc: Select the ADC peripheral + * + * @param channel: Select the ADC channel + * This parameter can be one of the following values: + * @arg ADC_Channel_0: Select ADC Channel 0 + * @arg ADC_Channel_1: Select ADC Channel 1 + * @arg ADC_Channel_2: Select ADC Channel 2 + * @arg ADC_Channel_3: Select ADC Channel 3 + * @arg ADC_Channel_4: Select ADC Channel 4 + * @arg ADC_Channel_5: Select ADC Channel 5 + * @arg ADC_Channel_6: Select ADC Channel 6 + * @arg ADC_Channel_7: Select ADC Channel 7 + * @arg ADC_Channel_8: Select ADC Channel 8 + * @arg ADC_Channel_9: Select ADC Channel 9 + * @arg ADC_Channel_10: Select ADC Channel 10 + * @arg ADC_Channel_11: Select ADC Channel 11 + * @arg ADC_Channel_12: Select ADC Channel 12 + * @arg ADC_Channel_13: Select ADC Channel 13 + * @arg ADC_Channel_14: Select ADC Channel 14 + * @arg ADC_Channel_15: Select ADC Channel 15 + * @arg ADC_Channel_16: Select ADC Channel 16 which is connected to TempSensor + * @arg ADC_Channel_17: Select ADC Channel 17 which is connected to Vrefint + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T* adc, uint8_t channel) +{ + adc->CTRL1_B.AWDCHSEL = BIT_RESET; + adc->CTRL1 |= channel; +} + +/*! + * @brief Enable the specified ADC temperature sensor and Vrefint channel. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableTempSensorVrefint(ADC_T* adc) +{ + adc->CTRL2_B.TSVREFEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC temperature sensor and Vrefint channel. + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableTempSensorVrefint(ADC_T* adc) +{ + adc->CTRL2_B.TSVREFEN = BIT_RESET; +} + +/*! + * @brief Enable the specified ADC interrupt. + * + * @param adc: Select the ADC peripheral. + * + * @param interrupt: Select the ADC interrupt sources + * This parameter can be any combination of the following values: + * @arg ADC_INT_AWD : Enable Analog watchdog interrupt + * @arg ADC_INT_EOC : Enable End of conversion interrupt + * @arg ADC_INT_INJEOC : Enable End of injected conversion interrupt + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_EnableInterrupt(ADC_T* adc, uint16_t interrupt) +{ + uint8_t mask; + + mask = (uint8_t)interrupt; + adc->CTRL1 |= (uint8_t)mask; +} + +/*! + * @brief Disable the specified ADC interrupt. + * + * @param adc: Select the ADC peripheral. + * + * @param interrupt: Select the ADC interrupt sources + * This parameter can be any combination of the following values: + * @arg ADC_INT_AWD : Disable Analog watchdog interrupt + * @arg ADC_INT_EOC : Disable End of conversion interrupt + * @arg ADC_INT_INJEOC : Disable End of injected conversion interrupt + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_DisableInterrupt(ADC_T* adc, uint16_t interrupt) +{ + uint8_t mask; + + mask = (uint8_t)interrupt; + adc->CTRL1 &= (~(uint32_t)mask); +} + +/*! + * @brief Reads the specified ADC flag + * + * @param adc: Select the ADC peripheral + * + * @param flag: Select the flag to check + * This parameter can be one of the following values: + * @arg ADC_FLAG_AWD : Analog watchdog flag + * @arg ADC_FLAG_EOC : End of conversion flag + * @arg ADC_FLAG_INJEOC: End of injected group conversion flag + * @arg ADC_FLAG_INJCS : Injected group conversion Start flag + * @arg ADC_FLAG_REGCS : Regular group conversion Start flag + * + * @retval The status of ADC flag + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint8_t ADC_ReadStatusFlag(ADC_T* adc, ADC_FLAG_T flag) +{ + return (adc->STS & flag) ? SET : RESET; +} + +/*! + * @brief Clears the specified ADC flag + * + * @param adc: Select the ADC peripheral + * + * @param flag: Select the flag to clear + * This parameter can be any combination of the following values: + * @arg ADC_FLAG_AWD : Analog watchdog flag + * @arg ADC_FLAG_EOC : End of conversion flag + * @arg ADC_FLAG_INJEOC: End of injected group conversion flag + * @arg ADC_FLAG_INJCS : Injected group conversion Start flag + * @arg ADC_FLAG_REGCS : Regular group conversion Start flag + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ClearStatusFlag(ADC_T* adc, uint8_t flag) +{ + adc->STS = ~(uint32_t)flag; +} + +/*! + * @brief Reads the specified ADC Interrupt flag. + * + * @param adc: Select the ADC peripheral. + * + * @param interrupt: Select the ADC interrupt source. + * This parameter can be one of the following values: + * @arg ADC_INT_AWD : Enable Analog watchdog interrupt + * @arg ADC_INT_EOC : Enable End of conversion interrupt + * @arg ADC_INT_INJEOC : Enable End of injected conversion interrupt + * + * @retval The status of ADC interrupt + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +uint8_t ADC_ReadIntFlag(ADC_T* adc, ADC_INT_T flag) +{ + uint8_t bitStatus = RESET; + uint32_t itmask = 0; + uint32_t enableStatus = 0; + + itmask = flag >> 8; + enableStatus = (adc->CTRL1 & (uint8_t)flag); + + if (((adc->STS & itmask) != (uint32_t)RESET) && enableStatus) + { + bitStatus = SET; + } + else + { + bitStatus = RESET; + } + return bitStatus; +} + +/*! + * @brief Clears the specified ADC Interrupt pending bits. + * + * @param adc: Select the ADC peripheral. + * + * @param interrupt: Select the ADC interrupt source. + * This parameter can be any combination of the following values: + * @arg ADC_INT_AWD : Enable Analog watchdog interrupt + * @arg ADC_INT_EOC : Enable End of conversion interrupt + * @arg ADC_INT_INJEOC : Enable End of injected conversion interrupt + * + * @retval None + * + * @note adc can be ADC1, ADC2 or ADC3. + */ +void ADC_ClearIntFlag(ADC_T* adc, uint16_t flag) +{ + uint8_t mask = 0; + + mask = (uint8_t)(flag >> 8); + adc->STS = ~(uint32_t)mask; +} + +/**@} end of group ADC_Functions */ +/**@} end of group ADC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_bakpr.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_bakpr.c new file mode 100644 index 0000000000..a69001fffe --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_bakpr.c @@ -0,0 +1,249 @@ +/*! + * @file apm32e10x_bakpr.c + * + * @brief This file provides all the BAKPR firmware functions. + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_bakpr.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup BAKPR_Driver + * @brief BAKPR driver modules + @{ +*/ + +/** @defgroup BAKPR_Functions Functions + @{ +*/ + +/*! + * @brief Reset the BAKPR peripheral registers to their default reset values. + * + * @param None + * + * @retval None + */ +void BAKPR_Reset(void) +{ + RCM_EnableBackupReset(); + RCM_DisableBackupReset(); +} + +/*! + * @brief Deinitializes the BAKPR peripheral registers to their default reset values. + * + * @param value: specifies the RTC output source. + * This parameter can be one of the following values: + * @arg BAKPR_TAMPER_PIN_LEVEL_HIGH: Tamper pin active on high level + * @arg BAKPR_TAMPER_PIN_LEVEL_LOW: Tamper pin active on low level + * + * @retval None + */ +void BAKPR_ConfigTamperPinLevel(BAKPR_TAMPER_PIN_LEVEL_T value) +{ + BAKPR->CTRL_B.TPALCFG = value; +} + +/*! + * @brief Enables the Tamper Pin activation. + * + * @param None + * + * @retval None + */ +void BAKPR_EnableTamperPin(void) +{ + BAKPR->CTRL_B.TPFCFG = ENABLE ; +} + +/*! + * @brief Disables the Tamper Pin activation. + * + * @param None + * + * @retval None + */ +void BAKPR_DisableTamperPin(void) +{ + BAKPR->CTRL_B.TPFCFG = DISABLE ; +} + +/*! + * @brief Enables the Tamper Pin Interrupt. + * + * @param None + * + * @retval None + */ +void BAKPR_EnableInterrupt(void) +{ + BAKPR->CSTS_B.TPIEN = ENABLE ; +} + +/*! + * @brief Disables the Tamper Pin Interrupt. + * + * @param None + * + * @retval None + */ +void BAKPR_DisableInterrupt(void) +{ + BAKPR->CSTS_B.TPIEN = DISABLE ; +} + +/*! + * @brief Select the RTC output source to output on the Tamper pin. + * + * @param soure: specifies the RTC output source. + * This parameter can be one of the following values: + * @arg BAKPR_RTC_OUTPUT_SOURCE_NONE : no RTC output on the Tamper pin. + * @arg BAKPR_RTC_OUTPUT_SOURCE_CALIBRATION_CLOCK: output the RTC clock with frequency divided by 64 on the Tamper pin. + * @arg BAKPR_RTC_OUTPUT_SOURCE_ALARM : output the RTC Alarm pulse signal on the Tamper pin. + * @arg BAKPR_RTC_OUTPUT_SOURCE_SECOND : output the RTC Second pulse signal on the Tamper pin. + * + * @retval None + */ +void BAKPR_ConfigRTCOutput(BAKPR_RTC_OUTPUT_SOURCE_T soure) +{ + if(soure == BAKPR_RTC_OUTPUT_SOURCE_NONE) + { + BAKPR->CLKCAL = RESET; + } else if(soure == BAKPR_RTC_OUTPUT_SOURCE_CALIBRATION_CLOCK) + { + BAKPR->CLKCAL_B.CALCOEN = BIT_SET; + } else if(soure == BAKPR_RTC_OUTPUT_SOURCE_ALARM) + { + BAKPR->CLKCAL_B.ASPOEN = BIT_SET; + } else if(soure == BAKPR_RTC_OUTPUT_SOURCE_SECOND) + { + BAKPR->CLKCAL_B.ASPOSEL = BIT_SET; + } +} + +/*! + * @brief Sets RTC Clock Calibration value. + * + * @param calibrationValue: Specifies the calibration value. + * This parameter must be a number between 0 and 0x7F. + * + * @retval None + */ +void BAKPR_ConfigRTCCalibrationValue(uint8_t calibrationValue) +{ + BAKPR->CLKCAL_B.CALVALUE = calibrationValue; +} + +/*! + * @brief Set user data to the specified Data Backup Register. + * + * @param bakrData : specifies the Data Backup Register. + * This parameter can be BAKPR_DATAx where x is between 1 and 42. + * + * @param data : data to set + * This parameter can be a 16bit value. + * + * @retval None + */ +void BAKPR_ConfigBackupRegister(BAKPR_DATA_T bakrData, uint16_t data) +{ + __IOM uint32_t tmp = 0; + + tmp = (uint32_t)BAKPR_BASE; + tmp += bakrData; + + *(__IOM uint32_t *) tmp = data; +} + +/*! + * @brief Reads user data from the specified Data Backup Register. + * + * @param bakrData : specifies the Data Backup Register. + * This parameter can be BAKPR_DATAx where x is between 1 and 42. + * + * @retval The content of the specified Data Backup Register + */ +uint16_t BAKPR_ReadBackupRegister(BAKPR_DATA_T bakrData) +{ + __IOM uint32_t tmp = 0; + + tmp = (uint32_t)BAKPR_BASE; + tmp += bakrData; + + return (*(__IOM uint32_t *) tmp); +} + +/*! + * @brief Read whether the Tamper Pin Event flag is set or not. + * + * @param None + * + * @retval Tamper Pin Event flag state + */ +uint8_t BAKPR_ReadStatusFlag(void) +{ + return BAKPR->CSTS_B.TEFLG; +} + +/*! + * @brief Clears Tamper Pin Event pending flag. + * + * @param None + * + * @retval None + */ +void BAKPR_ClearStatusFlag(void) +{ + BAKPR->CSTS_B.TECLR = BIT_SET; +} + +/*! + * @brief Get whether the Tamper Pin Interrupt has occurred or not. + * + * @param None + * + * @retval Tamper Pin Interrupt State + */ +uint8_t BAKPR_ReadIntFlag(void) +{ + return BAKPR->CSTS_B.TIFLG; +} + +/*! + * @brief Clears Tamper Pin Interrupt pending bit. + * + * @param None + * + * @retval None + */ +void BAKPR_ClearIntFlag(void) +{ + BAKPR->CSTS_B.TICLR = BIT_SET; +} + +/**@} end of group BAKPR_Functions */ +/**@} end of group BAKPR_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_can.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_can.c new file mode 100644 index 0000000000..b3d1062490 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_can.c @@ -0,0 +1,1057 @@ +/*! + * @file apm32e10x_can.c + * + * @brief This file provides all the CAN firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_can.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup CAN_Driver + * @brief CAN driver modules + @{ +*/ + +/** @defgroup CAN_Functions Functions + @{ +*/ + +/*! + * @brief Reset CAN registers + * + * @param can: Select the CAN peripheral. + * + * @retval None + */ +void CAN_Reset(CAN_T* can) +{ + if (can == CAN1) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_CAN1); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_CAN1); + } + else if (can == CAN2) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_CAN2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_CAN2); + } +} + +/*! + * @brief Initialization parameter configuration + * + * @param can: Select the CAN peripheral which can be CAN1 or CAN2. + * + * @param canConfig: Point to a CAN_Config_T structure. + * + * @retval ERROR or SUCCEESS + * + */ +uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) +{ + uint8_t initStatus = ERROR; + uint32_t wait_ack = 0x00000000; + + /* Exit from sleep mode */ + can->MCTRL_B.SLEEPREQ = BIT_RESET; + /* Request initialisation */ + can->MCTRL_B.INITREQ = BIT_SET; + + /* Wait the acknowledge */ + while(((can->MSTS_B.INITFLG) != BIT_SET) && (wait_ack != 0x0000FFFF)) + { + wait_ack++; + } + /* Check acknowledge */ + if(((can->MSTS_B.INITFLG) != BIT_SET)) + { + initStatus = ERROR; + } + else + { + if(canConfig->autoBusOffManage == ENABLE) + { + can->MCTRL_B.ALBOFFM = BIT_SET; + } + else + { + can->MCTRL_B.ALBOFFM = BIT_RESET; + } + + if(canConfig->autoWakeUpMode == ENABLE) + { + can->MCTRL_B.AWUPCFG = BIT_SET; + } + else + { + can->MCTRL_B.AWUPCFG = BIT_RESET; + } + + if(canConfig->nonAutoRetran == ENABLE) + { + can->MCTRL_B.ARTXMD = BIT_SET; + } + else + { + can->MCTRL_B.ARTXMD = BIT_RESET; + } + + if(canConfig->rxFIFOLockMode == ENABLE) + { + can->MCTRL_B.RXFLOCK = BIT_SET; + } + else + { + can->MCTRL_B.RXFLOCK = BIT_RESET; + } + + if(canConfig->txFIFOPriority == ENABLE) + { + can->MCTRL_B.TXFPCFG = BIT_SET; + } + else + { + can->MCTRL_B.TXFPCFG = BIT_RESET; + } + + /* Set the bit timing register */ + can->BITTIM &= (uint32_t)0x3fffffff; + can->BITTIM |= (uint32_t)canConfig->mode << 30; + can->BITTIM_B.RSYNJW = canConfig->syncJumpWidth; + can->BITTIM_B.TIMSEG1 = canConfig->timeSegment1; + can->BITTIM_B.TIMSEG2 = canConfig->timeSegment2; + can->BITTIM_B.BRPSC = canConfig->prescaler - 1; + + /* Request leave initialisation */ + can->MCTRL_B.INITREQ = BIT_RESET; + + wait_ack = 0; + /* Wait the acknowledge */ + while(((can->MSTS_B.INITFLG) != BIT_RESET) && (wait_ack != 0x0000FFFF)) + { + wait_ack++; + } + /* Check acknowledge */ + if(((can->MSTS_B.INITFLG) != BIT_RESET)) + { + initStatus = ERROR; + } + else + { + initStatus = SUCCESS; + } + } + return initStatus; +} + +/*! + * @brief Congig the CAN peripheral according to the specified parameters in the filterConfig. + * + * @param can: Select the CAN peripheral which can be CAN1 or CAN2. + * + * @param filterConfig :Point to a CAN_FilterConfig_T structure. + * + * @retval None + * + */ +void CAN_ConfigFilter(CAN_T* can, CAN_FilterConfig_T* filterConfig) +{ + can->FCTRL_B.FINITEN = BIT_SET; + + can->FACT &= ~(1 << filterConfig->filterNumber); + + /* Filter Scale */ + if(filterConfig->filterScale == CAN_FILTER_SCALE_16BIT) + { + /* 16-bit scale for the filter */ + can->FSCFG &= ~(1 << filterConfig->filterNumber); + + can->sFilterRegister[filterConfig->filterNumber].FBANK1 = + ((0x0000FFFF & filterConfig->filterMaskIdLow) << 16) | + (0x0000FFFF & filterConfig->filterIdLow); + + can->sFilterRegister[filterConfig->filterNumber].FBANK2 = + ((0x0000FFFF & filterConfig->filterMaskIdHigh) << 16) | + (0x0000FFFF & filterConfig->filterIdHigh); + } + + if(filterConfig->filterScale == CAN_FILTER_SCALE_32BIT) + { + can->FSCFG |= (1 << filterConfig->filterNumber); + + can->sFilterRegister[filterConfig->filterNumber].FBANK1 = + ((0x0000FFFF & filterConfig->filterIdHigh) << 16) | + (0x0000FFFF & filterConfig->filterIdLow); + + can->sFilterRegister[filterConfig->filterNumber].FBANK2 = + ((0x0000FFFF & filterConfig->filterMaskIdHigh) << 16) | + (0x0000FFFF & filterConfig->filterMaskIdLow); + } + + /* Filter Mode */ + if(filterConfig->filterMode == CAN_FILTER_MODE_IDMASK) + { + can->FMCFG &= ~(1 << filterConfig->filterNumber); + } + else + { + can->FMCFG |= (1 << filterConfig->filterNumber); + } + + /* Filter FIFO assignment */ + if(filterConfig->filterFIFO == CAN_FILTER_FIFO_0) + { + can->FFASS &= ~(1 << filterConfig->filterNumber); + } + if(filterConfig->filterFIFO == CAN_FILTER_FIFO_1) + { + can->FFASS |= (1 << filterConfig->filterNumber); + } + + /* Filter activation */ + if(filterConfig->filterActivation == ENABLE) + { + can->FACT |= (1 << filterConfig->filterNumber); + } + can->FCTRL_B.FINITEN = BIT_RESET; +} + +/*! + * @brief Initialize a CAN_Config_T structure with the initial value. + * + * @param canConfig :Point to a CAN_Config_T structure. + * + * @retval None + * + */ +void CAN_ConfigStructInit(CAN_Config_T* canConfig) +{ + + canConfig->autoBusOffManage = DISABLE; + canConfig->autoWakeUpMode = DISABLE; + canConfig->nonAutoRetran = DISABLE; + canConfig->rxFIFOLockMode = DISABLE; + canConfig->txFIFOPriority = DISABLE; + canConfig->mode = CAN_MODE_NORMAL; + canConfig->syncJumpWidth = CAN_SJW_1; + canConfig->timeSegment1 = CAN_TIME_SEGMENT1_4; + canConfig->timeSegment2 = CAN_TIME_SEGMENT2_3; + canConfig->prescaler = 1; +} + +/*! + * @brief Enables the DBG Freeze for CAN. + * + * @param can: Select the CAN peripheral. + * + * @retval None + * + */ +void CAN_EnableDBGFreeze(CAN_T* can) +{ + can->MCTRL_B.DBGFRZE = ENABLE; +} + +/*! + * @brief Disable the DBG Freeze for CAN. + * + * @param can: Select the CAN peripheral. + * + * @retval None + * + */ +void CAN_DisableDBGFreeze(CAN_T* can) +{ + can->MCTRL_B.DBGFRZE = DISABLE; +} + +/*! + * @brief Initiates the transmission of a message. + * + * @param can: Select the CAN peripheral. + * + * @param TxMessage: pointer to a CAN_TX_MESSAGE_T structure. + * + * @retval The number of the mailbox which is used for transmission or 3 if No mailbox is empty. + * + */ +uint8_t CAN_TxMessage(CAN_T* can, CAN_TxMessage_T* TxMessage) +{ + uint8_t transmit_milbox = 0; + + /* Select one empty transmit mailbox */ + if((can->TXSTS & 0x04000000) == 0x04000000) + { + transmit_milbox = 0; + } + else if((can->TXSTS & 0x08000000) == 0x08000000) + { + transmit_milbox = 1; + } + else if((can->TXSTS & 0x10000000) == 0x10000000) + { + transmit_milbox = 2; + } else + { + return 3; //!< No mailbox is empty + } + + /* Set up the Id */ + can->sTxMailBox[transmit_milbox].TXMID &= 0x00000001; + if(TxMessage->typeID == CAN_TYPEID_STD) + { + can->sTxMailBox[transmit_milbox].TXMID |= (TxMessage->stdID << 21) | (TxMessage->remoteTxReq); + } else + { + can->sTxMailBox[transmit_milbox].TXMID |= (TxMessage->extID << 3) | (TxMessage->typeID) | (TxMessage->remoteTxReq); + } + + /* Set up the TXDLEN */ + TxMessage->dataLengthCode &= 0x0F; + can->sTxMailBox[transmit_milbox].TXDLEN &= (uint32_t)0xFFFFFFF0; + can->sTxMailBox[transmit_milbox].TXDLEN |= TxMessage->dataLengthCode; + + /* Set up the data field */ + can->sTxMailBox[transmit_milbox].TXMDL = ((uint32_t)TxMessage->data[3] << 24) | ((uint32_t)TxMessage->data[2] << 16) + | ((uint32_t)TxMessage->data[1] << 8) | ((uint32_t)TxMessage->data[0]); + can->sTxMailBox[transmit_milbox].TXMDH = ((uint32_t)TxMessage->data[7] << 24) | ((uint32_t)TxMessage->data[6] << 16) + | ((uint32_t)TxMessage->data[5] << 8) | ((uint32_t)TxMessage->data[4]); + /* Request transmission */ + can->sTxMailBox[transmit_milbox].TXMID |= 0x00000001; + + return transmit_milbox; +} + +/*! + * @brief Checks the transmission of a message. + * + * @param can: Select the CAN peripheral. + * + * @param transmitMailbox: the number of the mailbox + * + * @retval state: 0: Status of transmission is Failed + * 1: Status of transmission is Ok + * 2: transmit pending + * + */ +uint8_t CAN_TxMessageStatus(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) +{ + uint32_t state = 0; + + switch (TxMailbox) + { + case (CAN_TX_MAILBIX_0): + state = can->TXSTS & (0x00000001 | 0x00000002 | 0x04000000); + break; + case (CAN_TX_MAILBIX_1): + state = can->TXSTS & (0x00000100 | 0x00000200 | 0x08000000); + break; + case (CAN_TX_MAILBIX_2): + state = can->TXSTS & (0x00010000 | 0x00020000 | 0x10000000); + break; + default: + state = 0; + break; + } + switch (state) + { + /* transmit pending */ + case (0x0): state = 2; + break; + /* transmit failed */ + case (0x00000001 | 0x04000000): state = 0; + break; + case (0x00000100 | 0x08000000): state = 0; + break; + case (0x00010000 | 0x10000000): state = 0; + break; + /* transmit succeeded */ + case (0x00000001 | 0x00000002 | 0x04000000):state = 1; + break; + case (0x00000100 | 0x00000200 | 0x08000000):state = 1; + break; + case (0x00010000 | 0x00020000 | 0x10000000):state = 1; + break; + default: state = 0; + break; + } + return (uint8_t) state; +} + +/*! + * @brief Cancels a transmit request. + * + * @param can: Select the CAN peripheral. + * + * @param mailBox: the number of the mailbox + * This parameter can be one of the following values: + * @arg CAN_TX_MAILBIX_0 : Tx mailbox 0 + * @arg CAN_TX_MAILBIX_1 : Tx mailbox 1 + * @arg CAN_TX_MAILBIX_2 : Tx mailbox 2 + * + * @retval None + * + */ +void CAN_CancelTxMailbox(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) +{ + switch (TxMailbox) + { + case CAN_TX_MAILBIX_0: + can->TXSTS_B.ABREQFLG0 = BIT_SET; + break; + case CAN_TX_MAILBIX_1: + can->TXSTS_B.ABREQFLG1 = BIT_SET; + break; + case CAN_TX_MAILBIX_2: + can->TXSTS_B.ABREQFLG2 = BIT_SET; + break; + default: + break; + } +} + +/*! + * @brief Receives a message and save to a CAN_RxMessage_T structure. + * + * @param can: Select the CAN peripheral. + * + * @param FIFONumber: Receive FIFO number. + * This parameter can be one of the following values: + * @arg CAN_RX_FIFO_0 : Receive FIFO 0 + * @arg CAN_RX_FIFO_1 : Receive FIFO 1 + * + * @param RxMessage: pointer to a structure to receive the message. + * + * @retval None + * + */ +void CAN_RxMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber, CAN_RxMessage_T* RxMessage) +{ + /* Get the Id */ + RxMessage->typeID = ((uint8_t)0x04 & (can->sRxMailBox[FIFONumber].RXMID)); + if(RxMessage->typeID == CAN_TYPEID_STD) + { + RxMessage->stdID = (can->sRxMailBox[FIFONumber].RXMID >> 21) & 0x000007FF; + } + else + { + RxMessage->extID = (can->sRxMailBox[FIFONumber].RXMID >> 3) & 0x1FFFFFFF; + } + + RxMessage->remoteTxReq = can->sRxMailBox[FIFONumber].RXMID_B.RFTXREQ; + RxMessage->dataLengthCode = can->sRxMailBox[FIFONumber].RXDLEN_B.DLCODE; + RxMessage->filterMatchIndex = can->sRxMailBox[FIFONumber].RXDLEN_B.FMIDX; + /* Get the data field */ + RxMessage->data[0] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE0; + RxMessage->data[1] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE1; + RxMessage->data[2] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE2; + RxMessage->data[3] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE3; + RxMessage->data[4] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE4; + RxMessage->data[5] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE5; + RxMessage->data[6] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE6; + RxMessage->data[7] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE7; + + if(FIFONumber == CAN_RX_FIFO_0) + { + can->RXF0_B.RFOM0 = BIT_SET; + } + else + { + can->RXF1_B.RFOM1 = BIT_SET; + } +} + +/*! + * @brief Releases the specified FIFO. + * + * @param can: Select the CAN peripheral. + * + * @param FIFONumber: Receive FIFO number + * This parameter can be one of the following values: + * @arg CAN_RX_FIFO_0 : Receive FIFO 0 + * @arg CAN_RX_FIFO_1 : Receive FIFO 1 + * + * @retval None + * + */ +void CAN_ReleaseFIFO(CAN_T* can, CAN_RX_FIFO_T FIFONumber) +{ + if(FIFONumber == CAN_RX_FIFO_0) + { + can->RXF0_B.RFOM0 = BIT_SET; + } + else + { + can->RXF1_B.RFOM1 = BIT_SET; + } +} + +/*! + * @brief Returns the number of pending messages. + * + * @param can: Select the CAN peripheral. + * + * @param FIFONumber: Receive FIFO number + * This parameter can be one of the following values: + * @arg CAN_RX_FIFO_0 : Receive FIFO 0 + * @arg CAN_RX_FIFO_1 : Receive FIFO 1 + * + * @retval The number of pending message. + * + */ +uint8_t CAN_PendingMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber) +{ + if(FIFONumber == CAN_RX_FIFO_0) + { + return can->RXF0 & 0x03; + } + else + { + return can->RXF1 & 0x03; + } +} + +/*! + * @brief Select the CAN Operation mode + * + * @param can: Select the CAN peripheral. + * + * @param operatingMode: CAN Operating Mode + * This parameter can be one of the following values: + * @arg CAN_OPERATING_MODE_INIT : Initialization mode + * @arg CAN_OPERATING_MODE_NORMAL: Normal mode + * @arg CAN_OPERATING_MODE_SLEEP : sleep mode + * + * @retval modeState:status of the requested mode + * 0:CAN failed entering the specific mode + * 1:CAN Succeed entering the specific mode + * + */ +uint8_t CAN_OperatingMode(CAN_T* can, CAN_OPERATING_MODE_T operatingMode) +{ + uint8_t states = 0; + uint32_t time_out = 0x0000FFFF; + + if(operatingMode == CAN_OPERATING_MODE_INIT) + { + can->MCTRL_B.SLEEPREQ = BIT_RESET; + can->MCTRL_B.INITREQ = BIT_SET; + + while((can->MSTS_B.INITFLG != BIT_SET && can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + { + time_out --; + } + if((can->MSTS_B.INITFLG == BIT_SET && can->MSTS_B.SLEEPFLG == BIT_RESET)) + { + states = 1; + } + } + else if(operatingMode == CAN_OPERATING_MODE_NORMAL) + { + can->MCTRL_B.SLEEPREQ = BIT_RESET; + can->MCTRL_B.INITREQ = BIT_RESET; + + time_out = 0x0000FFFF; + + while((can->MSTS_B.INITFLG != BIT_RESET || can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + { + time_out --; + } + if((can->MSTS_B.INITFLG == BIT_RESET || can->MSTS_B.SLEEPFLG == BIT_RESET)) + { + states = 1; + } + } + else if(operatingMode == CAN_OPERATING_MODE_SLEEP) + { + can->MCTRL_B.SLEEPREQ = BIT_SET; + can->MCTRL_B.INITREQ = BIT_RESET; + + time_out = 0x0000FFFF; + + while((can->MSTS_B.INITFLG != BIT_RESET && can->MSTS_B.SLEEPFLG != BIT_SET) && (time_out != 0)) + { + time_out --; + } + if((can->MSTS_B.INITFLG == BIT_RESET && can->MSTS_B.SLEEPFLG == BIT_SET)) + { + states = 1; + } + } + return states ; +} + +/*! + * @brief Into the low power mode. + * + * @param can: Select the CAN peripheral. + * + * @retval status: Status of entering sleep mode. + * 0: Enter sleep fail + * 1: Enter sleep success + * + */ +uint8_t CAN_SleepMode(CAN_T* can) +{ + can->MCTRL_B.SLEEPREQ = BIT_SET; + can->MCTRL_B.INITREQ = BIT_RESET; + + if((can->MSTS_B.INITFLG == BIT_RESET && can->MSTS_B.SLEEPFLG == BIT_SET)) + { + return 1; + } + return 0; +} + +/*! + * @brief Wakes the CAN up. + * + * @param can: Select the CAN peripheral. + * + * @retval status: Status of waking the CAN up + * 0: WakeUp CAN fail, + * 1: WakeUp CAN success + * + */ +uint8_t CAN_WakeUpMode(CAN_T* can) +{ + uint32_t time_out = 0x0000FFFF; + + can->MCTRL_B.SLEEPREQ = BIT_RESET; + while((can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + { + time_out --; + } + if(can->MSTS_B.SLEEPFLG == BIT_RESET) + { + return 1; + } + return 0; +} + +/*! + * @brief Read the can's last error code (LERRC) + * + * @param can: Select the CAN peripheral. + * + * @retval The Last Error Code. + * + */ +uint8_t CAN_ReadLastErrorCode(CAN_T* can) +{ + return can->ERRSTS_B.LERRC; +} + +/*! + * @brief Read the can Receive Error Counter(RXERRCNT) + * + * @param can: Select the CAN peripheral. + * + * @retval CAN Receive Error Counter. + * + */ +uint8_t CAN_ReadRxErrorCounter(CAN_T* can) +{ + return can->ERRSTS_B.RXERRCNT; +} + +/*! + * @brief Read the LSB of the 9-bit can Transmit Error Counter(TXERRCNT). + * + * @param can: Select the CAN peripheral. + * + * @retval Least Significant Byte Of The 9-Bit Transmit Error Counter. + * + */ +uint8_t CAN_ReadLSBTxErrorCounter(CAN_T* can) +{ + return can->ERRSTS_B.TXERRCNT; +} + +/*! + * @brief Enables the specified can interrupts. + * + * @param can: Select the CAN peripheral. + * + * @param interrupts: specifies the CAN interrupt sources + * This parameter can be any combination of the following values: + * @arg CAN_INT_TXME : Transmit mailbox empty Interrupt + * @arg CAN_INT_F0MP : FIFO 0 message pending Interrupt + * @arg CAN_INT_F0FULL : FIFO 0 full Interrupt + * @arg CAN_INT_F0OVR : FIFO 0 overrun Interrupt + * @arg CAN_INT_F1MP : FIFO 1 message pending Interrupt + * @arg CAN_INT_F1FULL : FIFO 1 full Interrupt + * @arg CAN_INT_F1OVR : FIFO 1 overrun Interrupt + * @arg CAN_INT_ERRW : Error warning Interrupt + * @arg CAN_INT_ERRP : Error passive Interrupt + * @arg CAN_INT_BOF : Bus-off Interrupt + * @arg CAN_INT_LEC : Last error record code Interrupt + * @arg CAN_INT_ERR : Error Interrupt + * @arg CAN_INT_WUP : Wake-up Interrupt + * @arg CAN_INT_SLEEP : Sleep acknowledge Interrupt + * + * @retval None + * + */ +void CAN_EnableInterrupt(CAN_T* can, uint32_t interrupts) +{ + can->INTEN |= interrupts; +} + +/*! + * @brief Disable the specified can interrupts. + * + * @param can: Select the CAN peripheral. + * + * @param interrupts: specifies the CAN interrupt sources + * This parameter can be any combination of the following values: + * @arg CAN_INT_TXME : Transmit mailbox empty Interrupt + * @arg CAN_INT_F0MP : FIFO 0 message pending Interrupt + * @arg CAN_INT_F0FULL : FIFO 0 full Interrupt + * @arg CAN_INT_F0OVR : FIFO 0 overrun Interrupt + * @arg CAN_INT_F1MP : FIFO 1 message pending Interrupt + * @arg CAN_INT_F1FULL : FIFO 1 full Interrupt + * @arg CAN_INT_F1OVR : FIFO 1 overrun Interrupt + * @arg CAN_INT_ERRW : Error warning Interrupt + * @arg CAN_INT_ERRP : Error passive Interrupt + * @arg CAN_INT_BOF : Bus-off Interrupt + * @arg CAN_INT_LEC : Last error record code Interrupt + * @arg CAN_INT_ERR : Error Interrupt + * @arg CAN_INT_WUP : Wake-up Interrupt + * @arg CAN_INT_SLEEP : Sleep acknowledge Interrupt + * + * @retval None + * + */ +void CAN_DisableInterrupt(CAN_T* can, uint32_t interrupts) +{ + can->INTEN &= ~interrupts; +} + +/*! + * @brief Read whether the specified CAN flag is set or not. + * + * @param can: Select the CAN peripheral. + * + * @param flag: specifies the CAN flag. + * This parameter can be one of the following values: + * @arg CAN_FLAG_ERRW : Error Warning Flag + * @arg CAN_FLAG_ERRP : Error Passive Flag + * @arg CAN_FLAG_BOF : Bus-Off Flag + * @arg CAN_FLAG_LERRC : Last error record code Flag + * @arg CAN_FLAG_WUPI : Wake up Flag + * @arg CAN_FLAG_SLEEP : Sleep acknowledge Flag + * @arg CAN_FLAG_F0MP : FIFO 0 Message Pending Flag + * @arg CAN_FLAG_F0FULL : FIFO 0 Full Flag + * @arg CAN_FLAG_F0OVR : FIFO 0 Overrun Flag + * @arg CAN_FLAG_F1MP : FIFO 1 Message Pending Flag + * @arg CAN_FLAG_F1FULL : FIFO 1 Full Flag + * @arg CAN_FLAG_F1OVR : FIFO 1 Overrun Flag + * @arg CAN_FLAG_REQC0 : Request MailBox0 Flag + * @arg CAN_FLAG_REQC1 : Request MailBox1 Flag + * @arg CAN_FLAG_REQC2 : Request MailBox2 Flag + * + * @retval flag staus: RESET or SET + * + */ +uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag) +{ + uint8_t status = 0; + + if((flag & 0x00F00000) != RESET ) + { + if((can->ERRSTS & (flag & 0x000FFFFF)) != RESET) + { + status = SET; + } + else + { + status = RESET; + } + } + else if((flag & 0x01000000) != RESET ) + { + if((can->MSTS & (flag & 0x000FFFFF)) != RESET ) + { + status = SET; + } + else + { + status = RESET ; + } + } + else if((flag & 0x08000000) != RESET ) + { + if((can->TXSTS & (flag & 0x000FFFFF)) != RESET ) + { + status = SET; + } + else + { + status = RESET; + } + } + else if((flag & 0x02000000) != RESET ) + { + if((can->RXF0 & (flag & 0x000FFFFF)) != RESET ) + { + status = SET; + } + else + { + status = RESET; + } + } + else + { + if((can->RXF1 & (flag & 0x000FFFFF)) != RESET) + { + status = SET; + } + else + { + status = RESET; + } + } + return status; +} + +/*! + * @brief Clears the CAN's pending flags. + * + * @param can: Select the CAN peripheral. + * + * @param flag: specifies the CAN flag. + * This parameter can be one of the following values: + * @arg CAN_FLAG_LERRC : Last error record code Flag + * @arg CAN_FLAG_WUPI : Wake up Flag + * @arg CAN_FLAG_SLEEP : Sleep acknowledge Flag + * @arg CAN_FLAG_F0FULL: FIFO 0 Full Flag + * @arg CAN_FLAG_F0OVR : FIFO 0 Overrun Flag + * @arg CAN_FLAG_F1FULL: FIFO 1 Full Flag + * @arg CAN_FLAG_F1OVR : FIFO 1 Overrun Flag + * @arg CAN_FLAG_REQC0 : Request MailBox0 Flag + * @arg CAN_FLAG_REQC1 : Request MailBox1 Flag + * @arg CAN_FLAG_REQC2 : Request MailBox2 Flag + * + * @retval None + * + */ +void CAN_ClearStatusFlag(CAN_T* can, CAN_FLAG_T flag) +{ + uint32_t flagtmp = 0; + + /* ERRSTS register */ + if(flag == 0x30F00070) + { + can->ERRSTS = RESET; + } + else + { + flagtmp = flag & 0x000FFFFF; + if((flag & 0x02000000) != RESET) + { + can->RXF0 = flagtmp; + } + else if((flag & 0x04000000) != RESET) + { + can->RXF1 = flagtmp; + } + else if((flag & 0x08000000) != RESET) + { + can->TXSTS = flagtmp; + } + else + { + can->MSTS = flagtmp; + } + } +} + +/*! + * @brief Read whether the specified can interrupt has occurred or not. + * + * @param can: Select the CAN peripheral. + * + * @param flag: specifies the CAN interrupt sources + * This parameter can be one of the following values: + * @arg CAN_INT_TXME : Transmit mailbox empty Interrupt + * @arg CAN_INT_F0MP : FIFO 0 message pending Interrupt + * @arg CAN_INT_F0FULL : FIFO 0 full Interrupt + * @arg CAN_INT_F0OVR : FIFO 0 overrun Interrupt + * @arg CAN_INT_F1MP : FIFO 1 message pending Interrupt + * @arg CAN_INT_F1FULL : FIFO 1 full Interrupt + * @arg CAN_INT_F1OVR : FIFO 1 overrun Interrupt + * @arg CAN_INT_ERRW : Error warning Interrupt + * @arg CAN_INT_ERRP : Error passive Interrupt + * @arg CAN_INT_BOF : Bus-off Interrupt + * @arg CAN_INT_LEC : Last error record code Interrupt + * @arg CAN_INT_ERR : Error Interrupt + * @arg CAN_INT_WUP : Wake-up Interrupt + * @arg CAN_INT_SLEEP : Sleep acknowledge Interrupt + * + * @retval status : SET or RESET + * + */ +uint8_t CAN_ReadIntFlag(CAN_T* can, CAN_INT_T flag) +{ + uint8_t status = 0; + + if((can->INTEN & flag) != RESET) + { + switch (flag) + { + case CAN_INT_TXME: + status = can->TXSTS_B.REQCFLG0; + status |= can->TXSTS_B.REQCFLG1; + status |= can->TXSTS_B.REQCFLG2; + break; + case CAN_INT_F0MP: + status = can->RXF0_B.FMNUM0; + break; + case CAN_INT_F0FULL: + status = can->RXF0_B.FFULLFLG0; + break; + case CAN_INT_F0OVR: + status = can->RXF0_B.FOVRFLG0; + break; + case CAN_INT_F1MP: + status = can->RXF1_B.FMNUM1; + break; + case CAN_INT_F1FULL: + status = can->RXF1_B.FFULLFLG1; + break; + case CAN_INT_F1OVR: + status = can->RXF1_B.FOVRFLG1; + break; + case CAN_INT_WUP: + status = can->MSTS_B.WUPIFLG; + break; + case CAN_INT_SLEEP: + status = can->MSTS_B.SLEEPIFLG; + break; + case CAN_INT_ERRW: + status = can->ERRSTS_B.ERRWFLG; + break; + case CAN_INT_ERRP: + status = can->ERRSTS_B.ERRPFLG; + break; + case CAN_INT_BOF: + status = can->ERRSTS_B.BOFLG; + break; + case CAN_INT_LEC: + status = can->ERRSTS_B.LERRC; + break; + case CAN_INT_ERR: + status = can->MSTS_B.ERRIFLG; + break; + default: + status = RESET; + break; + } + } + else + { + status = RESET; + } + return status; +} + +/*! + * @brief Clears the can's interrupt flag. + * + * @param can: Select the CAN peripheral. + * + * @param flag: Interrupt pending bit to clear + * This parameter can be one of the following values: + * @arg CAN_INT_TXME : Transmit mailbox empty Interrupt + * @arg CAN_INT_F0FULL : FIFO 0 full Interrupt + * @arg CAN_INT_F0OVR : FIFO 0 overrun Interrupt + * @arg CAN_INT_F1FULL : FIFO 1 full Interrupt + * @arg CAN_INT_F1OVR : FIFO 1 overrun Interrupt + * @arg CAN_INT_ERRW : Error warning Interrupt + * @arg CAN_INT_ERRP : Error passive Interrupt + * @arg CAN_INT_BOF : Bus-off Interrupt + * @arg CAN_INT_LEC : Last error record code Interrupt + * @arg CAN_INT_ERR : Error Interrupt + * @arg CAN_INT_WUP : Wake-up Interrupt + * @arg CAN_INT_SLEEP : Sleep acknowledge Interrupt + * + * @retval None + * + */ +void CAN_ClearIntFlag(CAN_T* can, CAN_INT_T flag) +{ + switch (flag) + { + case CAN_INT_TXME: + can->TXSTS_B.REQCFLG0 = BIT_SET; + can->TXSTS_B.REQCFLG1 = BIT_SET; + can->TXSTS_B.REQCFLG2 = BIT_SET; + break; + case CAN_INT_F0FULL: + can->RXF0_B.FFULLFLG0 = BIT_SET; + break; + case CAN_INT_F0OVR: + can->RXF0_B.FOVRFLG0 = BIT_SET; + break; + case CAN_INT_F1FULL: + can->RXF1_B.FFULLFLG1 = BIT_SET; + break; + case CAN_INT_F1OVR: + can->RXF1_B.FOVRFLG1 = BIT_SET; + break; + case CAN_INT_WUP: + can->MSTS_B.WUPIFLG = BIT_SET; + break; + case CAN_INT_SLEEP: + can->MSTS_B.SLEEPIFLG = BIT_SET; + break; + case CAN_INT_ERRW: + can->MSTS_B.ERRIFLG = BIT_SET; + break; + case CAN_INT_ERRP: + can->MSTS_B.ERRIFLG = BIT_SET; + break; + case CAN_INT_BOF: + can->MSTS_B.ERRIFLG = BIT_SET; + break; + case CAN_INT_LEC: + can->ERRSTS_B.LERRC = BIT_RESET; + can->MSTS_B.ERRIFLG = BIT_SET; + break; + case CAN_INT_ERR: + can->ERRSTS_B.LERRC = BIT_RESET; + can->MSTS_B.ERRIFLG = BIT_SET; + break; + default: + break; + } +} + +/**@} end of group CAN_Functions */ +/**@} end of group CAN_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_crc.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_crc.c new file mode 100644 index 0000000000..c29b987ee8 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_crc.c @@ -0,0 +1,127 @@ +/*! + * @file apm32e10x_crc.c + * + * @brief This file provides all the CRC firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_crc.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup CRC_Driver + * @brief CRC driver modules + @{ +*/ + +/** @defgroup CRC_Functions Functions + @{ +*/ + +/*! + * @brief Reset CRC data register. + * + * @param None + * + * @retval None + * + * @note + */ +void CRC_ResetDATA(void) +{ + CRC->CTRL_B.RST = BIT_SET; +} + +/*! + * @brief Calculate CRC of a 32bit data word. + * + * @param data: a data word to compute its CRC. + * This parameter can be a 32bit value: + * + * @retval A 32-bit CRC value + */ +uint32_t CRC_CalculateCRC(uint32_t data) +{ + CRC->DATA = data; + + return (CRC->DATA); +} + +/*! + * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). + * + * @param buf: Pointer to the buffer containing the data to be computed. + * + * @param bufLen: The length of buffer which is computed. + * + * @retval A 32-bit CRC value + */ +uint32_t CRC_CalculateBlockCRC(uint32_t *buf, uint32_t bufLen) +{ + while(bufLen--) + { + CRC->DATA = *buf++; + } + + return (CRC->DATA); +} + +/*! + * @brief Returns the current CRC value. + * + * @param None + * + * @retval A 32-bit CRC value + */ +uint32_t CRC_ReadCRC(void) +{ + return (CRC->DATA); +} + +/*! + * @brief Saves a 8bit data in the Independent Data register(INDATA). + * + * @param inData: a 8-bit value to be stored in the ID register + * + * @retval None + */ +void CRC_WriteIDRegister(uint8_t inData) +{ + CRC->INDATA = inData; +} + +/*! + * @brief Reads a 8-bit data saved in the Independent Data register(INDATA). + * + * @param None + * + * @retval a 8-bit value from the INDATA register + */ +uint8_t CRC_ReadIDRegister(void) +{ + return (CRC->INDATA); +} + +/**@} end of group CRC_Functions */ +/**@} end of group CRC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dac.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dac.c new file mode 100644 index 0000000000..f213d81c5b --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dac.c @@ -0,0 +1,412 @@ +/*! + * @file apm32e10x_dac.c + * + * @brief This file provides all the DAC firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_dac.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + + +/** @addtogroup DAC_Driver + * @brief DAC driver modules + @{ +*/ + +/** @defgroup DAC_Functions Functions + @{ +*/ + +/*! + * @brief Reset dac peripheral registers to their default reset values. + * + * @param None + * + * @retval None + */ +void DAC_Reset(void) +{ + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_DAC); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_DAC); +} + +/*! + * @brief Config the DAC peripheral according to the specified parameters in the configStruct + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @param dacConfig: pointer to a DAC_Config_T structure + * + * @retval None + */ +void DAC_Config(uint32_t channel, DAC_Config_T* dacConfig) +{ + uint32_t tmp1 = 0, tmp2 = 0; + + tmp1 = DAC->CTRL; + + tmp1 &= ~(((uint32_t)0x00000FFE) << channel); + + tmp2 = ((uint32_t)dacConfig->trigger | \ + (uint32_t)dacConfig->waveGeneration | \ + (uint32_t)dacConfig->maskAmplitudeSelect | \ + (uint32_t)dacConfig->outputBuffer); + tmp1 |= tmp2 << channel; + + DAC->CTRL = tmp1; +} + +/*! + * @brief Fills each DAC_Config_T member with its default value + * + * @param dacConfig: pointer to a DAC_Config_T structure which will be initialized + * + * @retval None + */ +void DAC_ConfigStructInit(DAC_Config_T* dacConfig) +{ + /* Initialize the DAC_Trigger member */ + dacConfig->trigger = DAC_TRIGGER_NONE; + /* Initialize the DAC_WaveGeneration member */ + dacConfig->waveGeneration = DAC_WAVE_GENERATION_NONE; + /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ + dacConfig->maskAmplitudeSelect = DAC_LFSR_MASK_BIT11_1; + /* Initialize the DAC_OutputBuffer member */ + dacConfig->outputBuffer = DAC_OUTPUT_BUFFER_ENBALE; +} + +/*! + * @brief Enables the specified DAC peripheral + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @retval None + */ +void DAC_Enable(DAC_CHANNEL_T channel) +{ + if (channel == DAC_CHANNEL_1) + { + DAC->CTRL_B.ENCH1 = BIT_SET; + } + else if (channel == DAC_CHANNEL_2) + { + DAC->CTRL_B.ENCH2 = BIT_SET; + } +} + +/*! + * @brief Disables the specified DAC peripheral + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @retval None + */ +void DAC_Disable(DAC_CHANNEL_T channel) +{ + if (channel == DAC_CHANNEL_1) + { + DAC->CTRL_B.ENCH1 = BIT_RESET; + } + else if (channel == DAC_CHANNEL_2) + { + DAC->CTRL_B.ENCH2 = BIT_RESET; + } +} + + +/*! + * @brief Enables the specified DAC channel DMA request + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @retval None + */ +void DAC_DMA_Enable(DAC_CHANNEL_T channel) +{ + if (channel == DAC_CHANNEL_1) + { + DAC->CTRL_B.DMAENCH1 = BIT_SET; + } + else if (channel == DAC_CHANNEL_2) + { + DAC->CTRL_B.DMAENCH2 = BIT_SET; + } +} + +/*! + * @brief Disables the specified DAC channel DMA request + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @retval None + */ +void DAC_DMA_Disable(DAC_CHANNEL_T channel) +{ + if (channel == DAC_CHANNEL_1) + { + DAC->CTRL_B.DMAENCH1 = BIT_RESET; + } + else if (channel == DAC_CHANNEL_2) + { + DAC->CTRL_B.DMAENCH2 = BIT_RESET; + } +} + +/*! + * @brief Enables the selected DAC channel software trigger + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @retval None + */ +void DAC_EnableSoftwareTrigger(DAC_CHANNEL_T channel) +{ + if (channel == DAC_CHANNEL_1) + { + DAC->SWTRG_B.SWTRG1 = BIT_SET; + } + else if (channel == DAC_CHANNEL_2) + { + DAC->SWTRG_B.SWTRG2 = BIT_SET; + } +} + +/*! + * @brief Disable the selected DAC channel software trigger + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @retval None + */ +void DAC_DisableSoftwareTrigger(DAC_CHANNEL_T channel) +{ + if (channel == DAC_CHANNEL_1) + { + DAC->SWTRG_B.SWTRG1 = BIT_RESET; + } + else if (channel == DAC_CHANNEL_2) + { + DAC->SWTRG_B.SWTRG2 = BIT_RESET; + } +} +/*! + * @brief Enables simultaneously the two DAC channels software + * + * @param None + * + * @retval None + */ +void DAC_EnableDualSoftwareTrigger(void) +{ + DAC->SWTRG_B.SWTRG1 = BIT_SET; + DAC->SWTRG_B.SWTRG2 = BIT_SET; +} + +/*! + * @brief Disables simultaneously the two DAC channels software + * + * @param None + * + * @retval None + */ +void DAC_DisableDualSoftwareTrigger(void) +{ + DAC->SWTRG_B.SWTRG1 = BIT_RESET; + DAC->SWTRG_B.SWTRG2 = BIT_RESET; +} + +/*! + * @brief Enables the selected DAC channel wave generation + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @param wave: Select the wave + * This parameter can be one of the following values: + * @arg DAC_WAVE_GENERATION_NONE : no wave generation + * @arg DAC_WAVE_GENERATION_NOISE : Noise wave generation + * @arg DAC_WAVE_GENERATION_TRIANGLE : Triangle wave generation + * + * @retval None + */ +void DAC_EnableWaveGeneration(DAC_CHANNEL_T channel, DAC_WAVE_GENERATION_T wave) +{ + DAC->CTRL &= 0xFF3FFF3F; + DAC->CTRL |= wave << channel; +} + +/*! + * @brief Disables the selected DAC channel wave generation + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @param wave: Select the wave + * This parameter can be one of the following values: + * @arg DAC_WAVE_GENERATION_NONE : no wave generation + * @arg DAC_WAVE_GENERATION_NOISE : Noise wave generation + * @arg DAC_WAVE_GENERATION_TRIANGLE : Triangle wave generation + * + * @retval None + */ +void DAC_DisableWaveGeneration(DAC_CHANNEL_T channel, DAC_WAVE_GENERATION_T wave) +{ + DAC->CTRL &= ~(wave << channel); +} + +/*! + * @brief Set the specified data holding register value for DAC channel 1 + * + * @param align: DAC channel 1 data alignment + * This parameter can be one of the following values: + * @arg DAC_ALIGN_12BIT_R : 12-bit right-aligned data + * @arg DAC_ALIGN_12BIT_L : 12-bit left-aligned data + * @arg DAC_ALIGN_8BIT_R : 8-bit right-aligned data + * + * @param data: The data to be loaded in the selected data register. + * + * @retval None + */ +void DAC_ConfigChannel1Data(DAC_ALIGN_T align, uint16_t data) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)DAC_BASE; + tmp += 0x00000008 + align; + + /* Set the DAC channel1 selected data holding register */ + *(__IO uint32_t *) tmp = data; +} + +/*! + * @brief Set the specified data holding register value for DAC channel 2 + * + * @param align: DAC channel 2 data alignment + * This parameter can be one of the following values: + * @arg DAC_ALIGN_12BIT_R : 12-bit right-aligned data + * @arg DAC_ALIGN_12BIT_L : 12-bit left-aligned data + * @arg DAC_ALIGN_8BIT_R : 8-bit right-aligned data + * + * @param data: The data to be loaded in the selected data register. + * + * @retval None + */ +void DAC_ConfigChannel2Data(DAC_ALIGN_T align, uint16_t data) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)DAC_BASE; + tmp += 0x00000014 + align; + + /* Set the DAC channel1 selected data holding register */ + *(__IO uint32_t *) tmp = data; +} + +/*! + * @brief Set the specified data holding register value for dual DAC channel + * + * @param align: Dual DAC channel data alignment + * This parameter can be one of the following values: + * @arg DAC_ALIGN_12BIT_R : 12-bit right-aligned data + * @arg DAC_ALIGN_12BIT_L : 12-bit left-aligned data + * @arg DAC_ALIGN_8BIT_R : 8-bit right-aligned data + * + * @param data2: Data for channel2 to be loaded in the selected data register. + * + * @param data1: Data for channel1 to be loaded in the selected data register + * + * @retval None + */ +void DAC_ConfigDualChannelData(DAC_ALIGN_T align, uint16_t data2, uint16_t data1) +{ + uint32_t data = 0, tmp = 0; + + /* Calculate and set dual DAC data holding register value */ + if (align == DAC_ALIGN_8BIT_R) + { + data = ((uint32_t)data2 << 8) | data1; + } + else + { + data = ((uint32_t)data2 << 16) | data1; + } + + tmp = (uint32_t)DAC_BASE; + tmp += 0x00000020 + align; + + /* Set the dual DAC selected data holding register */ + *(__IO uint32_t *)tmp = data; +} + +/*! + * @brief Reads the specified DAC channel data output value. + * + * @param channel: Select the DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1 : DAC channel 1 + * @arg DAC_CHANNEL_2 : DAC channel 2 + * + * @retval The data output value of the specified DAC channel. + */ +uint16_t DAC_ReadDataOutputValue(DAC_CHANNEL_T channel) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t) DAC_BASE ; + tmp += 0x0000002C + ((uint32_t)channel >> 2); + + /* Returns the DAC channel data output register value */ + return (uint16_t) (*(__IO uint32_t*) tmp); +} + +/**@} end of group DAC_Functions */ +/**@} end of group DAC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dbgmcu.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dbgmcu.c new file mode 100644 index 0000000000..23ec58c2f1 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dbgmcu.c @@ -0,0 +1,146 @@ +/*! + * @file apm32e10x_dbgmcu.c + * + * @brief This file provides all the DEBUG firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ +#include "apm32e10x_dbgmcu.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DBGMCU_Driver + * @brief DBGMCU driver modules + @{ +*/ + +/** @defgroup DBGMCU_Functions Functions + @{ +*/ + +/*! + * @brief Returns the device identifier. + * + * @param None + * + * @retval Device identifier + */ +uint32_t DBGMCU_ReadDEVID(void) +{ + return(DBGMCU->IDCODE_B.EQR); +} + +/*! + * @brief Returns the device revision identifier. + * + * @param None + * + * @retval Device revision identifier + */ +uint32_t DBGMCU_ReadREVID(void) +{ + return(DBGMCU->IDCODE_B.WVR); +} + +/*! + * @brief Enable the specified peripheral and low power mode behavior + * when the MCU under Debug mode + * + * @param periph: Specifies the peripheral and low power mode + * This parameter can be any combination of the following values: + * @arg DBGMCU_SLEEP : Keep debugger connection during SLEEP mode + * @arg DBGMCU_STOP : Keep debugger connection during STOP mode + * @arg DBGMCU_STANDBY : Keep debugger connection during STANDBY mode + * @arg DBGMCU_IWDT_STOP : Debug IWDT stopped when Core is halted + * @arg DBGMCU_WWDT_STOP : Debug WWDT stopped when Core is halted + * @arg DBGMCU_TMR1_STOP : TMR1 counter stopped when Core is halted + * @arg DBGMCU_TMR2_STOP : TMR2 counter stopped when Core is halted + * @arg DBGMCU_TMR3_STOP : TMR3 counter stopped when Core is halted + * @arg DBGMCU_TMR4_STOP : TMR4 counter stopped when Core is halted + * @arg DBGMCU_CAN1_STOP : Debug CAN1 stopped when Core is halted + * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_TMR5_STOP : TMR5 counter stopped when Core is halted + * @arg DBGMCU_TMR6_STOP : TMR6 counter stopped when Core is halted + * @arg DBGMCU_TMR7_STOP : TMR7 counter stopped when Core is halted + * @arg DBGMCU_TMR8_STOP : TMR8 counter stopped when Core is halted + * @arg DBGMCU_CAN2_STOP : Debug CAN2 stopped when Core is halted + * @arg DBGMCU_TMR15_STOP : TMR15 counter stopped when Core is halted + * @arg DBGMCU_TMR16_STOP : TMR16 counter stopped when Core is halted + * @arg DBGMCU_TMR17_STOP : TMR17 counter stopped when Core is halted + * @arg DBGMCU_TMR9_STOP : TMR9 counter stopped when Core is halted + * @arg DBGMCU_TMR10_STOP : TMR10 counter stopped when Core is halted + * @arg DBGMCU_TMR11_STOP : TMR11 counter stopped when Core is halted + * @arg DBGMCU_TMR12_STOP : TMR12 counter stopped when Core is halted + * @arg DBGMCU_TMR13_STOP : TMR13 counter stopped when Core is halted + * @arg DBGMCU_TMR14_STOP : TMR14 counter stopped when Core is halted + * + * @retval None + */ +void DBGMCU_Enable(uint32_t periph) +{ + DBGMCU->CFG |= periph; +} + +/*! + * @brief Enable the specified peripheral and low power mode behavior + * when the MCU under Debug mode + * + * @param periph: Specifies the peripheral and low power mode + * This parameter can be any combination of the following values: + * @arg DBGMCU_SLEEP : Keep debugger connection during SLEEP mode + * @arg DBGMCU_STOP : Keep debugger connection during STOP mode + * @arg DBGMCU_STANDBY : Keep debugger connection during STANDBY mode + * @arg DBGMCU_IWDT_STOP : Debug IWDT stopped when Core is halted + * @arg DBGMCU_WWDT_STOP : Debug WWDT stopped when Core is halted + * @arg DBGMCU_TMR1_STOP : TMR1 counter stopped when Core is halted + * @arg DBGMCU_TMR2_STOP : TMR2 counter stopped when Core is halted + * @arg DBGMCU_TMR3_STOP : TMR3 counter stopped when Core is halted + * @arg DBGMCU_TMR4_STOP : TMR4 counter stopped when Core is halted + * @arg DBGMCU_CAN1_STOP : Debug CAN1 stopped when Core is halted + * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_TMR5_STOP : TMR5 counter stopped when Core is halted + * @arg DBGMCU_TMR6_STOP : TMR6 counter stopped when Core is halted + * @arg DBGMCU_TMR7_STOP : TMR7 counter stopped when Core is halted + * @arg DBGMCU_TMR8_STOP : TMR8 counter stopped when Core is halted + * @arg DBGMCU_CAN2_STOP : Debug CAN2 stopped when Core is halted + * @arg DBGMCU_TMR15_STOP : TMR15 counter stopped when Core is halted + * @arg DBGMCU_TMR16_STOP : TMR16 counter stopped when Core is halted + * @arg DBGMCU_TMR17_STOP : TMR17 counter stopped when Core is halted + * @arg DBGMCU_TMR9_STOP : TMR9 counter stopped when Core is halted + * @arg DBGMCU_TMR10_STOP : TMR10 counter stopped when Core is halted + * @arg DBGMCU_TMR11_STOP : TMR11 counter stopped when Core is halted + * @arg DBGMCU_TMR12_STOP : TMR12 counter stopped when Core is halted + * @arg DBGMCU_TMR13_STOP : TMR13 counter stopped when Core is halted + * @arg DBGMCU_TMR14_STOP : TMR14 counter stopped when Core is halted + * + * @retval None + */ +void DBGMCU_Disable(uint32_t periph) +{ + DBGMCU->CFG &= ~periph; +} + +/**@} end of group DBGMCU_Functions */ +/**@} end of group DBGMCU_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dma.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dma.c new file mode 100644 index 0000000000..2db907dfd8 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dma.c @@ -0,0 +1,559 @@ +/*! + * @file apm32e10x_dma.c + * + * @brief This file provides all the DMA firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_dma.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DMA_Driver + * @brief DMA driver modules + @{ +*/ + +/** @defgroup DMA_Functions + @{ +*/ + +/*! + * @brief Reset specified DMA Channel registers to their default reset + * + * @param channel:DMA1_channelx(x can be from 1 to 7) or DMA2_channely(y can be from 1 to 5). + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_Reset(DMA_Channel_T *channel) +{ + channel->CHCFG_B.CHEN = BIT_RESET; + channel->CHCFG = 0; + channel->CHNDATA = 0; + channel->CHMADDR = 0; + channel->CHPADDR = 0; + + if(channel == DMA1_Channel1) + { + DMA1->INTFCLR |= 0xFFFFFFF0; + } + else if(channel == DMA1_Channel2) + { + DMA1->INTFCLR |= 0xFFFFFF0F; + } + else if(channel == DMA1_Channel3) + { + DMA1->INTFCLR |= 0xFFFFF0FF; + } + else if(channel == DMA1_Channel4) + { + DMA1->INTFCLR |= 0xFFFF0FFF; + } + else if(channel == DMA1_Channel5) + { + DMA1->INTFCLR |= 0xFFF0FFFF; + } + else if(channel == DMA1_Channel6) + { + DMA1->INTFCLR |= 0xFF0FFFFF; + } + else if(channel == DMA1_Channel7) + { + DMA1->INTFCLR |= 0xF0FFFFFF; + } + else if(channel == DMA2_Channel1) + { + DMA2->INTFCLR |= 0xFFFFFFF0; + } + else if(channel == DMA2_Channel2) + { + DMA2->INTFCLR |= 0xFFFFFF0F; + } + else if(channel == DMA2_Channel3) + { + DMA2->INTFCLR |= 0xFFFFF0FF; + } + else if(channel == DMA2_Channel4) + { + DMA2->INTFCLR |= 0xFFFF0FFF; + } + else if(channel == DMA2_Channel5) + { + DMA2->INTFCLR |= 0xFFF0FFFF; + } +} + +/*! + * @brief Configs specified DMA Channel through a structure. + * + * @param channel:DMA1_channelx(x can be from 1 to 7) or DMA2_channely(y can be from 1 to 5) + * + * @param dmaConfig: Point to a DMA_Config_T structure + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_Config(DMA_Channel_T* channel, DMA_Config_T* dmaConfig) +{ + channel->CHCFG_B.DIRCFG = dmaConfig->dir; + channel->CHCFG_B.CIRMODE = dmaConfig->loopMode; + channel->CHCFG_B.PERIMODE = dmaConfig->peripheralInc; + channel->CHCFG_B.MIMODE = dmaConfig->memoryInc; + channel->CHCFG_B.PERSIZE = dmaConfig->peripheralDataSize; + channel->CHCFG_B.MEMSIZE = dmaConfig->memoryDataSize; + channel->CHCFG_B.CHPL = dmaConfig->priority; + channel->CHCFG_B.M2MMODE = dmaConfig->M2M; + + channel->CHNDATA = dmaConfig->bufferSize; + channel->CHPADDR = dmaConfig->peripheralBaseAddr; + channel->CHMADDR = dmaConfig->memoryBaseAddr; +} + +/*! + * @brief Populate the structure with default values. + * + * @param dmaConfig: Point to a DMA_Config_T structure. + * + * @retval None + */ +void DMA_ConfigStructInit( DMA_Config_T* dmaConfig) +{ + dmaConfig->peripheralBaseAddr = 0; + dmaConfig->memoryBaseAddr = 0; + dmaConfig->dir = DMA_DIR_PERIPHERAL_SRC; + dmaConfig->bufferSize = 0; + dmaConfig->peripheralInc = DMA_PERIPHERAL_INC_DISABLE; + dmaConfig->memoryInc = DMA_MEMORY_INC_DISABLE; + dmaConfig->peripheralDataSize = DMA_PERIPHERAL_DATA_SIZE_BYTE; + dmaConfig->memoryDataSize = DMA_MEMORY_DATA_SIZE_BYTE; + dmaConfig->loopMode = DMA_MODE_NORMAL; + dmaConfig->priority = DMA_PRIORITY_LOW; + dmaConfig->M2M = DMA_M2MEN_DISABLE; +} + +/*! + * @brief Enable the specified DMA Channel + * + * @param channel:DMA1_channelx(x can be from 1 to 7) or DMA2_channely(y can be from 1 to 5) + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_Enable(DMA_Channel_T *channel) +{ + channel->CHCFG_B.CHEN = ENABLE; +} + +/*! + * @brief Disable the specified DMA Channel + * + * @param channel:DMA1_channelx(x can be from 1 to 7) or DMA2_channely(y can be from 1 to 5) + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_Disable(DMA_Channel_T *channel) +{ + channel->CHCFG_B.CHEN = DISABLE; +} + +/*! + * @brief Configs the number of data units in the channel. + * + * @param channel:DMA1_channelx(x can be from 1 to 7) or DMA2_channely(y can be from 1 to 5) + * + * @param dataNumber:The number of data units in the current DMA Channel transfer. + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_ConfigDataNumber(DMA_Channel_T *channel, uint16_t dataNumber) +{ + channel->CHNDATA = dataNumber; +} + +/*! + * @brief Read the number of data units in the channel + * + * @param channel:DMA1_channelx(x can be from 1 to 7) or DMA2_channely(y can be from 1 to 5) + * + * @retval The number of CHNDATA value + * + * @note DMA2 Channel only for APM32 High density devices. + */ +uint16_t DMA_ReadDataNumber(DMA_Channel_T *channel) +{ + return channel->CHNDATA; +} + +/*! + * @brief Enables the specified DMA Channel interrupts. + * + * @param channel:DMA1_channelx(x can be from 1 to 7) or DMA2_channely(y can be from 1 to 5) + * + * @param interrupt: DMA interrupts sources to selsct + * This parameter can be any combination of the following values: + * @arg DMA_INT_TC : All Transfer Complete Interrupt + * @arg DMA_INT_HT : Half Transfer Complete Interrupt + * @arg DMA_INT_TERR : Transfer Error Occur Interrupt + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_EnableInterrupt(DMA_Channel_T *channel, uint32_t interrupt) +{ + channel->CHCFG |= interrupt; +} + +/*! + * @brief Disable the specified DMA Channel interrupts. + * + * @param channel:DMA1_channelx(x can be from 1 to 7) or DMA2_channely(y can be from 1 to 5) + * + * @param interrupt: DMA interrupts sources to selsct + * This parameter can be any combination of the following values: + * @arg DMA_INT_TC : All Transfer Complete Interrupt + * @arg DMA_INT_HT : Half Transfer Complete Interrupt + * @arg DMA_INT_TERR : Transfer Error Occur Interrupt + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_DisableInterrupt(DMA_Channel_T *channel, uint32_t interrupt) +{ + channel->CHCFG &= ~interrupt; +} + +/*! + * @brief Read whether the specifie DMA Channel flag is set or not. + * + * @param flag: the flag to check. + * This parameter can be one of the following values: + * @arg DMA1_FLAG_GINT1: DMA1 Channel 1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel 1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel 1 half transfer flag. + * @arg DMA1_FLAG_TERR1: DMA1 Channel 1 transfer error flag. + * @arg DMA1_FLAG_GINT2: DMA1 Channel2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. + * @arg DMA1_FLAG_TERR2: DMA1 Channel2 transfer error flag. + * @arg DMA1_FLAG_GINT3: DMA1 Channel3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. + * @arg DMA1_FLAG_TERR3: DMA1 Channel3 transfer error flag. + * @arg DMA1_FLAG_GINT4: DMA1 Channel4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. + * @arg DMA1_FLAG_TERR4: DMA1 Channel4 transfer error flag. + * @arg DMA1_FLAG_GINT5: DMA1 Channel5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. + * @arg DMA1_FLAG_TERR5: DMA1 Channel5 transfer error flag. + * @arg DMA1_FLAG_GINT6: DMA1 Channel6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TERR6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GINT7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TERR7: DMA1 Channel7 transfer error flag. + * + * @arg DMA2_FLAG_GINT1: DMA2 Channel 1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel 1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel 1 half transfer flag. + * @arg DMA2_FLAG_TERR1: DMA2 Channel 1 transfer error flag. + * @arg DMA2_FLAG_GINT2: DMA2 Channel 2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel 2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel 2 half transfer flag. + * @arg DMA2_FLAG_TERR2: DMA2 Channel 2 transfer error flag. + * @arg DMA2_FLAG_GINT3: DMA2 Channel 3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel 3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel 3 half transfer flag. + * @arg DMA2_FLAG_TERR3: DMA2 Channel 3 transfer error flag. + * @arg DMA2_FLAG_GINT4: DMA2 Channel 4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel 4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel 4 half transfer flag. + * @arg DMA2_FLAG_TERR4: DMA2 Channel 4 transfer error flag. + * @arg DMA2_FLAG_GINT5: DMA2 Channel 5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel 5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel 5 half transfer flag. + * @arg DMA2_FLAG_TERR5: DMA2 Channel 5 transfer error flag. + * + * @retval Flag State + * + * @note DMA2 Channel only for APM32 High density devices. + */ +uint8_t DMA_ReadStatusFlag(DMA_FLAG_T flag) +{ + if((flag & 0x10000000) != RESET ) + { + if((DMA2->INTSTS & flag ) != RESET ) + { + return SET ; + } else + { + return RESET ; + } + } + else + { + if((DMA1->INTSTS & flag ) != RESET ) + { + return SET ; + } else + { + return RESET ; + } + } +} + +/*! + * @brief Clears the specifie DMA Channel's flags. + * + * @param flag:the flag to Clear. + * This parameter can be any combination of the following values: + * @arg DMA1_FLAG_GINT1: DMA1 Channel 1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel 1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel 1 half transfer flag. + * @arg DMA1_FLAG_TERR1: DMA1 Channel 1 transfer error flag. + * @arg DMA1_FLAG_GINT2: DMA1 Channel2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. + * @arg DMA1_FLAG_TERR2: DMA1 Channel2 transfer error flag. + * @arg DMA1_FLAG_GINT3: DMA1 Channel3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. + * @arg DMA1_FLAG_TERR3: DMA1 Channel3 transfer error flag. + * @arg DMA1_FLAG_GINT4: DMA1 Channel4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. + * @arg DMA1_FLAG_TERR4: DMA1 Channel4 transfer error flag. + * @arg DMA1_FLAG_GINT5: DMA1 Channel5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. + * @arg DMA1_FLAG_TERR5: DMA1 Channel5 transfer error flag. + * @arg DMA1_FLAG_GINT6: DMA1 Channel6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. + * @arg DMA1_FLAG_TERR6: DMA1 Channel6 transfer error flag. + * @arg DMA1_FLAG_GINT7: DMA1 Channel7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. + * @arg DMA1_FLAG_TERR7: DMA1 Channel7 transfer error flag. + * @arg DMA2_FLAG_GINT1: DMA2 Channel 1 global flag. + * @arg DMA2_FLAG_TC1: DMA2 Channel 1 transfer complete flag. + * @arg DMA2_FLAG_HT1: DMA2 Channel 1 half transfer flag. + * @arg DMA2_FLAG_TERR1: DMA2 Channel 1 transfer error flag. + * @arg DMA2_FLAG_GINT2: DMA2 Channel 2 global flag. + * @arg DMA2_FLAG_TC2: DMA2 Channel 2 transfer complete flag. + * @arg DMA2_FLAG_HT2: DMA2 Channel 2 half transfer flag. + * @arg DMA2_FLAG_TERR2: DMA2 Channel 2 transfer error flag. + * @arg DMA2_FLAG_GINT3: DMA2 Channel 3 global flag. + * @arg DMA2_FLAG_TC3: DMA2 Channel 3 transfer complete flag. + * @arg DMA2_FLAG_HT3: DMA2 Channel 3 half transfer flag. + * @arg DMA2_FLAG_TERR3: DMA2 Channel 3 transfer error flag. + * @arg DMA2_FLAG_GINT4: DMA2 Channel 4 global flag. + * @arg DMA2_FLAG_TC4: DMA2 Channel 4 transfer complete flag. + * @arg DMA2_FLAG_HT4: DMA2 Channel 4 half transfer flag. + * @arg DMA2_FLAG_TERR4: DMA2 Channel 4 transfer error flag. + * @arg DMA2_FLAG_GINT5: DMA2 Channel 5 global flag. + * @arg DMA2_FLAG_TC5: DMA2 Channel 5 transfer complete flag. + * @arg DMA2_FLAG_HT5: DMA2 Channel 5 half transfer flag. + * @arg DMA2_FLAG_TERR5: DMA2 Channel 5 transfer error flag. + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_ClearStatusFlag(uint32_t flag) +{ + if((flag & 0x10000000) != RESET) + { + DMA2->INTFCLR = flag; + } else + { + DMA1->INTFCLR = flag; + } +} + +/*! + * @brief Read whether the specified DMA Channel interrupts is set or not. + * + * @param interrupt: interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA1_INT_FLAG_GINT1 : DMA1 Channel 1 global interrupt. + * @arg DMA1_INT_FLAG_TC1 : DMA1 Channel 1 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT1 : DMA1 Channel 1 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR1 : DMA1 Channel 1 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT2 : DMA1 Channel2 global interrupt. + * @arg DMA1_INT_FLAG_TC2 : DMA1 Channel2 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT2 : DMA1 Channel2 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR2 : DMA1 Channel2 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT3 : DMA1 Channel3 global interrupt. + * @arg DMA1_INT_FLAG_TC3 : DMA1 Channel3 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT3 : DMA1 Channel3 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR3 : DMA1 Channel3 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT4 : DMA1 Channel4 global interrupt. + * @arg DMA1_INT_FLAG_TC4 : DMA1 Channel4 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT4 : DMA1 Channel4 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR4 : DMA1 Channel4 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT5 : DMA1 Channel5 global interrupt. + * @arg DMA1_INT_FLAG_TC5 DMA1 Channel5 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT5 DMA1 Channel5 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR5 : DMA1 Channel5 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT6 : DMA1 Channel6 global interrupt. + * @arg DMA1_INT_FLAG_TC6 : DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT6 : DMA1 Channel6 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR6 : DMA1 Channel6 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT7 : DMA1 Channel7 global interrupt. + * @arg DMA1_INT_FLAG_TC7 : DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT7 : DMA1 Channel7 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR7 : DMA1 Channel7 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT1 : DMA2 Channel 1 global interrupt. + * @arg DMA2_INT_FLAG_TC1 : DMA2 Channel 1 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT1 : DMA2 Channel 1 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR1 : DMA2 Channel 1 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT2 : DMA2 Channel 2 global interrupt. + * @arg DMA2_INT_FLAG_TC2 : DMA2 Channel 2 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT2 : DMA2 Channel 2 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR2 : DMA2 Channel 2 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT3 : DMA2 Channel 3 global interrupt. + * @arg DMA2_INT_FLAG_TC3 : DMA2 Channel 3 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT3 : DMA2 Channel 3 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR3 : DMA2 Channel 3 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT4 : DMA2 Channel 4 global interrupt. + * @arg DMA2_INT_FLAG_TC4 : DMA2 Channel 4 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT4 : DMA2 Channel 4 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR4 : DMA2 Channel 4 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT5 : DMA2 Channel 5 global interrupt. + * @arg DMA2_INT_FLAG_TC5 : DMA2 Channel 5 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT5 : DMA2 Channel 5 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR5 : DMA2 Channel 5 transfer error interrupt. + * + * @retval interrupt State + * + * @note DMA2 Channel only for APM32 High density devices. + */ +uint8_t DMA_ReadIntFlag(DMA_INT_FLAG_T flag) +{ + if((flag & 0x10000000) != RESET ) + { + if((DMA2->INTSTS & flag ) != RESET ) + { + return SET ; + } else + { + return RESET ; + } + } else + { + if((DMA1->INTSTS & flag ) != RESET ) + { + return SET ; + } else + { + return RESET ; + } + } +} + +/*! + * @brief Clears the specified DMA Channel's interrupts. + * + * @param flag: the interrupt flag to Clear. + * This parameter can be any combination of the following values: + * @arg DMA1_INT_FLAG_GINT1 : DMA1 Channel 1 global interrupt. + * @arg DMA1_INT_FLAG_TC1 : DMA1 Channel 1 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT1 : DMA1 Channel 1 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR1 : DMA1 Channel 1 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT2 : DMA1 Channel2 global interrupt. + * @arg DMA1_INT_FLAG_TC2 : DMA1 Channel2 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT2 : DMA1 Channel2 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR2 : DMA1 Channel2 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT3 : DMA1 Channel3 global interrupt. + * @arg DMA1_INT_FLAG_TC3 : DMA1 Channel3 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT3 : DMA1 Channel3 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR3 : DMA1 Channel3 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT4 : DMA1 Channel4 global interrupt. + * @arg DMA1_INT_FLAG_TC4 : DMA1 Channel4 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT4 : DMA1 Channel4 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR4 : DMA1 Channel4 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT5 : DMA1 Channel5 global interrupt. + * @arg DMA1_INT_FLAG_TC5 DMA1 Channel5 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT5 DMA1 Channel5 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR5 : DMA1 Channel5 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT6 : DMA1 Channel6 global interrupt. + * @arg DMA1_INT_FLAG_TC6 : DMA1 Channel6 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT6 : DMA1 Channel6 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR6 : DMA1 Channel6 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT7 : DMA1 Channel7 global interrupt. + * @arg DMA1_INT_FLAG_TC7 : DMA1 Channel7 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT7 : DMA1 Channel7 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR7 : DMA1 Channel7 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT1 : DMA2 Channel 1 global interrupt. + * @arg DMA2_INT_FLAG_TC1 : DMA2 Channel 1 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT1 : DMA2 Channel 1 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR1 : DMA2 Channel 1 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT2 : DMA2 Channel 2 global interrupt. + * @arg DMA2_INT_FLAG_TC2 : DMA2 Channel 2 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT2 : DMA2 Channel 2 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR2 : DMA2 Channel 2 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT3 : DMA2 Channel 3 global interrupt. + * @arg DMA2_INT_FLAG_TC3 : DMA2 Channel 3 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT3 : DMA2 Channel 3 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR3 : DMA2 Channel 3 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT4 : DMA2 Channel 4 global interrupt. + * @arg DMA2_INT_FLAG_TC4 : DMA2 Channel 4 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT4 : DMA2 Channel 4 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR4 : DMA2 Channel 4 transfer error interrupt. + * @arg DMA2_INT_FLAG_GINT5 : DMA2 Channel 5 global interrupt. + * @arg DMA2_INT_FLAG_TC5 : DMA2 Channel 5 transfer complete interrupt. + * @arg DMA2_INT_FLAG_HT5 : DMA2 Channel 5 half transfer interrupt. + * @arg DMA2_INT_FLAG_TERR5 : DMA2 Channel 5 transfer error interrupt. + * + * @retval None + * + * @note DMA2 Channel only for APM32 High density devices. + */ +void DMA_ClearIntFlag(uint32_t flag) +{ + if((flag & 0x10000000) != RESET) + { + DMA2->INTFCLR = flag; + } else + { + DMA1->INTFCLR = flag; + } +} + +/**@} end of group DMA_Functions */ +/**@} end of group DMA_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dmc.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dmc.c new file mode 100644 index 0000000000..cfd00059ca --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_dmc.c @@ -0,0 +1,463 @@ +/*! + * @file apm32e10x_dmc.c + * + * @brief This file contains all the functions for the DMC controler peripheral + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_dmc.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DMC_Driver + * @brief DMC driver modules + @{ +*/ + +/** @defgroup DMC_Functions Functions + @{ +*/ + +/*! + * @brief DMC controler configuration + * + * @param dmcConfig: pointer to a DMC_Config_T structure + * + * @retval None + */ +void DMC_Config(DMC_Config_T * dmcConfig) +{ + DMC->SW_B.MCSW = 1; + while(!DMC->CTRL1_B.INIT); + + DMC->CFG_B.BAWCFG = dmcConfig->bankWidth; + DMC->CFG_B.RAWCFG = dmcConfig->rowWidth; + DMC->CFG_B.CAWCFG = dmcConfig->colWidth; + + DMC->MASK_B.MSIZESEL = dmcConfig->memorySize; + DMC->CTRL2_B.CPHACFG = dmcConfig->clkPhase; + + DMC_ConfigTiming(&dmcConfig->timing); + + DMC->CTRL1_B.MODESET = 1; + while(!DMC->CTRL1_B.MODESET); + + DMC->CTRL2_B.RDDEN = 1; + DMC->CTRL2_B.RDDCFG = 7; +} + +/*! + * @brief Fills each dmcConfig member with its default value + * + * @param dmcConfig: pointer to a DMC_Config_T structure + * + * @retval None + */ +void DMC_ConfigStructInit(DMC_Config_T * dmcConfig) +{ + dmcConfig->bankWidth = DMC_BANK_WIDTH_2; + dmcConfig->clkPhase = DMC_CLK_PHASE_REVERSE; + dmcConfig->colWidth = DMC_COL_WIDTH_10; + dmcConfig->rowWidth = DMC_ROW_WIDTH_13; + dmcConfig->memorySize = DMC_MEMORY_SIZE_8MB; + + DMC_ConfigTimingStructInit(&dmcConfig->timing); +} + +/*! + * @brief Timing configuration + * + * @param timingConfig: pointer to a DMC_TimingConfig_T structure + * + * @retval None + */ +void DMC_ConfigTiming(DMC_TimingConfig_T * timingConfig) +{ + DMC->TIM0_B.RASMINTSEL = timingConfig->tRAS; + DMC->TIM0_B.DTIMSEL = timingConfig->tRCD; + DMC->TIM0_B.PCPSEL = timingConfig->tRP; + DMC->TIM0_B.WRTIMSEL = timingConfig->tWR; + DMC->TIM0_B.ARPSEL = timingConfig->tARP; + DMC->TIM0_B.ATACP = timingConfig->tCMD; + + DMC->TIM0_B.CASLSEL0 = timingConfig->latencyCAS & 0x03; + DMC->TIM0_B.ECASLSEL1 = (timingConfig->latencyCAS >> 2) & 0x01; + + DMC->TIM0_B.XSR0 = timingConfig->tXSR & 0X0F; + DMC->TIM0_B.EXSR1 = (timingConfig->tXSR >> 4) & 0X1F; + + DMC->REF_B.RCYCCFG = timingConfig->tRFP; +} + +/*! + * @brief Fills each config member with its default value + * + * @param timingConfig: pointer to a DMC_TimingConfig_T structure + * + * @retval None + */ +void DMC_ConfigTimingStructInit(DMC_TimingConfig_T * timingConfig) +{ + timingConfig->latencyCAS = DMC_CAS_LATENCY_3; + timingConfig->tARP = DMC_AUTO_REFRESH_10; + timingConfig->tRAS = DMC_RAS_MINIMUM_5; + timingConfig->tCMD = DMC_ATA_CMD_7; + timingConfig->tRCD = DMC_DELAY_TIME_2; + timingConfig->tRP = DMC_PRECHARGE_2; + timingConfig->tWR = DMC_NEXT_PRECHARGE_2; + timingConfig->tXSR = 6; + timingConfig->tRFP = 0xC3; +} + +/*! + * @brief Set number of bank bits + * + * @param bankWidth: Specifies the bank bits number + * This parameter can be one of the following values: + * @arg DMC_BANK_WIDTH_1 + * @arg DMC_BANK_WIDTH_2 + * @retval None + */ +void DMC_ConfigBankWidth(DMC_BANK_WIDTH_T bankWidth) +{ + DMC->CFG_B.BAWCFG = bankWidth; +} + +/*! + * @brief Set address bus width + * + * @param rowWidth: Specifies the row address bits number + * This parameter can be one of the following values: + * @arg DMC_ROW_WIDTH_11 + * @arg DMC_ROW_WIDTH_12 + * @arg DMC_ROW_WIDTH_13 + * @arg DMC_ROW_WIDTH_14 + * @arg DMC_ROW_WIDTH_15 + * @arg DMC_ROW_WIDTH_16 + * @param colWidth: Specifies the column address bits number + * This parameter can be one of the following values: + * @arg DMC_COL_WIDTH_8 + * @arg DMC_COL_WIDTH_9 + * @arg DMC_COL_WIDTH_10 + * @arg DMC_COL_WIDTH_11 + * @arg DMC_COL_WIDTH_12 + * @arg DMC_COL_WIDTH_13 + * @arg DMC_COL_WIDTH_14 + * @arg DMC_COL_WIDTH_15 + * @retval None + */ +void DMC_ConfigAddrWidth(DMC_ROW_WIDTH_T rowWidth, DMC_COL_WIDTH_T colWidth) +{ + DMC->CFG_B.RAWCFG = rowWidth; + DMC->CFG_B.CAWCFG = colWidth; +} + +/*! + * @brief Set stable time after power up + * + * @param stableTime: Numper of the clock, can be 0x0000 to 0xFFFF + * + * @retval None + */ +void DMC_ConfigStableTimePowerup(uint16_t stableTime) +{ + DMC->TIM1_B.STBTIM = stableTime; +} + +/*! + * @brief Number of auto-refreshes during initialization + * + * @param num: Number of auto-refreshes can 1 to 16 + * This parameter can be one of the following values: + * @arg DMC_AUTO_REFRESH_1 + * @arg DMC_AUTO_REFRESH_2 + * ...... + * @arg DMC_AUTO_REFRESH_15 + * @arg DMC_AUTO_REFRESH_16 + * + * @retval None + */ +void DMC_ConfigAutoRefreshNumDuringInit(DMC_AUTO_REFRESH_T num) +{ + DMC->TIM1_B.ARNUMCFG = num; +} + +/*! + * @brief Number of DMC internal banks to be open at any time; + * + * @param num: Number of banks can 1 to 16 + * This parameter can be one of the following values: + * @arg DMC_BANK_NUMBER_1 + * @arg DMC_BANK_NUMBER_2 + * ...... + * @arg DMC_BANK_NUMBER_15 + * @arg DMC_BANK_NUMBER_16 + * @retval None + */ +void DMC_ConfigOpenBank(DMC_BANK_NUMBER_T num) +{ + DMC->CTRL1_B.BANKNUMCFG = num; +} + +/*! + * @brief Read self-refresh status + * + * @param None + * + * @retval The status of self-refresh (SET or RESET) + */ +uint8_t DMC_ReadSelfRefreshStatus(void) +{ + uint8_t ret; + + ret = DMC->CTRL1_B.SRMFLG ? SET : RESET; + + return ret; +} + +/*! + * @brief Set update mode bit + * + * @param None + * + * @retval None + */ +void DMC_EnableUpdateMode(void) +{ + DMC->CTRL1_B.MODESET = 1; +} + +/*! + * @brief Enter power down mode + * + * @param None + * + * @retval None + */ +void DMC_EnterPowerdownMode(void) +{ + DMC->CTRL1_B.PDMEN = 1; +} + +/*! + * @brief Exit self-refresh mode + * + * @param None + * + * @retval None + */ +void DMC_EixtSlefRefreshMode(void) +{ + DMC->CTRL1_B.SRMEN = 0; +} + +/*! + * @brief Enter self-refresh mode + * + * @param None + * + * @retval None + */ +void DMC_EnterSlefRefreshMode(void) +{ + DMC->CTRL1_B.SRMEN = 1; +} + +/*! + * @brief Enable Accelerate Module + * + * @param None + * + * @retval None + */ +void DMC_EnableAccelerateModule(void) +{ + DMC->CTRL2_B.BUFFEN = BIT_SET; +} +/*! + * @brief Disable Accelerate Module + * + * @param None + * + * @retval None + */ +void DMC_DisableAccelerateModule(void) +{ + DMC->CTRL2_B.BUFFEN = BIT_RESET; +} +/*! + * @brief Init DMC + * + * @param None + * + * @retval None + */ +void DMC_EnableInit(void) +{ + DMC->CTRL1_B.INIT = 1; +} + +/*! + * @brief Set refresh type before enter self-refresh + * + * @param refresh: Specifies the refresh type + * The parameter can be one of following values: + * @arg DMC_REFRESH_ROW_ONE: Refresh one row + * @arg DMC_REFRESH_ROW_ALL: Refresh all row + * + * @retval None + */ +void DMC_ConfigFullRefreshBeforeSR(DMC_REFRESH_T refresh) +{ + DMC->CTRL1_B.FRBSREN = refresh; +} + +/*! + * @brief Set refresh type after exit self-refresh + * + * @param refresh: Specifies the refresh type + * The parameter can be one of following values: + * @arg DMC_REFRESH_ROW_ONE: Refresh one row + * @arg DMC_REFRESH_ROW_ALL: Refresh all row + * + * @retval None + */ +void DMC_ConfigFullRefreshAfterSR(DMC_REFRESH_T refresh) +{ + DMC->CTRL1_B.FRASREN = refresh; +} + +/*! + * @brief Config precharge type + * + * @param precharge: Specifies the precharge type + * The parameter can be one of following values: + * @arg DMC_PRECHARGE_IM: Immediate precharge + * @arg DMC_PRECHARGE_DELAY: Delayed precharge + * + * @retval None + */ +void DMC_ConfigPrechargeType(DMC_PRECHARE_T precharge) +{ + DMC->CTRL1_B.PCACFG = precharge; +} + +/*! + * @brief Config refresh period + * + * @param period: Specifies the refresh period, can be 0x0000 to 0xFFFF + * + * @retval None + */ +void DMC_ConfigRefreshPeriod(uint16_t period) +{ + DMC->REF_B.RCYCCFG = period; +} + +/*! + * @brief Config memory size + * + * @param memorySize: Specifies memory size + * The parameter can be one of following values: + * @arg DMC_MEMORY_SIZE_0: Memory size is no link + * @arg DMC_MEMORY_SIZE_64KB: Memory size is 64KB + * @arg DMC_MEMORY_SIZE_128KB: Memory size is 128KB + * @arg DMC_MEMORY_SIZE_256KB: Memory size is 256KB + * @arg DMC_MEMORY_SIZE_512KB: Memory size is 512KB + * @arg DMC_MEMORY_SIZE_1MB: Memory size is 1MB + * @arg DMC_MEMORY_SIZE_2MB: Memory size is 2MB + * @arg DMC_MEMORY_SIZE_4MB: Memory size is 4MB + * @arg DMC_MEMORY_SIZE_8MB: Memory size is 8MB + * @arg DMC_MEMORY_SIZE_16MB: Memory size is 16MB + * @arg DMC_MEMORY_SIZE_32MB: Memory size is 32MB + * @arg DMC_MEMORY_SIZE_64MB: Memory size is 64MB + * @arg DMC_MEMORY_SIZE_128MB: Memory size is 128MB + * @arg DMC_MEMORY_SIZE_256MB: Memory size is 256MB + * + * @retval None + */ +void DMC_ConfigMemorySize(DMC_MEMORY_SIZE_T memorySize) +{ + DMC->MASK_B.MSIZESEL = memorySize; +} + +/*! + * @brief Enable DMC controler + * + * @param None + * + * @retval None + */ +void DMC_Enable(void) +{ + DMC->SW_B.MCSW = 1; +} + +/*! + * @brief Disable DMC controler + * + * @param None + * + * @retval None + */ +void DMC_Disable(void) +{ + DMC->SW_B.MCSW = 0; +} + +/*! + * @brief Set DMC clock phase + * + * @param clkPhase: Specifies clock phase + * The parameter can be one of following values: + * @arg DMC_CLK_PHASE_NORMAL: Clock phase is normal + * @arg DMC_CLK_PHASE_REVERSE: Clock phase is reverse + * + * @retval None + * + */ +void DMC_ConfigClockPhase(DMC_CLK_PHASE_T clkPhase) +{ + DMC->CTRL2_B.CPHACFG = clkPhase; +} + +/*! + * @brief Set DMC WRAP burst + * + * @param burst: WRAP burst Type Selection + * The parameter can be one of following values: + * @arg DMC_WRAPB_4: wrap4 burst transfer + * @arg DMC_WRAPB_8: wrap8 burst transfer + * + * @retval None + */ +void DMC_ConfigWRAPB(DMC_WRPB_T burst) +{ + DMC->CTRL2_B.WRPBSEL = burst; +} + + +/**@} end of group DMC_Functions */ +/**@} end of group DMC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver*/ + diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_eint.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_eint.c new file mode 100644 index 0000000000..d4ce3d13b2 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_eint.c @@ -0,0 +1,205 @@ +/*! + * @file apm32e10x_eint.c + * + * @brief This file provides all the EINT firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_eint.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup EINT_Driver + * @brief EINT driver modules + @{ +*/ + +/** @defgroup EINT_Functions + @{ +*/ + +/*! + * @brief Reset the EINT peripheral registers to their default reset values. + * + * @param None + * + * @retval None + */ +void EINT_Reset(void) +{ + EINT->IMASK = 0x00000000; + EINT->EMASK = 0x00000000; + EINT->RTEN = 0x00000000; + EINT->FTEN = 0x00000000; + EINT->IPEND = 0x000FFFFF; +} + +/*! + * @brief Configure the EINT + * + * @param eintConfig: pointer to a EINT_Config_T structure. + * + * @retval None + */ +void EINT_Config(EINT_Config_T* eintConfig) +{ + uint32_t temp = 0; + temp = (uint32_t)EINT_BASE; + + if(eintConfig->lineCmd != DISABLE) + { + EINT->IMASK &= ~eintConfig->line; + EINT->EMASK &= ~eintConfig->line; + + temp += eintConfig->mode; + *(__IOM uint32_t *) temp |= eintConfig->line; + + EINT->RTEN &= ~eintConfig->line; + EINT->FTEN &= ~eintConfig->line; + + if (eintConfig->trigger == EINT_TRIGGER_RISING_FALLING) + { + EINT->RTEN |= eintConfig->line; + EINT->FTEN |= eintConfig->line; + } + else + { + temp = (uint32_t)EINT_BASE; + temp += eintConfig->trigger; + + *(__IOM uint32_t *) temp |= eintConfig->line; + } + } + else + { + temp += eintConfig->mode; + + *(__IOM uint32_t *) temp &= ~eintConfig->line; + } +} +/*! + * @brief Fills each EINT_Config_T member with its reset value. + * + * @param eintConfig: pointer to a EINT_Config_T structure + * + * @retval None + */ +void EINT_ConfigStructInit(EINT_Config_T* eintConfig) +{ + eintConfig->line = EINT_LINENONE; + eintConfig->mode = EINT_MODE_INTERRUPT; + eintConfig->trigger = EINT_TRIGGER_FALLING; + eintConfig->lineCmd = DISABLE; +} + +/*! + * @brief Select Software interrupt on EINT line + * + * @param line: specifies the EINT lines. + * This parameter can be any combination of EINT_LINE_T(can be from 0 to 18) + * + * @retval None + */ +void EINT_SelectSWInterrupt(uint32_t line) +{ + EINT->SWINTE |= line; +} + +/*! + * @brief Read the specified EINT_Line flag + * + * @param line: Select the EINT_Line. + * This parameter can be one of EINT_LINE_T(can be from 0 to 18) + * + * @retval status: The new state of flag (SET or RESET) + */ +uint8_t EINT_ReadStatusFlag(EINT_LINE_T line) +{ + uint8_t status = RESET; + + if((EINT->IPEND & line) != (uint32_t)RESET) + { + status = SET; + } + else + { + status = RESET; + } + return status; +} + +/*! + * @brief Clears the EINT_Line pending bits + * + * @param line: Select the EINT_Line. + * This parameter can be any combination of EINT_LINE_T(can be from 0 to 18) + * + * @retval None + */ +void EINT_ClearStatusFlag(uint32_t line) +{ + EINT->IPEND = line; +} + +/*! + * @brief Read the specified EINT_Line Interrupt Flag. + * + * @param line: Select the EINT_Line. + * This parameter can be one of EINT_LINE_T(can be from 0 to 18) + * + * @retval None + */ +uint8_t EINT_ReadIntFlag(EINT_LINE_T line) +{ + uint8_t status = RESET; + uint32_t enablestatus = 0; + + enablestatus = EINT->IMASK & line; + + if((EINT->IPEND & line) != ((uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + { + status = SET; + } + else + { + status = RESET; + } + return status; +} + +/*! + * @brief Clears the EINT_Line pending bits + * + * @param line: Select the EINT_Line + * This parameter can be any combination of EINT_LINE_T(can be from 0 to 18) + * + * @retval None + */ +void EINT_ClearIntFlag(uint32_t line) +{ + EINT->IPEND = line; +} + +/**@} end of group EINT_Functions */ +/**@} end of group EINT_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_fmc.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_fmc.c new file mode 100644 index 0000000000..6f1e6c0d4b --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_fmc.c @@ -0,0 +1,769 @@ +/*! + * @file apm32e10x_fmc.c + * + * @brief This file provides all the FMC firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_fmc.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup FMC_Driver + * @brief FMC driver modules + @{ +*/ + +/** @defgroup FMC_Functions Functions + @{ +*/ + +/*! + * @brief Configs the code latency value. + * + * @param latency: the FMC Latency value. + * + * @retval None + */ +void FMC_ConfigLatency(FMC_LATENCY_T latency) +{ + FMC->CTRL1_B.WS = latency; +} + +/*! + * @brief Enables the Half cycle flash access. + * + * @param None + * + * @retval None + */ +void FMC_EnableHalfCycleAccess(void) +{ + FMC->CTRL1_B.HCAEN = BIT_SET; +} + +/*! + * @brief Disable the Half cycle flash access. + * + * @param None + * + * @retval None + */ +void FMC_DisableHalfCycleAccess(void) +{ + FMC->CTRL1_B.HCAEN = BIT_RESET; +} + +/*! + * @brief Enables the Prefetch Buffer. + * + * @param None + * + * @retval None + */ +void FMC_EnablePrefetchBuffer(void) +{ + FMC->CTRL1_B.PBEN = ENABLE; +} + +/*! + * @brief Disables the Prefetch Buffer. + * + * @param None + * + * @retval None + */ +void FMC_DisablePrefetchBuffer(void) +{ + FMC->CTRL1_B.PBEN = DISABLE; +} + +/*! + * @brief Unlocks the FMC Program Erase Controller + * + * @param None + * + * @retval None + */ +void FMC_Unlock(void) +{ + FMC->KEY = 0x45670123; + FMC->KEY = 0xCDEF89AB; +} + +/*! + * @brief Locks the FMC Program Erase Controller. + * + * @param None + * + * @retval None + */ +void FMC_Lock(void) +{ + FMC->CTRL2_B.LOCK = BIT_SET; +} + +/*! + * @brief Erases a specified FMC page. + * + * @param pageAddr: The page address to be erased. + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_BUSY + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + if(status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.PAGEERA = BIT_SET; + FMC->ADDR = pageAddr; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + FMC->CTRL2_B.PAGEERA = BIT_RESET; + } + return status; +} + +/*! + * @brief Erases all FMC pages. + * + * @param None + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_EraseAllPage(void) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + if(status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.MASSERA = BIT_SET; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + FMC->CTRL2_B.MASSERA = BIT_RESET; + } + return status; +} + +/*! + * @brief Erases the FMC option bytes. + * + * @param None + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_EraseOptionBytes(void) +{ + uint16_t rdtemp = 0x00A5; + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + if(FMC_GetReadProtectionStatus() != RESET) + { + rdtemp = 0x00; + } + status = FMC_WaitForLastOperation(0x000B0000); + if(status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + + FMC->CTRL2_B.OBE = BIT_SET; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.OBE = BIT_RESET; + FMC->CTRL2_B.OBP = BIT_SET; + OB->RDP = rdtemp; + status = FMC_WaitForLastOperation(0x000B0000); + if(status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + else if(status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Programs a word at a specified address. + * + * @param address:the address to be programmed. + * + * @param data: the data to be programmed. + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + __IOM uint32_t temp = 0; + + + __set_PRIMASK(1); + + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.PG = BIT_SET; + + *(__IOM uint16_t *)address = data; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + temp = address + 2; + + *(__IOM uint16_t*) temp = data >> 16; + + status = FMC_WaitForLastOperation(0x000B0000); + FMC->CTRL2_B.PG = BIT_RESET; + } + else + { + FMC->CTRL2_B.PG = BIT_RESET; + } + } + + + __set_PRIMASK(0); + + + return status; +} + +/*! + * @brief Programs a half word at a specified address. + * + * @param address:the address to be programmed. + * + * @param data: the data to be programmed. + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + + __set_PRIMASK(1); + + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.PG = BIT_SET; + *(__IOM uint16_t *)address = data; + status = FMC_WaitForLastOperation(0x000B0000); + FMC->CTRL2_B.PG = BIT_RESET; + } + + + __set_PRIMASK(0); + + + return status; +} + +/*! + * @brief Programs a half word at a specified Option Byte Data address. + * + * @param address:the address to be programmed. + * + * @param data: the data to be programmed. + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + + FMC->CTRL2_B.OBP = BIT_SET; + *(__IOM uint16_t *)address = data; + status = FMC_WaitForLastOperation(0x000B0000); + if(status == FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Write protects the desired pages + * + * @param page:the address of the pages to be write protection + * This parameter can be any combination of the following values: + * for APM32E10X_LD : + * @arg FLASH_WRP_PAGE_0_3 to FLASH_WRP_PAGE_28_31 + * for APM32E10X_MD : + * @arg FLASH_WRP_PAGE_0_3 to FLASH_WRP_PAGE_124_127 + * for APM32E10X_HD : + * @arg FLASH_WRP_PAGE_0_1 to FLASH_WRP_PAGE_60_61 or FLASH_WRP_PAGE_62_127 + * @arg FMC_WRP_PAGE_ALL + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_EnableWriteProtection(uint32_t page) +{ + uint16_t WPP0_Data = 0xFFFF, WPP1_Data = 0xFFFF, WPP2_Data = 0xFFFF, WPP3_Data = 0xFFFF; + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + page = ~page; + WPP0_Data = (page & 0x000000FF); + WPP1_Data = (page & 0x0000FF00) >> 8; + WPP2_Data = (page & 0x00FF0000) >> 16; + WPP3_Data = (page & 0xFF000000) >> 24; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + FMC->CTRL2_B.OBP = BIT_SET; + + if(WPP0_Data != 0xFF) + { + OB->WRP0 = WPP0_Data; + status = FMC_WaitForLastOperation(0x000B0000); + } + if((status == FMC_STATUS_COMPLETE) && (WPP1_Data != 0xFF)) + { + OB->WRP1 = WPP1_Data; + status = FMC_WaitForLastOperation(0x000B0000); + } + if((status == FMC_STATUS_COMPLETE) && (WPP2_Data != 0xFF)) + { + OB->WRP2 = WPP2_Data; + status = FMC_WaitForLastOperation(0x000B0000); + } + if((status == FMC_STATUS_COMPLETE) && (WPP3_Data != 0xFF)) + { + OB->WRP3 = WPP3_Data; + status = FMC_WaitForLastOperation(0x000B0000); + } + + if(status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Enables the read out protection. + * + * @param None + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_EnableReadOutProtection(void) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + + FMC->CTRL2_B.OBE = BIT_SET; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.OBE = BIT_RESET; + FMC->CTRL2_B.OBP = BIT_SET; + OB->RDP = 0x00; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + else if(status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBE = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Disables the read out protection. + * + * @param None + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_DisableReadOutProtection(void) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + FMC->CTRL2_B.OBE = BIT_SET; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.OBE = BIT_RESET; + FMC->CTRL2_B.OBP = BIT_SET; + OB->RDP = 0x00A5; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + else if(status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBE = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Programs the FMC User Option Byte. + * + * @param userConfig: Point to a FMC_UserConfig_T structure. + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + + status = FMC_WaitForLastOperation(0x000B0000); + + if(status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.OBP = BIT_SET; + OB->USER = (uint32_t)userConfig->iwdtSet | \ + (uint32_t)userConfig->stopSet | \ + (uint32_t)userConfig->stdbySet | 0xF8; + status = FMC_WaitForLastOperation(0x000B0000); + if(status == FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Read the FMC User Option Bytes values. + * + * @param None + * + * @retval Returns User Option Bytes values + */ +uint32_t FMC_ReadUserOptionByte(void) +{ + return (FMC->OBCS_B.UOB >> 2); +} + +/*! + * @brief Read the FMC Write Protection Option Bytes Register value. + * + * @param None + * + * @retval Returns the value of Option Bytes Write Protection Register. + */ +uint32_t FMC_ReadOptionByteWriteProtection(void) +{ + return FMC->WRTPROT; +} + +/*! + * @brief Get the FMC Read Out Protection Status is set or not. + * + * @param None + * + * @retval status : set or reset. + */ +uint8_t FMC_GetReadProtectionStatus(void) +{ + uint8_t flagstatus = RESET; + + if(FMC->OBCS_B.READPROT != RESET) + { + flagstatus = SET; + } + else + { + flagstatus = RESET; + } + return flagstatus; +} + +/*! + * @brief FMC Prefetch Buffer status is set or not. + * + * @param None + * + * @retval status : set or reset. + */ +uint8_t FMC_ReadPrefetchBufferStatus(void) +{ + return FMC->CTRL1_B.PBSF; +} + +/*! + * @brief Enables the specified FMC interrupts. + * + * @param interrupt: Select the FMC interrupt sources + * This parameter can be one of the following values: + * @arg FMC_INT_ERR : Error Interrupt + * @arg FMC_INT_OC : Operation Complete Interrupt + * + * @retval None + */ +void FMC_EnableInterrupt(FMC_INT_T interrupt) +{ + if(interrupt == FMC_INT_ERR) + { + FMC->CTRL2_B.ERRIE = ENABLE; + } + else + { + FMC->CTRL2_B.OCIE = ENABLE; + } +} + +/*! + * @brief Disable the specified FMC interrupts. + * + * @param interrupt: Select the FMC interrupt sources + * This parameter can be one of the following values: + * @arg FMC_INT_ERR : Error Interrupt + * @arg FMC_INT_OC : Operation Complete Interrupt + * + * @retval None + */ +void FMC_DisableInterrupt(FMC_INT_T interrupt) +{ + if(interrupt == FMC_INT_ERR) + { + FMC->CTRL2_B.ERRIE = DISABLE; + } + else + { + FMC->CTRL2_B.OCIE = DISABLE; + } +} + +/*! + * @brief Read FMC flag is set or not + * + * @param flag: status flag of FMC + * This parameter can be one of the following values: + * @arg FMC_FLAG_BUSY : FMC Busy flag + * @arg FMC_FLAG_OC : FMC Operation Complete flag + * @arg FMC_FLAG_PE : FMC Program error flag + * @arg FMC_FLAG_WPE : FMC Write protected error flag + * @arg FMC_FLAG_OBE : FMC Option Byte error flag + * + * @retval flag status : set or reset + */ +uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag) +{ + if(flag == FMC_FLAG_OBE) + { + return FMC->OBCS_B.OBE; + } + else if((FMC->STS & flag ) != RESET) + { + return SET; + } + return RESET; +} + +/*! + * @brief Clears the FMC's flag. + * + * @param flag: status flag of FMC + * This parameter can be any combination of the following values: + * @arg FMC_FLAG_OC : FMC Operation Complete flag + * @arg FMC_FLAG_PE : FMC Program error flag + * @arg FMC_FLAG_WPE : FMC Write protected error flag + * + * @retval None + * + */ +void FMC_ClearStatusFlag(uint32_t flag) +{ + FMC->STS = flag; +} + +/*! + * @brief Read the FMC Status. + * + * @param None + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_BUSY + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + */ +FMC_STATUS_T FMC_ReadStatus(void) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + if(FMC->STS_B.BUSYF == BIT_SET) + { + status = FMC_STATUS_BUSY; + } + else if(FMC->STS_B.PEF == BIT_SET) + { + status = FMC_STATUS_ERROR_PG; + } + else if(FMC->STS_B.WPEF == BIT_SET) + { + status = FMC_STATUS_ERROR_WRP; + } + else + { + status = FMC_STATUS_COMPLETE; + } + return status; +} + +/*! + * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. + * + * @param timeOut:FMC programming timeout value. + * + * @retval Returns the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_WaitForLastOperation(uint32_t timeOut) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + /** Check for the Flash Status */ + status = FMC_ReadStatus(); + + /** Wait for a Flash operation to complete or a TIMEOUT to occur */ + while((status == FMC_STATUS_BUSY) && (timeOut !=0)) + { + status = FMC_ReadStatus(); + timeOut--; + } + if(timeOut == 0x00) + { + status = FMC_STATUS_TIMEOUT; + } + return status; +} + +/**@} end of group FMC_Functions */ +/**@} end of group FMC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_gpio.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_gpio.c new file mode 100644 index 0000000000..19be69dd8e --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_gpio.c @@ -0,0 +1,546 @@ +/*! + * @file apm32e10x_gpio.c + * + * @brief This file provides all the GPIO firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_gpio.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup GPIO_Driver + * @brief GPIO driver modules + @{ +*/ + +/** @defgroup GPIO_Functions + @{ +*/ + +/*! + * @brief Reset GPIO peripheral registers to their default reset values + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @retval None + */ +void GPIO_Reset(GPIO_T* port) +{ + RCM_APB2_PERIPH_T APB2Periph; + + if (port == GPIOA) + { + APB2Periph = RCM_APB2_PERIPH_GPIOA; + } + else if (port == GPIOB) + { + APB2Periph = RCM_APB2_PERIPH_GPIOB; + } + else if (port == GPIOC) + { + APB2Periph = RCM_APB2_PERIPH_GPIOC; + } + else if (port == GPIOD) + { + APB2Periph = RCM_APB2_PERIPH_GPIOD; + } + else if (port == GPIOE) + { + APB2Periph = RCM_APB2_PERIPH_GPIOE; + } + else if (port == GPIOF) + { + APB2Periph = RCM_APB2_PERIPH_GPIOF; + } + else if (port == GPIOG) + { + APB2Periph = RCM_APB2_PERIPH_GPIOG; + } + + RCM_EnableAPB2PeriphReset(APB2Periph); + RCM_DisableAPB2PeriphReset(APB2Periph); +} + +/*! + * @brief Reset Alternate Functions registers to their default reset values + * + * @param None + * + * @retval None + */ +void GPIO_AFIOReset(void) +{ + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_AFIO); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_AFIO); +} + +/*! + * @brief Config the GPIO peripheral according to the specified parameters in the gpioConfig + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @param gpioConfig: pointer to a GPIO_Config_T structure + * + * @retval None + */ +void GPIO_Config(GPIO_T* port, GPIO_Config_T* gpioConfig) +{ + uint8_t i; + uint32_t mode; + uint32_t CR; + uint32_t temp; + uint32_t shift; + + mode = gpioConfig->mode & 0x0f; + + if (gpioConfig->mode & 0x80) + { + mode |= gpioConfig->speed; + } + + if (gpioConfig->pin & 0xff) + { + CR = port->CFGLOW; + + for (i = 0, shift = 0x01; i < 8; i++, shift <<= 1) + { + if (gpioConfig->pin & shift) + { + temp = i << 2; + CR &= (uint32_t)~(0x0f << temp); + CR |= mode << temp; + + if (gpioConfig->mode == GPIO_MODE_IN_PD) + { + port->BC = shift; + } + else if (gpioConfig->mode == GPIO_MODE_IN_PU) + { + port->BSC = shift; + } + } + } + + port->CFGLOW = CR; + } + + if (gpioConfig->pin & 0xff00) + { + CR = port->CFGHIG; + + for (i = 8, shift = 0x100; i < 16; i++, shift <<= 1) + { + if (gpioConfig->pin & shift) + { + temp = (i - 8) << 2; + CR &= (uint32_t)~(0x0f << temp); + CR |= mode << temp; + + if (gpioConfig->mode == GPIO_MODE_IN_PD) + { + port->BC = shift; + } + else if (gpioConfig->mode == GPIO_MODE_IN_PU) + { + port->BSC = shift; + } + } + } + + port->CFGHIG = CR; + } +} + +/*! + * @brief Fills each gpioConfig member with its default value. + * + * @param gpioConfig : pointer to a GPIO_Config_T structure which will be initialized. + * + * @retval None + */ +void GPIO_ConfigStructInit(GPIO_Config_T* gpioConfig) +{ + gpioConfig->pin = GPIO_PIN_ALL; + gpioConfig->speed = GPIO_SPEED_2MHz; + gpioConfig->mode = GPIO_MODE_IN_FLOATING; +} + +/*! + * @brief Reads the specified input port pin + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @param pin : specifies pin to read. + * This parameter can be one of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval The input port pin value + */ +uint8_t GPIO_ReadInputBit(GPIO_T* port, uint16_t pin) +{ + uint8_t ret; + + ret = (port->IDATA & pin) ? BIT_SET : BIT_RESET; + + return ret; +} + +/*! + * @brief Reads the specified GPIO input data port + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @retval GPIO input data port value + */ +uint16_t GPIO_ReadInputPort(GPIO_T* port) +{ + return ((uint16_t)port->IDATA); +} + +/*! + * @brief Reads the specified output data port bit + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @param pin : specifies pin to read. + * This parameter can be one of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval The output port pin value + */ +uint8_t GPIO_ReadOutputBit(GPIO_T* port, uint16_t pin) +{ + + uint8_t ret; + + ret = (port->ODATA & pin) ? BIT_SET : BIT_RESET; + + return ret; +} + +/*! + * @brief Reads the specified GPIO output data port + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @retval output data port value + */ +uint16_t GPIO_ReadOutputPort(GPIO_T* port) +{ + return ((uint16_t)port->ODATA); +} + +/*! + * @brief Sets the selected data port bits + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @param pin : specifies pin to be written. + * This parameter can be any combination of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_SetBit(GPIO_T* port, uint16_t pin) +{ + port->BSC = (uint32_t)pin; +} + +/*! + * @brief Clears the selected data port bits + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @param pin : specifies pin to be cleared. + * This parameter can be any combination of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_ResetBit(GPIO_T* port, uint16_t pin) +{ + port->BC = (uint32_t)pin; +} + +/*! + * @brief Writes data to the specified GPIO data port bit + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @param pin : Select specifies pin. + * This parameter can be one of GPIO_PIN_x( x can be from 0 to 15). + * + * + * @param bitVal : specifies the value to be written to the port output data register + * This parameter can be one of the following values: + * @arg BIT_RESET: Reset the port pin + * @arg BIT_SET : Set the port pin + * + * @retval None + */ +void GPIO_WriteBitValue(GPIO_T* port, uint16_t pin, uint8_t bitVal) +{ + if (bitVal != BIT_RESET) + { + port->BSC = pin; + } + else + { + port->BC = pin ; + } +} + +/*! + * @brief Writes data to the specified GPIO data port + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @param portValue : specifies the value to be written to the port output data register. + * + * @retval None + */ +void GPIO_WriteOutputPort(GPIO_T* port, uint16_t portValue) +{ + port->ODATA = (uint32_t)portValue; +} + +/*! + * @brief Locks GPIO Pins configuration registers + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to G). + * + * @param pin : Select specifies pin. + * This parameter can be any combination of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_ConfigPinLock(GPIO_T* port, uint16_t pin) +{ + uint32_t val = 0x00010000; + + val |= pin; + /* Set LCKK bit */ + port->LOCK = val ; + /* Reset LCKK bit */ + port->LOCK = pin; + /* Set LCKK bit */ + port->LOCK = val; + /* Read LCKK bit*/ + val = port->LOCK; + /* Read LCKK bit*/ + val = port->LOCK; +} + +/*! + * @brief Selects the GPIO pin used as Event output + * + * @param portSource : selects the GPIO port to be used as source for Event output. + * This parameter can be one of GPIO_PORT_SOURCE_x( x can be from A to E). + * + * @param pinSource specifies the pin for the Event output + * This parameter can be GPIO_PIN_SOURCE_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_ConfigEventOutput(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource) +{ + AFIO->EVCTRL_B.PORTSEL = portSource; + AFIO->EVCTRL_B.PINSEL = pinSource; +} + +/*! + * @brief Enables the Event Output + * + * @param None + * + * @retval None + */ +void GPIO_EnableEventOutput(void) +{ + AFIO->EVCTRL_B.EVOEN = BIT_SET; +} + +/*! + * @brief Disable the Event Output + * + * @param None + * + * @retval None + */ +void GPIO_DisableEventOutput(void) +{ + AFIO->EVCTRL_B.EVOEN = BIT_RESET; +} + +/*! + * @brief Changes the mapping of the specified pin + * + * @param remap : selects the pin to remap + * This parameter can be one of the following values: + * @arg GPIO_NO_REMAP_SPI1 : No SPI1 Alternate Function mapping + * @arg GPIO_REMAP_SPI1 : SPI1 Alternate Function mapping + * @arg GPIO_NO_REMAP_I2C1 : No I2C1 Alternate Function mapping + * @arg GPIO_REMAP_I2C1 : I2C1 Alternate Function mapping + * @arg GPIO_NO_REMAP_USART1 : No USART1 Alternate Function mapping + * @arg GPIO_REMAP_USART1 : USART1 Alternate Function mapping + * @arg GPIO_NO_REMAP_USART2 : No USART2 Alternate Function mapping + * @arg GPIO_REMAP_USART2 : USART2 Alternate Function mapping + * @arg GPIO_NO_REMAP_USART3 : No USART3 Partial Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP_USART3 : USART3 Partial Alternate Function mapping + * @arg GPIO_FULL_REMAP_USART3 : USART3 Full Alternate Function mapping + * @arg GPIO_NO_REMAP_TMR1 : No TIM1 Partial Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP_TMR1 : TIM1 Partial Alternate Function mapping + * @arg GPIO_FULL_REMAP_TMR1 : TIM1 Full Alternate Function mapping + * @arg GPIO_NO_REMAP1_TMR2 : No TIM2 Partial1 Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP1_TMR2 : TIM2 Partial1 Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP2_TMR2 : TIM2 Partial2 Alternate Function mapping + * @arg GPIO_FULL_REMAP_TMR2 : TIM2 Full Alternate Function mapping + * @arg GPIO_NO_REMAP_TMR3 : No TIM3 Partial Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP_TMR3 : TIM3 Partial Alternate Function mapping + * @arg GPIO_FULL_REMAP_TMR3 : TIM3 Full Alternate Function mapping + * @arg GPIO_NO_REMAP_TMR4 : No TIM4 Alternate Function mapping + * @arg GPIO_REMAP_TMR4 : TIM4 Alternate Function mapping + * @arg GPIO_NO_REMAP_CAN1 : No CAN1 Alternate Function mapping + * @arg GPIO_REMAP1_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_REMAP2_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_NO_REMAP_PD01 : No PD01 Alternate Function mapping + * @arg GPIO_REMAP_PD01 : PD01 Alternate Function mapping + * @arg GPIO_NO_REMAP_TMR5CH4_LSI : No LSI connected to TIM5 Channel4 input capture for calibration + * @arg GPIO_REMAP_TMR5CH4_LSI : LSI connected to TIM5 Channel4 input capture for calibration + * @arg GPIO_NO_REMAP_ADC1_ETRGINJ : No ADC1 External Trigger Injected Conversion remapping + * @arg GPIO_REMAP_ADC1_ETRGINJ : ADC1 External Trigger Injected Conversion remapping + * @arg GPIO_NO_REMAP_ADC1_ETRGREG : No ADC1 External Trigger Regular Conversion remapping + * @arg GPIO_REMAP_ADC1_ETRGREG : ADC1 External Trigger Regular Conversion remapping + * @arg GPIO_NO_REMAP_ADC2_ETRGINJ : No ADC2 External Trigger Injected Conversion remapping + * @arg GPIO_REMAP_ADC2_ETRGINJ : ADC2 External Trigger Injected Conversion remapping + * @arg GPIO_NO_REMAP_ADC2_ETRGREG : No ADC2 External Trigger Regular Conversion remapping + * @arg GPIO_REMAP_ADC2_ETRGREG : ADC2 External Trigger Regular Conversion remapping + * @arg GPIO_NO_REMAP_CAN2 : No CAN2 Alternate Function mapping + * @arg GPIO_REMAP_CAN2 : CAN2 Alternate Function mapping + * @arg GPIO_NO_REMAP_SWJ : Full SWJ Enabled (JTAG-DP + SW-DP) + * @arg GPIO_REMAP_SWJ_NOJTRST : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST + * @arg GPIO_REMAP_SWJ_JTAGDISABLE : JTAG-DP Disabled and SW-DP Enabled + * @arg GPIO_REMAP_SWJ_DISABLE : Full SWJ Disabled (JTAG-DP + SW-DP) + * + * @retval When you use GPIO_REMAP_CAN2, you must put this function last of all other ConfigPinRemap Function. + */ +void GPIO_ConfigPinRemap(GPIO_REMAP_T remap) +{ + uint32_t val, mask, bitOffset, regOffset; + uint32_t regVal; + + val = remap & 0x0f; + mask = (remap >> 4) & 0x0f; + bitOffset = (remap >> 8) & 0xff; + regOffset = (remap >> 16) & 0x0f; + + if (regOffset) + { + regVal = AFIO->REMAP2; + } + else + { + regVal = AFIO->REMAP1; + } + + if(remap >> 8 == 0x18) + { + regVal &= 0xF0FFFFFF; + AFIO->REMAP1 &= 0xF0FFFFFF; + } + else + { + regVal |= 0x0F000000; + } + + mask <<= bitOffset; + regVal &= (uint32_t)~mask; + val <<= bitOffset; + regVal |= val; + + if (regOffset) + { + AFIO->REMAP2 = regVal; + } + else + { + AFIO->REMAP1 = regVal; + } +} + +/*! + * @brief Selects the GPIO pin used as EINT Line + * + * @param portSource : selects the GPIO port to be used as source for EINT line. + * This parameter can be one of GPIO_PORT_SOURCE_x( x can be from A to G). + * + * @param pinSource : Specifies the EINT line to be configured. + * This parameter can be GPIO_PIN_SOURCE_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_ConfigEINTLine(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource) +{ + uint32_t shift; + + if (pinSource <= GPIO_PIN_SOURCE_3) + { + shift = pinSource << 2; + AFIO->EINTSEL1 &= (uint32_t )~(0x0f << shift); + AFIO->EINTSEL1 |= portSource << shift; + } + + else if (pinSource <= GPIO_PIN_SOURCE_7) + { + shift = (pinSource - GPIO_PIN_SOURCE_4) << 2; + AFIO->EINTSEL2 &= (uint32_t )~(0x0f << shift); + AFIO->EINTSEL2 |= portSource << shift; + } + + else if (pinSource <= GPIO_PIN_SOURCE_11) + { + shift = (pinSource - GPIO_PIN_SOURCE_8) << 2; + AFIO->EINTSEL3 &= (uint32_t )~(0x0f << shift); + AFIO->EINTSEL3 |= portSource << shift; + } + + else if (pinSource <= GPIO_PIN_SOURCE_15) + { + shift = (pinSource - GPIO_PIN_SOURCE_12) << 2; + AFIO->EINTSEL4 &= (uint32_t )~(0x0f << shift); + AFIO->EINTSEL4 |= portSource << shift; + } +} + +/**@} end of group GPIO_Functions */ +/**@} end of group GPIO_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_i2c.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_i2c.c new file mode 100644 index 0000000000..c2de8fd357 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_i2c.c @@ -0,0 +1,1026 @@ +/*! + * @file apm32e10x_i2c.c + * + * @brief This file provides all the I2C firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_i2c.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup I2C_Driver + * @brief I2C driver modules + @{ +*/ + +/** @defgroup I2C_Functions Functions + @{ +*/ + +/*! + * @brief Reset I2C + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_Reset(I2C_T* i2c) +{ + if(i2c == I2C1) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); + } + else + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_I2C2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_I2C2); + } +} + +/*! + * @brief Configure I2C by configuring the structure + * + * @param i2c: I2C selet 1 or 2 + * + * @param i2cConfig: pointer to a I2C_Config_T structure + * + * @retval None + */ +void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig) +{ + uint16_t tmpreg = 0, freqrange = 0; + uint32_t PCLK1 = 8000000, PCLK2 = 0; + uint16_t result = 0x04; + + i2c->I2C_SWITCH = 0; + + /* I2C CTRL2 Configuration */ + RCM_ReadPCLKFreq(&PCLK1, &PCLK2); + freqrange = PCLK1 / 1000000; + i2c->CTRL2_B.CLKFCFG= freqrange; + + /* I2C CLKCTRL Configuration */ + i2c->CTRL1_B.I2CEN = BIT_RESET; + + if(i2cConfig->clockSpeed <= 100000) + { + result = (PCLK1 / (i2cConfig->clockSpeed << 1)); + if(result < 0x04) + { + result = 0x04; + } + i2c->RISETMAX = freqrange + 1; + tmpreg |= result; + } + /* Configure speed in fast mode */ + else + { + if(i2cConfig->dutyCycle == I2C_DUTYCYCLE_2) + { + result = (PCLK1 / (i2cConfig->clockSpeed * 3)); + } + else + { + result = (PCLK1 / (i2cConfig->clockSpeed * 25)); + result |= I2C_DUTYCYCLE_16_9; + } + + if((result & 0x0FFF) == 0) + { + result |= 0x0001; + } + + tmpreg |= (uint16_t)(result | 0x8000); + i2c->RISETMAX = ((((freqrange) * 300) / 1000) + 1); + } + i2c->CLKCTRL = tmpreg; + i2c->CTRL1_B.I2CEN = BIT_SET; + + /* i2c CTRL1 Configuration */ + i2c->CTRL1_B.ACKEN = BIT_RESET; + i2c->CTRL1_B.SMBTCFG = BIT_RESET; + i2c->CTRL1_B.SMBEN = BIT_RESET; + + i2c->CTRL1 |= i2cConfig->mode; + i2c->CTRL1_B.ACKEN = i2cConfig->ack; + + i2c->SADDR1 = i2cConfig->ackAddress | i2cConfig->ownAddress1; +} + +/*! + * @brief Fills each I2C_InitStruct member with its default value. + * + * @param i2cConfig: pointer to a I2C_Config_T structure + * + * @retval None + */ +void I2C_ConfigStructInit(I2C_Config_T* i2cConfig) +{ + i2cConfig->clockSpeed = 5000; + i2cConfig->mode = I2C_MODE_I2C; + i2cConfig->dutyCycle = I2C_DUTYCYCLE_2; + i2cConfig->ownAddress1 = 0; + i2cConfig->ack = I2C_ACK_DISABLE; + i2cConfig->ackAddress = I2C_ACK_ADDRESS_7BIT; +} + +/*! + * @brief Enable I2C + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_Enable(I2C_T* i2c) +{ + i2c->CTRL1_B.I2CEN = ENABLE; +} + +/*! + * @brief Disable I2C + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_Disable(I2C_T* i2c) +{ + i2c->CTRL1_B.I2CEN = DISABLE; +} + +/*! + * @brief Enable Generates i2c communication START condition. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableGenerateStart(I2C_T* i2c) +{ + i2c->CTRL1_B.START = BIT_SET; +} + +/*! + * @brief Disable Generates i2c communication START condition. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableGenerateStart(I2C_T* i2c) +{ + i2c->CTRL1_B.START = BIT_RESET; +} + +/*! + * @brief Enable Generates i2c communication STOP condition. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableGenerateStop(I2C_T* i2c) +{ + i2c->CTRL1_B.STOP = BIT_SET; +} + +/*! + * @brief Disable Generates i2c communication STOP condition. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableGenerateStop(I2C_T* i2c) +{ + i2c->CTRL1_B.STOP = BIT_RESET; +} + +/*! + * @brief Enables the specified I2C acknowledge feature. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableAcknowledge(I2C_T* i2c) +{ + i2c->CTRL1_B.ACKEN = ENABLE; +} + +/*! + * @brief Disables the specified I2C acknowledge feature. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableAcknowledge(I2C_T* i2c) +{ + i2c->CTRL1_B.ACKEN = DISABLE; +} + +/*! + * @brief Config the specified I2C own address2. + * + * @param i2c: I2C selet 1 or 2 + * + * @param address:specifies the 7bit I2C own address2. + * + * @retval None + */ +void I2C_ConfigOwnAddress2(I2C_T* i2c, uint8_t address) +{ + i2c->SADDR2_B.ADDR2 = address; +} + +/*! + * @brief Enables the specified I2C dual addressing mode. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableDualAddress(I2C_T* i2c) +{ + i2c->SADDR2_B.ADDRNUM = ENABLE; +} + +/*! + * @brief Disables the specified I2C dual addressing mode. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableDualAddress(I2C_T* i2c) +{ + i2c->SADDR2_B.ADDRNUM = DISABLE; +} + +/*! + * @brief Enables the specified I2C general call feature. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableGeneralCall(I2C_T* i2c) +{ + i2c->CTRL1_B.SRBEN = ENABLE; +} + +/*! + * @brief Disables the specified I2C general call feature. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableGeneralCall(I2C_T* i2c) +{ + i2c->CTRL1_B.SRBEN = DISABLE; +} + +/*! + * @brief Send one byte + * + * @param i2c: I2C selet 1 or 2 + * + * @param data: data to send + * + * @retval None + */ +void I2C_TxData(I2C_T* i2c, uint8_t data) +{ + i2c->DATA_B.DATA = data; +} + +/*! + * @brief Returns the recevie data + * + * @param i2c: I2C selet 1 or 2 + * + * @retval received data + */ +uint8_t I2C_RxData(I2C_T* i2c) +{ + return i2c->DATA_B.DATA; +} + +/*! + * @brief Transmits the address byte to select the slave device. + * + * @param i2c: I2C selet 1 or 2 + * + * @param address: slave address which will be transmitted + * + * @param direction: Direction mode + * The parameter can be one of following values: + * @arg I2C_DIRECTION_TX: Transmitter mode + * @arg I2C_DIRECTION_RX: Receiver mode + * @retval None + */ +void I2C_Tx7BitAddress(I2C_T* i2c, uint8_t address, I2C_DIRECTION_T direction) +{ + if(direction != I2C_DIRECTION_TX) + { + i2c->DATA_B.DATA = address | 0x0001; + } + else + { + i2c->DATA_B.DATA = address & 0xFFFE; + } +} + +/*! + * @brief Reads the I2C register and returns its value. + * + * @param i2c: I2C selet 1 or 2 + * + * @param i2cRegister : register to read + * The parameter can be one of following values: + * @arg I2C_REGISTER_CTRL1: CTRL1 register + * @arg I2C_REGISTER_CTRL2: CTRL2 register + * @arg I2C_REGISTER_SADDR1: SADDR1 register + * @arg I2C_REGISTER_SADDR2: SADDR2 register + * @arg I2C_REGISTER_DATA: DATA register + * @arg I2C_REGISTER_STS1: STS1 register + * @arg I2C_REGISTER_STS2: STS2 register + * @arg I2C_REGISTER_CLKCTRL: CLKCTRL register + * @arg I2C_REGISTER_RISETMAX: RISETMAX register + * @arg I2C_REGISTER_SWITCH: SWITCH register + * + * @retval The value of the read register + */ +uint16_t I2C_ReadRegister(I2C_T* i2c, I2C_REGISTER_T i2cRegister) +{ + switch (i2cRegister) + { + case I2C_REGISTER_CTRL1: + return i2c->CTRL1; + case I2C_REGISTER_CTRL2: + return i2c->CTRL2; + case I2C_REGISTER_SADDR1: + return i2c->SADDR1; + case I2C_REGISTER_SADDR2: + return i2c->SADDR2; + case I2C_REGISTER_DATA: + return i2c->DATA; + case I2C_REGISTER_STS1: + return i2c->STS1; + case I2C_REGISTER_STS2: + return i2c->STS2; + case I2C_REGISTER_CLKCTRL: + return i2c->CLKCTRL; + case I2C_REGISTER_RISETMAX: + return i2c->RISETMAX; + case I2C_REGISTER_SWITCH: + return i2c->I2C_SWITCH; + default: + return 0; + } +} + +/*! + * @brief Enables the I2C software reset. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableSoftwareReset(I2C_T* i2c) +{ + i2c->CTRL1_B.SWRST = ENABLE; +} + +/*! + * @brief Disables the I2C software reset. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableSoftwareReset(I2C_T* i2c) +{ + i2c->CTRL1_B.SWRST = DISABLE; +} + +/*! + * @brief Selects the specified I2C NACK position in master receiver mode. + * + * @param i2c: I2C selet 1 or 2 + * + * @param NACKPosition: specifies the NACK position. + * + * @retval None + */ +void I2C_ConfigNACKPosition(I2C_T* i2c, I2C_NACK_POSITION_T NACKPosition) +{ + if(NACKPosition == I2C_NACK_POSITION_NEXT) + { + i2c->CTRL1_B.ACKPOS = BIT_SET; + } + else + { + i2c->CTRL1_B.ACKPOS = BIT_RESET; + } +} + +/*! + * @brief Control the height of pin of SMBusAlert + * + * @param i2c: I2C selet 1 or 2 + * + * @param SMBusState: SMBAlert pin level. + * The parameter can be one of following values: + * @arg I2C_SMBUSALER_LOW: SMBus Alert pin low + * @arg I2C_SMBUSALER_HIGH: SMBus Alert pin high + * @retval None + */ +void I2C_ConfigSMBusAlert(I2C_T* i2c, I2C_SMBUSALER_T SMBusState) +{ + if(SMBusState == I2C_SMBUSALER_LOW) + { + i2c->CTRL1_B.ALERTEN = BIT_SET; + } + else + { + i2c->CTRL1_B.ALERTEN = BIT_RESET; + } +} + +/*! + * @brief Enables the I2C PEC transfer. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnablePECTransmit(I2C_T* i2c) +{ + i2c->CTRL1_B.PEC = BIT_SET; +} + +/*! + * @brief Disables the I2C PEC transfer. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisablePECTransmit(I2C_T* i2c) +{ + i2c->CTRL1_B.PEC = BIT_RESET; +} + +/*! + * @brief Selects the I2C PEC position. + * + * @param i2c: I2C selet 1 or 2 + * + * @param PECPosition: PEC position + * The parameter can be one of following values: + * @arg I2C_PEC_POSITION_NEXT: indicates that the next byte is PEC + * @arg I2C_PEC_POSITION_CURRENT: indicates that current byte is PEC + * @retval None + */ +void I2C_ConfigPECPosition(I2C_T* i2c, I2C_PEC_POSITION_T PECPosition) +{ + if(PECPosition == I2C_PEC_POSITION_NEXT) + { + i2c->CTRL1_B.ACKPOS = BIT_SET; + } + else + { + i2c->CTRL1_B.ACKPOS = BIT_RESET; + } +} + +/*! + * @brief Enables the PEC value calculation of the transferred bytes. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnablePEC(I2C_T* i2c) +{ + i2c->CTRL1_B.PECEN = BIT_SET; +} + +/*! + * @brief Disables the PEC value calculation of the transferred bytes. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisablePEC(I2C_T* i2c) +{ + i2c->CTRL1_B.PECEN = BIT_RESET; +} + +/*! + * @brief Read the PEC value for the I2C. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval value of PEC + */ +uint8_t I2C_ReadPEC(I2C_T* i2c) +{ + return i2c->STS2_B.PECVALUE; +} + +/*! + * @brief Enables the I2C ARP. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableARP(I2C_T* i2c) +{ + i2c->CTRL1_B.ARPEN = BIT_SET; +} + +/*! +* @brief Disables the I2C ARP. +* +* @param i2c: I2C selet 1 or 2 +* +* @retval None +*/ +void I2C_DisableARP(I2C_T* i2c) +{ + i2c->CTRL1_B.ARPEN = BIT_RESET; +} + +/*! + * @brief Enables the I2C Clock stretching. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableStretchClock(I2C_T* i2c) +{ + i2c->CTRL1_B.CLKSTRETCHD = BIT_RESET; +} + +/*! + * @brief Disables the I2C Clock stretching. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableStretchClock(I2C_T* i2c) +{ + i2c->CTRL1_B.CLKSTRETCHD = BIT_SET; +} + +/*! + * @brief Selects the specified I2C fast mode duty cycle. + * + * @param i2c: I2C selet 1 or 2 + * + * @param dutyCycle: the fast mode duty cycle. + * The parameter can be one of following values: + * @arg I2C_DUTYCYCLE_16_9: I2C fast mode Tlow/Thigh = 16/9 + * @arg I2C_DUTYCYCLE_2: I2C fast mode Tlow/Thigh = 2 + * @retval None + */ +void I2C_ConfigFastModeDutyCycle(I2C_T* i2c, I2C_DUTYCYCLE_T dutyCycle) +{ + if(dutyCycle == I2C_DUTYCYCLE_16_9) + { + i2c->CLKCTRL_B.FDUTYCFG = BIT_SET; + } + else + { + i2c->CLKCTRL_B.FDUTYCFG = BIT_RESET; + } +} + +/*! + * @brief Enables the specified I2C DMA requests. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableDMA(I2C_T* i2c) +{ + i2c->CTRL2_B.DMAEN = ENABLE; +} + +/*! + * @brief Disable the specified I2C DMA requests. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableDMA(I2C_T* i2c) +{ + i2c->CTRL2_B.DMAEN = DISABLE; +} + +/*! + * @brief Enable DMA to receive the last transfer + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableDMALastTransfer(I2C_T* i2c) +{ + i2c->CTRL2_B.LTCFG = BIT_SET; +} + +/*! + * @brief Disable DMA to receive the last transfer + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableDMALastTransfer(I2C_T* i2c) +{ + i2c->CTRL2_B.LTCFG = BIT_RESET; +} + +/*! + * @brief Enables the specified I2C interrupts. + * + * @param i2c: I2C selet 1 or 2 + * + * @param interrupt:I2C interrupts sources + * The parameter can be any combination of following values: + * @arg I2C_INT_BUF: Buffer interrupt + * @arg I2C_INT_EVT: Event interrupt + * @arg I2C_INT_ERR: Error interrupt + * + * @retval None + */ +void I2C_EnableInterrupt(I2C_T* i2c, uint16_t interrupt) +{ + i2c->CTRL2 |= interrupt; +} + +/*! + * @brief Disable the specified I2C interrupts. + * + * @param i2c: I2C selet 1 or 2 + * + * @param interrupt:I2C interrupts sources + * The parameter can be any combination of following values: + * @arg I2C_INT_BUF: Buffer interrupt + * @arg I2C_INT_EVT: Event interrupt + * @arg I2C_INT_ERR: Error interrupt + * + * @retval None + */ +void I2C_DisableInterrupt(I2C_T* i2c, uint16_t interrupt) +{ + i2c->CTRL2 &= ~interrupt; +} + +/*! + * @brief Check that the last event is equal to the last passed event + * + * @param i2c: I2C selet 1 or 2 + * + * @param i2cEvent: the event to be checked. + * The parameter can be one of the following values: + * @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2 + * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3 + * @arg I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2 + * @arg I2C_EVENT_SLAVE_STOP_DETECTED : EV4 + * @arg I2C_EVENT_MASTER_MODE_SELECT : EV5 + * @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_BYTE_RECEIVED : EV7 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2 + * @arg I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9 + * + * @retval Status: SUCCESS or ERROR + */ +uint8_t I2C_ReadEventStatus(I2C_T* i2c, I2C_EVENT_T i2cEvent) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + flag1 = i2c->STS1 & 0x0000FFFF; + flag2 = i2c->STS2 & 0x0000FFFF; + flag2 = flag2 << 16; + + lastevent = (flag1 | flag2) & 0x00FFFFFF; + + if((lastevent & i2cEvent) == i2cEvent) + { + return SUCCESS; + } + return ERROR; +} + +/*! + * @brief Read the last i2c Event. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval The last event + */ +uint32_t I2C_ReadLastEvent(I2C_T* i2c) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + flag1 = i2c->STS1 & 0x0000FFFF; + flag2 = i2c->STS2 & 0x0000FFFF; + flag2 = flag2 << 16; + + lastevent = (flag1 | flag2) & 0x00FFFFFF; + + return lastevent; +} + +/*! + * @brief Check whether the I2C flag is set + * + * @param i2c: I2C selet 1 or 2 + * + * @param flag: specifies the I2C flag + * The parameter can be one of the following values: + * @arg I2C_FLAG_DUALADDR: Dual flag (Slave mode) + * @arg I2C_FLAG_SMMHADDR: SMBus host header (Slave mode) + * @arg I2C_FLAG_SMBDADDR: SMBus default header (Slave mode) + * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode) + * @arg I2C_FLAG_TR: Transmitter/Receiver flag + * @arg I2C_FLAG_BUSBSY: Bus busy flag + * @arg I2C_FLAG_MS: Master/Slave flag + * @arg I2C_FLAG_SMBALT: SMBus Alert flag + * @arg I2C_FLAG_TTE: Timeout or Tlow error flag + * @arg I2C_FLAG_PECE: PEC error in reception flag + * @arg I2C_FLAG_OVRUR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AE: Acknowledge error flag + * @arg I2C_FLAG_AL: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * @arg I2C_FLAG_TXBE: Transmitter data register empty flag + * @arg I2C_FLAG_RXBNE: Receiver data register not empty flag + * @arg I2C_FLAG_STOP: Stop detection flag (Slave mode) + * @arg I2C_FLAG_ADDR10: 10-bit header sent flag (Master mode) + * @arg I2C_FLAG_BTC: Byte transfer complete flag + * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) + * @arg I2C_FLAG_START: Start bit flag (Master mode) + * + * @retval Status: flag SET or RESET + */ +uint8_t I2C_ReadStatusFlag(I2C_T* i2c, I2C_FLAG_T flag) +{ + + uint8_t status = 0; + switch (flag) + { + case I2C_FLAG_DUALADDR: + status = i2c->STS2_B.DUALADDRFLG; + break; + case I2C_FLAG_SMMHADDR: + status = i2c->STS2_B.SMMHADDR; + break; + case I2C_FLAG_SMBDADDR: + status = i2c->STS2_B.SMBDADDRFLG; + break; + case I2C_FLAG_GENCALL: + status = i2c->STS2_B.GENCALLFLG; + break; + case I2C_FLAG_TR: + status = i2c->STS2_B.TRFLG; + break; + case I2C_FLAG_BUSBSY: + status = i2c->STS2_B.BUSBSYFLG; + break; + case I2C_FLAG_MS: + status = i2c->STS2_B.MSFLG; + break; + case I2C_FLAG_SMBALT: + status = i2c->STS1_B.SMBALTFLG; + break; + case I2C_FLAG_TTE: + status = i2c->STS1_B.TTEFLG; + break; + case I2C_FLAG_PECE: + status = i2c->STS1_B.PECEFLG; + break; + case I2C_FLAG_OVRUR: + status = i2c->STS1_B.OVRURFLG; + break; + case I2C_FLAG_AE: + status = i2c->STS1_B.AEFLG; + break; + case I2C_FLAG_AL: + status = i2c->STS1_B.ALFLG; + break; + case I2C_FLAG_BERR: + status = i2c->STS1_B.BERRFLG; + break; + case I2C_FLAG_TXBE: + status = i2c->STS1_B.TXBEFLG; + break; + case I2C_FLAG_RXBNE: + status = i2c->STS1_B.RXBNEFLG; + break; + case I2C_FLAG_STOP: + status = i2c->STS1_B.STOPFLG; + break; + case I2C_FLAG_ADDR10: + status = i2c->STS1_B.ADDR10FLG; + break; + case I2C_FLAG_BTC: + status = i2c->STS1_B.BTCFLG; + break; + case I2C_FLAG_ADDR: + status = i2c->STS1_B.ADDRFLG; + break; + case I2C_FLAG_START: + status = i2c->STS1_B.STARTFLG; + break; + default: + break; + } + return status; +} + +/*! + * @brief Clear the I2C flag + * + * @param i2c: I2C selet 1 or 2 + * + * @param flag: specifies the I2C flag + * The parameter can be one of the following values: + * @arg I2C_FLAG_SMBALT: SMBus Alert flag + * @arg I2C_FLAG_TTE: Timeout or Tlow error flag + * @arg I2C_FLAG_PECE: PEC error in reception flag + * @arg I2C_FLAG_OVRUR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AE: Acknowledge error flag + * @arg I2C_FLAG_AL: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * + * @retval None + * + * @note 1)I2C_FLAG_STOP: Stop detection flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) + * followed by a write operation to I2C_CRTL1 register (I2C_Enable()). + * 2)I2C_FLAG_ADDR10: 10-bit header sent flag is cleared by software sequence: + * a read operation to I2C_STS1 (I2C_ReadStatusFlag()) + * followed by writing the second byte of the address in I2C_DATA register. + * 3)I2C_FLAG_BTC: Byte transfer complete flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) + * followed by a read/write to I2C_DATA register (I2C_TxData()). + * 4)I2C_FLAG_ADDR: Address sent flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) + * followed by a read operation to I2C_STS2 register ((void)(I2Cx->STS2)). + * 5)I2C_FLAG_START: Start bit flag is cleared software sequence: + * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) + * followed by a write operation to I2C_DATA register (I2C_TxData()). + */ +void I2C_ClearStatusFlag(I2C_T* i2c, I2C_FLAG_T flag) +{ + switch (flag) + { + case I2C_FLAG_SMBALT: + i2c->STS1_B.SMBALTFLG = BIT_RESET; + break; + case I2C_FLAG_TTE: + i2c->STS1_B.TTEFLG = BIT_RESET; + break; + case I2C_FLAG_PECE: + i2c->STS1_B.PECEFLG = BIT_RESET; + break; + case I2C_FLAG_OVRUR: + i2c->STS1_B.OVRURFLG = BIT_RESET; + break; + case I2C_FLAG_AE: + i2c->STS1_B.AEFLG = BIT_RESET; + break; + case I2C_FLAG_AL: + i2c->STS1_B.ALFLG = BIT_RESET; + break; + case I2C_FLAG_BERR: + i2c->STS1_B.BERRFLG = BIT_RESET; + break; + default: + break; + } +} + +/*! + * @brief Check whether the I2C interrupts is set + * + * @param i2c: I2C selet 1 or 2 + * + * @param flag: specifies the I2C interrupts + * The parameter can be one of the following values: + * @arg I2C_INT_FLAG_SMBALT: SMBus Alert flag + * @arg I2C_INT_FLAG_TTE: Timeout or Tlow error flag + * @arg I2C_INT_FLAG_PECE: PEC error in reception flag + * @arg I2C_INT_FLAG_OVRUR: Overrun/Underrun flag (Slave mode) + * @arg I2C_INT_FLAG_AE: Acknowledge error flag + * @arg I2C_INT_FLAG_AL: Arbitration lost flag (Master mode) + * @arg I2C_INT_FLAG_BERR: Bus error flag + * @arg I2C_INT_FLAG_TXBE: Transmitter data register empty flag + * @arg I2C_INT_FLAG_RXBNE: Receiver data register not empty flag + * @arg I2C_INT_FLAG_STOP: Stop detection flag (Slave mode) + * @arg I2C_INT_FLAG_ADDR10: 10-bit header sent flag (Master mode) + * @arg I2C_INT_FLAG_BTC: Byte transfer complete flag + * @arg I2C_INT_FLAG_ADDR: Address sent flag (Master mode) + * @arg I2C_INT_FLAG_START: Start bit flag (Master mode) + * + * @retval Status: flag SET or RESET + */ +uint8_t I2C_ReadIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag) +{ + uint32_t enablestatus = 0; + + enablestatus = ((flag & 0x07000000) >> 16) & (i2c->CTRL2); + flag &= 0x00FFFFFF; + if(((i2c->STS1 & flag) != RESET) && enablestatus) + { + return SET; + } + return RESET; +} + +/*! + * @brief Clears the I2C interrupt flag bits. + * + * @param i2c: I2C selet 1 or 2 + * + * @param flag: specifies the I2C flag + * The parameter can be one of the following values: + * @arg I2C_INT_FLAG_SMBALT: SMBus Alert flag + * @arg I2C_INT_FLAG_TTE: Timeout or Tlow error flag + * @arg I2C_INT_FLAG_PECE: PEC error in reception flag + * @arg I2C_INT_FLAG_OVRUR: Overrun/Underrun flag (Slave mode) + * @arg I2C_INT_FLAG_AE: Acknowledge error flag + * @arg I2C_INT_FLAG_AL: Arbitration lost flag (Master mode) + * @arg I2C_INT_FLAG_BERR: Bus error flag + * + * @retval None + * + * @note 1)I2C_INT_FLAG_STOP: Stop detection flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) + * followed by a write operation to I2C_CRTL1 register (I2C_Enable()). + * 2)I2C_INT_FLAG_ADDR10: 10-bit header sent flag is cleared by software sequence: + * a read operation to I2C_STS1 (I2C_ReadIntFlag()) + * followed by writing the second byte of the address in I2C_DATA register. + * 3)I2C_INT_FLAG_BTC: Byte transfer complete flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) + * followed by a read/write to I2C_DATA register (I2C_TxData()). + * 4)I2C_INT_FLAG_ADDR: Address sent flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) + * followed by a read operation to I2C_STS2 register ((void)(I2Cx->STS2)). + * 5)I2C_INT_FLAG_START: Start bit flag is cleared software sequence: + * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) + * followed by a write operation to I2C_DATA register (I2C_TxData()). + */ +void I2C_ClearIntFlag(I2C_T* i2c, uint32_t flag) +{ + i2c->STS1 = (uint16_t)~(flag & 0x00FFFFFF); + +} + +/**@} end of group I2C_Functions */ +/**@} end of group I2C_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_iwdt.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_iwdt.c new file mode 100644 index 0000000000..92f822515a --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_iwdt.c @@ -0,0 +1,150 @@ +/*! + * @file apm32e10x_iwdt.c + * + * @brief This file provides all the IWDT firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_iwdt.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup IWDT_Driver + * @brief IWDT driver modules + @{ +*/ + +/** @defgroup IWDT_Functions Functions + @{ +*/ + +/*! + * @brief Enable IWDT + * + * @param None + * + * @retval None + */ +void IWDT_Enable(void) +{ + IWDT->KEY = IWDT_KEYWORD_ENABLE; +} + +/*! + * @brief Reload the IWDT counter with value + * + * @param None + * + * @retval None + */ +void IWDT_Refresh(void) +{ + IWDT->KEY = IWDT_KEYWORD_RELOAD; +} + +/*! + * @brief Set IWDT count reload values + * + * @param reload: IWDT count reload values + * + * @retval None + */ +void IWDT_ConfigReload(uint16_t reload) +{ + IWDT->CNTRLD = reload; +} + +/*! + * @brief Enable the IWDT write access + * + * @param None + * + * @retval None + */ +void IWDT_EnableWriteAccess(void) +{ + IWDT->KEY_B.KEY = IWDT_WRITEACCESS_ENABLE; +} + +/*! + * @brief Disable the IWDT write access + * + * @param None + * + * @retval None + */ +void IWDT_DisableWriteAccess(void) +{ + IWDT->KEY_B.KEY = IWDT_WRITEACCESS_DISABLE; +} + +/*! + * @brief Set IWDT frequency divider values + * + * @param div: IWDT frequency divider values + * This parameter can be one of the following values: + * @arg IWDT_DIVIDER_4 : prescaler divider equal to 4 + * @arg IWDT_DIVIDER_8 : prescaler divider equal to 8 + * @arg IWDT_DIVIDER_16 : prescaler divider equal to 16 + * @arg IWDT_DIVIDER_32 : prescaler divider equal to 32 + * @arg IWDT_DIVIDER_64 : prescaler divider equal to 64 + * @arg IWDT_DIVIDER_128: prescaler divider equal to 128 + * @arg IWDT_DIVIDER_256: prescaler divider equal to 256 + * + * @retval None + */ +void IWDT_ConfigDivider(uint8_t div) +{ + IWDT->PSC = div; +} + +/*! + * @brief Read the specified IWDT flag + * + * @param flag: specifies the flag to read + * This parameter can be one of the following values: + * @arg IWDT_FLAG_PSCU : Watchdog Prescaler Factor Update flag + * @arg IWDT_FLAG_CNTU : Watchdog Counter Reload Value Update flag + * + * @retval status of IWDT_FLAG (SET or RESET) + * + * @note + */ +uint8_t IWDT_ReadStatusFlag(uint16_t flag) +{ + uint8_t bitStatus = RESET; + + if((IWDT->STS & flag) != (uint32_t)RESET) + { + bitStatus = SET; + } + else + { + bitStatus = RESET; + } + return bitStatus; +} + +/**@} end of group IWDT_Functions */ +/**@} end of group IWDT_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_misc.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_misc.c new file mode 100644 index 0000000000..f112359bc2 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_misc.c @@ -0,0 +1,222 @@ +/*! + * @file apm32e10x_misc.c + * + * @brief This file provides all the miscellaneous firmware functions. + * Include NVIC,SystemTick and Power management. + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_misc.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup MISC_Driver + * @brief MISC driver modules + @{ +*/ + +/** @defgroup MISC_Macros Macros + @{ +*/ + +#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) + +/**@} end of group MISC_Macros */ + + +/** @defgroup MISC_Functions Functions + @{ +*/ + +/*! + * @brief Configures the priority grouping: pre-emption priority and subpriority. + * + * @param priorityGroup : specifies the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITY_GROUP_0 + * @arg NVIC_PRIORITY_GROUP_1 + * @arg NVIC_PRIORITY_GROUP_2 + * @arg NVIC_PRIORITY_GROUP_3 + * @arg NVIC_PRIORITY_GROUP_4 + * + * @retval None + */ +void NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_T priorityGroup) +{ + SCB->AIRCR = AIRCR_VECTKEY_MASK | priorityGroup; +} + +/*! + * @brief Enable NVIC request + * + * @param irq: the NVIC interrupt request, detailed in IRQn_Type + * For the complete APM32 Devices IRQ Channels list,please refer to apm32e10x.h file + * + * @param preemptionPriority: the pre-emption priority needed to set + * + * @param subPriority: the subpriority needed to set + * + * @retval None + */ +void NVIC_EnableIRQRequest(IRQn_Type irq, uint8_t preemptionPriority, uint8_t subPriority) +{ + uint32_t tempPriority, tempPrePri, tempSubPri; + uint32_t priorityGrp; + + /** Get priority group */ + priorityGrp = (SCB->AIRCR) & (uint32_t)0x700U; + + /** get pre-emption priority and subpriority */ + switch(priorityGrp) + { + case NVIC_PRIORITY_GROUP_0: + tempPrePri = 0; + tempSubPri = 4; + break; + + case NVIC_PRIORITY_GROUP_1: + tempPrePri = 1; + tempSubPri = 3; + break; + + case NVIC_PRIORITY_GROUP_2: + tempPrePri = 2; + tempSubPri = 2; + break; + + case NVIC_PRIORITY_GROUP_3: + tempPrePri = 3; + tempSubPri = 1; + break; + + case NVIC_PRIORITY_GROUP_4: + tempPrePri = 4; + tempSubPri = 0; + break; + + default: + NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_0); + tempPrePri = 0; + tempSubPri = 4; + break; + } + + tempPrePri = 4 - tempPrePri; + tempSubPri = 4 - tempSubPri; + tempPriority = preemptionPriority << tempPrePri; + tempPriority |= subPriority & (0x0f >> tempSubPri); + tempPriority <<= 4; + NVIC->IP[irq] = (uint8_t)tempPriority; + + /* enable the selected IRQ */ + NVIC->ISER[irq >> 0x05U] = (uint32_t)0x01U << (irq & (uint8_t)0x1FU); +} + +/*! + * @brief Disable NVIC request + * + * @param irq: the NVIC interrupt request, detailed in IRQn_Type + * + * @retval None + */ +void NVIC_DisableIRQRequest(IRQn_Type irq) +{ + /* disable the selected IRQ.*/ + NVIC->ICER[irq >> 0x05U] = (uint32_t)0x01U << (irq & (uint8_t)0x1FU); +} + +/*! + * @brief Configs the vector table location and Offset. + * + * @param vectTab: specifies if the vector table is in RAM or FLASH memory + * This parameter can be one of the following values: + * @arg NVIC_VECT_TAB_RAM + * @arg NVIC_VECT_TAB_FLASH + * + * @param Offset Vector Table base offset field. This value must be a multiple of 0x200 + * + * @retval None + */ +void NVIC_ConfigVectorTable(NVIC_VECT_TAB_T vectTab, uint32_t offset) +{ + SCB->VTOR = vectTab | (offset & (uint32_t)0x1FFFFF80); +} + +/*! + * @brief set the state of the low power mode + * + * @param lowPowerMode: the low power mode state + * This parameter can be one of the following values: + * @arg NVIC_LOWPOWER_SEVONPEND + * @arg NVIC_LOWPOWER_SLEEPDEEP + * @arg NVIC_LOWPOWER_SLEEPONEXIT + * + * @retval None + */ +void NVIC_SetSystemLowPower(NVIC_LOWPOWER_T lowPowerMode) +{ + SCB->SCR |= lowPowerMode; +} + + +/*! + * @brief reset the state of the low power mode + * + * @param lowPowerMode: the low power mode state + * This parameter can be one of the following values: + * @arg NVIC_LOWPOWER_SEVONPEND + * @arg NVIC_LOWPOWER_SLEEPDEEP + * @arg NVIC_LOWPOWER_SLEEPONEXIT + * + * @retval None + */ +void NVIC_ResetystemLowPower(NVIC_LOWPOWER_T lowPowerMode) +{ + SCB->SCR &= (uint32_t)(~(uint32_t)lowPowerMode); +} + +/*! + * @brief Configures the SysTick clock source + * + * @param clkSource: specifies the SysTick clock source + * This parameter can be one of the following values: + * @arg SYSTICK_CLK_SOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SYSTICK_CLK_SOURCE_HCLK: AHB clock selected as SysTick clock source. + * + * @retval None + */ +void SysTick_ConfigCLKSource(SYSTICK_CLK_SOURCE_T clkSource) +{ + if (clkSource == SYSTICK_CLK_SOURCE_HCLK) + { + SysTick->CTRL |= (uint32_t)BIT2; + } + else + { + SysTick->CTRL &= (uint32_t)(~BIT2); + } +} + +/**@} end of group MISC_Functions */ +/**@} end of group MISC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_pmu.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_pmu.c new file mode 100644 index 0000000000..40b3451dd7 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_pmu.c @@ -0,0 +1,270 @@ +/*! + * @file apm32e10x_pmu.c + * + * @brief This file provides all the PMU firmware functions. + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_pmu.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup PMU_Driver + * @brief PMU driver modules + @{ +*/ + +/** @defgroup PMU_Functions Functions + @{ +*/ + +/*! + * @brief Reset the PMU peripheral register. + * + * @param None + * + * @retval None + */ +void PMU_Reset(void) +{ + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_PMU); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_PMU); +} + +/*! + * @brief Enables access to the RTC and backup registers. + * + * @param None + * + * @retval None + */ +void PMU_EnableBackupAccess(void) +{ + PMU->CTRL_B.BPWEN = ENABLE ; +} + +/*! + * @brief Disables access to the RTC and backup registers. + * + * @param None + * + * @retval None + */ +void PMU_DisableBackupAccess(void) +{ + PMU->CTRL_B.BPWEN = DISABLE; +} + +/*! + * @brief Enables the Power Voltage Detector(PVD). + * + * @param None + * + * @retval None + */ +void PMU_EnablePVD(void) +{ + PMU->CTRL_B.PVDEN = ENABLE; +} + +/*! + * @brief Disables the Power Voltage Detector(PVD). + * + * @param None + * + * @retval None + */ +void PMU_DisablePVD(void) +{ + PMU->CTRL_B.PVDEN = DISABLE; +} + +/*! + * @brief Configure a voltage threshold detected by a power supply voltage detector (PVD). + * + * @param level��specifies the PVD detection level + * This parameter can be one of the following values: + * @arg PMU_PVD_LEVEL_2V2 : Config PVD detection level to 2.2V + * @arg PMU_PVD_LEVEL_2V3 : Config PVD detection level to 2.3V + * @arg PMU_PVD_LEVEL_2V4 : Config PVD detection level to 2.4V + * @arg PMU_PVD_LEVEL_2V5 : Config PVD detection level to 2.5V + * @arg PMU_PVD_LEVEL_2V6 : Config PVD detection level to 2.6V + * @arg PMU_PVD_LEVEL_2V7 : Config PVD detection level to 2.7V + * @arg PMU_PVD_LEVEL_2V8 : Config PVD detection level to 2.8V + * @arg PMU_PVD_LEVEL_2V9 : Config PVD detection level to 2.9V + * + * @retval None + */ +void PMU_ConfigPVDLevel(PMU_PVD_LEVEL_T level) +{ + + /* Clear PLS[7:5] bits */ + PMU->CTRL_B.PLSEL = 0x0000; + /* Store the new value */ + PMU->CTRL_B.PLSEL = level; +} + +/*! + * @brief Enables the WakeUp Pin functionality. + * + * @param None + * + * @retval None + */ +void PMU_EnableWakeUpPin(void) +{ + PMU->CSTS_B.WKUPCFG = ENABLE ; +} + +/*! + * @brief Diaables the WakeUp Pin functionality. + * + * @param None + * + * @retval None + */ +void PMU_DisableWakeUpPin(void) +{ + PMU->CSTS_B.WKUPCFG = DISABLE ; +} + +/*! + * @brief Enters STOP mode. + * + * @param regulator: specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PMU_REGULATOR_ON : STOP mode with regulator ON + * @arg PMU_REGULATOR_LOWPOWER: STOP mode with regulator in low power mode + * + * @param entry: specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PMU_STOP_ENTRY_WFI: Enter STOP mode with WFI instruction + * @arg PMU_STOP_ENTRY_WFE: Enter STOP mode with WFE instruction + * + * @retval None + */ +void PMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry) +{ + /** Clear PDDSCFG and LPDSCFG bits */ + PMU->CTRL_B.PDDSCFG = 0x00; + PMU->CTRL_B.LPDSCFG = 0x00; + /** Set LPDSCFG bit according to regulator value */ + PMU->CTRL_B.LPDSCFG = regulator; + /** Set Cortex System Control Register */ + SCB->SCR |= (uint32_t )0x04; + /** Select STOP mode entry*/ + if(entry == PMU_STOP_ENTRY_WFI) + { + /** Request Wait For Interrupt */ + __WFI(); + } + else + { + /** Request Wait For Event */ + __WFE(); + } + + /** Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)0x04); + +} + +/*! + * @brief Enters STANDBY mode. + * + * @param None + * + * @retval None + */ +void PMU_EnterSTANDBYMode(void) +{ + /* Clear Wake-up flag */ + PMU->CTRL_B.WUFLGCLR = BIT_SET; + /* Select STANDBY mode */ + PMU->CTRL_B.PDDSCFG = BIT_SET; + /* Set Cortex System Control Register */ + SCB->SCR |= (uint32_t )0x04; +#if defined ( __CC_ARM ) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); + +} + +/*! + * @brief Read the specified PWR flag is set or not. + * + * @param flag��Reads the status of specifies the flag. + * This parameter can be one of the following values: + * @arg PMU_FLAG_WUE : Wake Up flag + * @arg PMU_FLAG_SB : StandBy flag + * @arg PMU_FLAG_PVDO: PVD Output flag + * + * @retval The new state of PMU_FLAG (SET or RESET). + */ +uint8_t PMU_ReadStatusFlag(PMU_FLAG_T flag) +{ + uint8_t BitStatus = BIT_RESET; + + if(flag == PMU_FLAG_WUE) + { + BitStatus = PMU->CSTS_B.WUEFLG; + } + else if(flag == PMU_FLAG_SB) + { + BitStatus = PMU->CSTS_B.SBFLG; + } + else if(flag == PMU_FLAG_PVDO) + { + BitStatus = PMU->CSTS_B.PVDOFLG; + } + return BitStatus; +} + +/*! + * @brief Clears the PWR's pending flags. + * + * @param flag��Clears the status of specifies the flag. + * This parameter can be one of the following values: + * @arg PMU_FLAG_WUE : Wake Up flag + * @arg PMU_FLAG_SB : StandBy flag + * + * @retval None + */ +void PMU_ClearStatusFlag(PMU_FLAG_T flag) +{ + if(flag == PMU_FLAG_WUE) + { + PMU->CTRL_B.WUFLGCLR = BIT_SET; + } + else if(flag == PMU_FLAG_SB) + { + PMU->CTRL_B.SBFLGCLR = BIT_SET; + } +} + +/**@} end of group PMU_Functions */ +/**@} end of group PMU_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_rcm.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_rcm.c new file mode 100644 index 0000000000..5c6238b5ec --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_rcm.c @@ -0,0 +1,1097 @@ +/*! + * @file apm32e10x_rcm.c + * + * @brief This file provides all the RCM firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup RCM_Driver + * @brief RCM driver modules + @{ +*/ + +/** @defgroup RCM_Functions Functions + @{ +*/ + +/*! + * @brief Resets the clock configuration to the default state + * + * @param None + * + * @retval None + */ +void RCM_Reset(void) +{ + /* Open HSI clock */ + RCM->CTRL_B.HSIEN = BIT_SET; + /* Config HSI to system clock and Reset AHBPSC, APB1PSC, APB2PSC, ADCPSC and MCOSEL bits */ + RCM->CFG &= (uint32_t)0xF8FF0000; + /* Reset HSEEN, CSSEN and PLLEN bits */ + RCM->CTRL &= (uint32_t)0xFEF6FFFF; + /* Reset HSEBCFG bit */ + RCM->CTRL_B.HSEBCFG = BIT_RESET; + /* Reset PLLSRCSEL, PLLHSEPSC, PLLMULCFG and USBDIV bits */ + RCM->CFG &= (uint32_t)0xFF00FFFF; + /* Disable all interrupts and clear pending bits */ + RCM->INT = 0x009F0000; +} + +/*! + * @brief Configs the HSE oscillator + * + * @param state: state of the HSE + * This parameter can be one of the following values: + * @arg RCM_HSE_CLOSE: Turn off the HSE oscillator + * @arg RCM_HSE_OPEN: Turn on the HSE oscillator + * @arg RCM_HSE_BYPASS: HSE oscillator bypassed with external clock + * + * @retval None + * + * @note When HSE is not used directly or through the PLL as system clock, it can be stopped. + */ +void RCM_ConfigHSE(RCM_HSE_T state) +{ + /* Reset HSEEN bit */ + RCM->CTRL_B.HSEEN = BIT_RESET; + + /* Reset HSEBCFG bit */ + RCM->CTRL_B.HSEBCFG = BIT_RESET; + + if (state == RCM_HSE_OPEN) + { + RCM->CTRL_B.HSEEN = BIT_SET; + } + else if (state == RCM_HSE_BYPASS) + { + RCM->CTRL_B.HSEBCFG = BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; + } +} + +/*! + * @brief Waits for HSE to be ready + * + * @param None + * + * @retval SUCCESS: HSE oscillator is ready + * ERROR : HSE oscillator is not ready + */ +uint8_t RCM_WaitHSEReady(void) +{ + __IO uint32_t cnt; + + for (cnt = 0; cnt < HSE_STARTUP_TIMEOUT; cnt++) + { + if (RCM->CTRL_B.HSERDYFLG == BIT_SET) + { + return SUCCESS; + } + } + + return ERROR; +} + +/*! + * @brief Config HSI trimming value + * + * @param HSITrim: HSI trimming value + * This parameter must be a number between 0 and 0x1F. + * + * @retval None + */ +void RCM_ConfigHSITrim(uint8_t HSITrim) +{ + RCM->CTRL_B.HSITRIM = HSITrim; +} + +/*! + * @brief Enable the HSI + * + * @param None + * + * @retval None + */ +void RCM_EnableHSI(void) +{ + RCM->CTRL_B.HSIEN = BIT_SET; +} + +/*! + * @brief Disable the HSI + * + * @param None + * + * @retval None + * + * @note When HSI is not used directly or through the PLL as system clock, it can be stopped. + */ + +void RCM_DisableHSI(void) +{ + RCM->CTRL_B.HSIEN = BIT_RESET; +} + +/*! + * @brief Configures the External Low Speed oscillator (LSE) + * + * @param state : Specifies the new state of the LSE + * This parameter can be one of the following values: + * @arg RCM_LSE_CLOSE : Close the LSE + * @arg RCM_LSE_OPEN : Open the LSE + * @arg RCM_LSE_BYPASS : LSE bypass + * + * @retval None + * + * @note + */ +void RCM_ConfigLSE(RCM_LSE_T state) +{ + RCM->BDCTRL_B.LSEEN = BIT_RESET; + RCM->BDCTRL_B.LSEBCFG = BIT_RESET; + + if (state == RCM_LSE_OPEN) + { + RCM->BDCTRL_B.LSEEN = BIT_SET; + } + else if (state == RCM_LSE_BYPASS) + { + RCM->BDCTRL_B.LSEBCFG = BIT_SET; + RCM->BDCTRL_B.LSEEN = BIT_SET; + } +} + +/*! + * @brief Enables the Internal Low Speed oscillator (LSI) + * + * @param None + * + * @retval None + * + * @note + */ +void RCM_EnableLSI(void) +{ + RCM->CSTS_B.LSIEN = BIT_SET; +} + +/*! + * @brief Disables the Internal Low Speed oscillator (LSI) + * + * @param None + * + * @retval None + * + * @note + */ +void RCM_DisableLSI(void) +{ + RCM->CSTS_B.LSIEN = BIT_RESET; +} + +/*! + * @brief Configs the PLL clock source and multiplication factor + * + * @param pllSelect: PLL entry clock source select + * This parameter can be one of the following values: + * @arg RCM_PLLSEL_HSI_DIV_2: HSI clock divided by 2 selected as PLL clock source + * @arg RCM_PLLSEL_HSE: HSE clock selected as PLL clock source + * @arg RCM_PLLSEL_HSE_DIV2: HSE clock divided by 2 selected as PLL clock source + * + * @param pllMf: PLL multiplication factor + * This parameter can be RCM_PLLMF_x where x can be a value from 2 to 16. + * + * @retval None + * + * @note PLL should be disabled while use this function. + */ +void RCM_ConfigPLL(RCM_PLLSEL_T pllSelect, RCM_PLLMF_T pllMf) +{ + RCM->CFG_B.PLLMULCFG = pllMf; + RCM->CFG_B.PLLSRCSEL = pllSelect & 0x01; + RCM->CFG_B.PLLHSEPSC = (pllSelect >> 1) & 0x01; +} + +/*! + * @brief Enables the PLL + * + * @param None + * + * @retval None + */ +void RCM_EnablePLL(void) +{ + RCM->CTRL_B.PLLEN = BIT_SET; +} + +/*! +* @brief Disable the PLL +* +* @param None +* +* @retval None +* +* @note When PLL is not used as system clock, it can be stopped. +*/ +void RCM_DisablePLL(void) +{ + RCM->CTRL_B.PLLEN = BIT_RESET; +} + +/*! + * @brief Enable the Clock Security System + * + * @param None + * + * @retval None + */ +void RCM_EnableCSS(void) +{ + RCM->CTRL_B.CSSEN = BIT_SET; +} + +/*! + * @brief Disable the Clock Security System + * + * @param None + * + * @retval None + */ +void RCM_DisableCSS(void) +{ + RCM->CTRL_B.CSSEN = BIT_RESET; +} + +/*! + * @brief Selects the MCO pin clock ouput source + * + * @param mcoClock: specifies the clock source to output + * This parameter can be one of the following values: + * @arg RCM_MCOCLK_NO_CLOCK : No clock selected. + * @arg RCM_MCOCLK_SYSCLK : System clock selected. + * @arg RCM_MCOCLK_HSI : HSI oscillator clock selected. + * @arg RCM_MCOCLK_HSE : HSE oscillator clock selected. + * @arg RCM_MCOCLK_PLLCLK_DIV_2 : PLL clock divided by 2 selected. + * + * @retval None + * + * @note + */ +void RCM_ConfigMCO(RCM_MCOCLK_T mcoClock) +{ + RCM->CFG_B.MCOSEL = mcoClock; +} + +/*! + * @brief Configures the system clock source + * + * @param sysClkSelect: specifies the clock source used as system clock + * This parameter can be one of the following values: + * @arg RCM_SYSCLK_SEL_HSI: HSI is selected as system clock source + * @arg RCM_SYSCLK_SEL_HSE: HSE is selected as system clock source + * @arg RCM_SYSCLK_SEL_PLL: PLL is selected as system clock source + * + * @retva None + */ +void RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_T sysClkSelect) +{ + RCM->CFG_B.SCLKSW = sysClkSelect; +} + +/*! + * @brief Returns the clock source which is used as system clock + * + * @param None + * + * @retval The clock source used as system clock + */ +RCM_SYSCLK_SEL_T RCM_ReadSYSCLKSource(void) +{ + RCM_SYSCLK_SEL_T sysClock; + + sysClock = (RCM_SYSCLK_SEL_T)RCM->CFG_B.SCLKSWSTS; + + return sysClock; +} + +/*! + * @brief Configs the AHB clock prescaler. + * + * @param AHBDiv : Specifies the AHB clock prescaler from the system clock. + * This parameter can be one of the following values: + * @arg RCM_AHB_DIV_1 : HCLK = SYSCLK + * @arg RCM_AHB_DIV_2 : HCLK = SYSCLK / 2 + * @arg RCM_AHB_DIV_4 : HCLK = SYSCLK / 4 + * @arg RCM_AHB_DIV_8 : HCLK = SYSCLK / 8 + * @arg RCM_AHB_DIV_16 : HCLK = SYSCLK / 16 + * @arg RCM_AHB_DIV_64 : HCLK = SYSCLK / 64 + * @arg RCM_AHB_DIV_128 : HCLK = SYSCLK / 128 + * @arg RCM_AHB_DIV_256 : HCLK = SYSCLK / 256 + * @arg RCM_AHB_DIV_512 : HCLK = SYSCLK / 512 + * + * @retval None + * + * @note + */ +void RCM_ConfigAHB(RCM_AHB_DIV_T AHBDiv) +{ + RCM->CFG_B.AHBPSC = AHBDiv; +} + +/*! + * @brief Configs the APB1 clock prescaler. + * + * @param APB1Div: Specifies the APB1 clock prescaler from the AHB clock. + * This parameter can be one of the following values: + * @arg RCM_APB_DIV_1 : PCLK1 = HCLK + * @arg RCM_APB_DIV_2 : PCLK1 = HCLK / 2 + * @arg RCM_APB_DIV_4 : PCLK1 = HCLK / 4 + * @arg RCM_APB_DIV_8 : PCLK1 = HCLK / 8 + * @arg RCM_APB_DIV_16 : PCLK1 = HCLK / 16 + * + * @retval None + */ +void RCM_ConfigAPB1(RCM_APB_DIV_T APB1Div) +{ + RCM->CFG_B.APB1PSC = APB1Div; +} + +/*! + * @brief Configs the APB2 clock prescaler + * + * @param APB2Div: Specifies the APB2 clock prescaler from the AHB clock. + * This parameter can be one of the following values: + * @arg RCM_APB_DIV_1 : PCLK2 = HCLK + * @arg RCM_APB_DIV_2 : PCLK2 = HCLK / 2 + * @arg RCM_APB_DIV_4 : PCLK2 = HCLK / 4 + * @arg RCM_APB_DIV_8 : PCLK2 = HCLK / 8 + * @arg RCM_APB_DIV_16 : PCLK2 = HCLK / 16 + * + * @retval None + */ +void RCM_ConfigAPB2(RCM_APB_DIV_T APB2Div) +{ + RCM->CFG_B.APB2PSC = APB2Div; +} + +/*! + * @brief Configs the USB clock prescaler + * + * @param USBDiv: Specifies the USB clock prescaler from the PLL clock. + * This parameter can be one of the following values: + * @arg RCM_USB_DIV_1_5 : USBCLK = PLL clock /1.5 + * @arg RCM_USB_DIV_1 : USBCLK = PLL clock + * @arg RCM_USB_DIV_2 : USBCLK = PLL clock / 2 + * @arg RCM_USB_DIV_2_5 : USBCLK = PLL clock / 2.5 + * + * @retval None + */ +void RCM_ConfigUSBCLK(RCM_USB_DIV_T USBDiv) +{ + RCM->CFG_B.USBDPSC = USBDiv; +} + +/*! + * @brief Configs the FPU clock prescaler + * + * @param FPUDiv: Specifies the FPU clock prescaler from the AHB clock. + * This parameter can be one of the following values: + * @arg RCM_FPU_DIV_1 : FPUCLK = HCLK + * @arg RCM_FPU_DIV_2 : FPUCLK = HCLK /2 + * + * @retval None + */ +void RCM_ConfigFPUCLK(RCM_FPU_DIV_T FPUDiv) +{ + RCM->CFG_B.FPUPSC = FPUDiv; +} + +/*! + * @brief Configs the ADC clock prescaler + * + * @param ADCDiv : Specifies the ADC clock prescaler from the APB2 clock. + * This parameter can be one of the following values: + * @arg RCM_PCLK2_DIV_2: ADCCLK = PCLK2 / 2 + * @arg RCM_PCLK2_DIV_4: ADCCLK = PCLK2 / 4 + * @arg RCM_PCLK2_DIV_6: ADCCLK = PCLK2 / 6 + * @arg RCM_PCLK2_DIV_8: ADCCLK = PCLK2 / 8 + * + * @retval None + */ +void RCM_ConfigADCCLK(RCM_PCLK2_DIV_T ADCDiv) +{ + RCM->CFG_B.ADCPSC = ADCDiv; +} + +/*! + * @brief Configures the RTC clock source + * + * @param rtcClkSelect : specifies the RTC clock source. + * This parameter can be one of the following values: + * @arg RCM_RTCCLK_LSE : RTCCLK = LSE clock + * @arg RCM_RTCCLK_LSI : RTCCLK = LSI clock + * @arg RCM_RTCCLK_HSE_DIV_128: RTCCLK = HSE clock / 128 + * + * @retval None + * + * @note Once the RTC clock is configed it can't be changed unless reset the Backup domain. + */ +void RCM_ConfigRTCCLK(RCM_RTCCLK_T rtcClkSelect) +{ + RCM->BDCTRL_B.RTCSRCSEL = rtcClkSelect; +} + +/*! + * @brief Enables the RTC clock + * + * @param None + * + * @retval None + */ +void RCM_EnableRTCCLK(void) +{ + RCM->BDCTRL_B.RTCCLKEN = BIT_SET; +} + +/*! + * @brief Disables the RTC clock + * + * @param None + * + * @retval None + */ +void RCM_DisableRTCCLK(void) +{ + RCM->BDCTRL_B.RTCCLKEN = BIT_RESET; +} + +/*! + * @brief Reads the frequency of SYSCLK + * + * @param None + * + * @retval Return the frequency of SYSCLK + */ +uint32_t RCM_ReadSYSCLKFreq(void) +{ + uint32_t sysClock, pllMull, pllSource; + + /** get sys clock */ + sysClock = RCM->CFG_B.SCLKSW; + + switch (sysClock) + { + /** sys clock is HSI */ + case RCM_SYSCLK_SEL_HSI: + sysClock = HSI_VALUE; + break; + + /** sys clock is HSE */ + case RCM_SYSCLK_SEL_HSE: + sysClock = HSE_VALUE; + break; + + /** sys clock is PLL */ + case RCM_SYSCLK_SEL_PLL: + pllMull = RCM->CFG_B.PLLMULCFG + 2; + pllSource = RCM->CFG_B.PLLSRCSEL; + + /** PLL entry clock source is HSE */ + if (pllSource == BIT_SET) + { + sysClock = HSE_VALUE * pllMull; + + /** HSE clock divided by 2 */ + if (pllSource == RCM->CFG_B.PLLHSEPSC) + { + sysClock >>= 1; + } + } + /** PLL entry clock source is HSI/2 */ + else + { + sysClock = (HSI_VALUE >> 1) * pllMull; + } + + break; + + default: + sysClock = HSI_VALUE; + break; + } + + return sysClock; +} + +/*! + * @brief Reads the frequency of HCLK(AHB) + * + * @param None + * + * @retval Return the frequency of HCLK + */ +uint32_t RCM_ReadHCLKFreq(void) +{ + uint32_t divider; + uint32_t sysClk, hclk; + uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + + sysClk = RCM_ReadSYSCLKFreq(); + divider = AHBPrescTable[RCM->CFG_B.AHBPSC]; + hclk = sysClk >> divider; + + return hclk; +} + +/*! + * @brief Reads the frequency of PCLK1 And PCLK2 + * + * @param PCLK1 : Return the frequency of PCLK1 + * + * @param PCLK1 : Return the frequency of PCLK2 + * + * @retval None + */ +void RCM_ReadPCLKFreq(uint32_t* PCLK1, uint32_t* PCLK2) +{ + uint32_t hclk, divider; + uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + hclk = RCM_ReadHCLKFreq(); + + if (PCLK1) + { + divider = APBPrescTable[RCM->CFG_B.APB1PSC]; + *PCLK1 = hclk >> divider; + } + + if (PCLK2) + { + divider = APBPrescTable[RCM->CFG_B.APB2PSC]; + *PCLK2 = hclk >> divider; + } +} + +/*! + * @brief Reads the frequency of ADCCLK + * + * @param None + * + * @retval Return the frequency of ADCCLK + */ +uint32_t RCM_ReadADCCLKFreq(void) +{ + uint32_t adcClk, pclk2, divider; + uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; + + RCM_ReadPCLKFreq(NULL, &pclk2); + + /** Get ADC CLK */ + divider = ADCPrescTable[RCM->CFG_B.ADCPSC]; + adcClk = pclk2 / divider; + + return adcClk; +} + +/*! + * @brief Enables AHB peripheral clock. + * + * @param AHBPeriph : Enable the specifies clock of AHB peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_AHB_PERIPH_DMA1 : Enable DMA1 clock + * @arg RCM_AHB_PERIPH_DMA2 : Enable DMA2 clock + * @arg RCM_AHB_PERIPH_SRAM : Enable SRAM clock + * @arg RCM_AHB_PERIPH_FPU : Enable FPU clock + * @arg RCM_AHB_PERIPH_FMC : Enable FMC clock + * @arg RCM_AHB_PERIPH_QSPI : Enable QSPI clock + * @arg RCM_AHB_PERIPH_CRC : Enable CRC clock + * @arg RCM_AHB_PERIPH_EMMC : Enable EMMC clock + * @arg RCM_AHB_PERIPH_SDIO : Enable SDIO clock + * + * @retval None + */ +void RCM_EnableAHBPeriphClock(uint32_t AHBPeriph) +{ + RCM->AHBCLKEN |= AHBPeriph; +} + +/*! + * @brief Disable AHB peripheral clock. + * + * @param AHBPeriph : Disable the specifies clock of AHB peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_AHB_PERIPH_DMA1 : Disable DMA1 clock + * @arg RCM_AHB_PERIPH_DMA2 : Disable DMA2 clock + * @arg RCM_AHB_PERIPH_SRAM : Disable SRAM clock + * @arg RCM_AHB_PERIPH_FPU : Disable FPU clock + * @arg RCM_AHB_PERIPH_FMC : Disable FMC clock + * @arg RCM_AHB_PERIPH_QSPI : Disable QSPI clock + * @arg RCM_AHB_PERIPH_CRC : Disable CRC clock + * @arg RCM_AHB_PERIPH_EMMC : Disable EMMC clock + * @arg RCM_AHB_PERIPH_SDIO : Disable SDIO clock + * + * @retval None + */ +void RCM_DisableAHBPeriphClock(uint32_t AHBPeriph) +{ + RCM->AHBCLKEN &= (uint32_t)~AHBPeriph; +} + +/*! + * @brief Enable the High Speed APB (APB2) peripheral clock + * + * @param APB2Periph : Enable specifies clock of the APB2 peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_APB2_PERIPH_AFIO : Enable AFIO clock + * @arg RCM_APB2_PERIPH_GPIOA : Enable GPIOA clock + * @arg RCM_APB2_PERIPH_GPIOB : Enable GPIOB clock + * @arg RCM_APB2_PERIPH_GPIOC : Enable GPIOC clock + * @arg RCM_APB2_PERIPH_GPIOD : Enable GPIOD clock + * @arg RCM_APB2_PERIPH_GPIOE : Enable GPIOE clock + * @arg RCM_APB2_PERIPH_GPIOF : Enable GPIOF clock + * @arg RCM_APB2_PERIPH_GPIOG : Enable GPIOG clock + * @arg RCM_APB2_PERIPH_ADC1 : Enable ADC1 clock + * @arg RCM_APB2_PERIPH_ADC2 : Enable ADC2 clock + * @arg RCM_APB2_PERIPH_TMR1 : Enable TMR1 clock + * @arg RCM_APB2_PERIPH_SPI1 : Enable SPI1 clock + * @arg RCM_APB2_PERIPH_TMR8 : Enable TMR8 clock + * @arg RCM_APB2_PERIPH_USART1 : Enable USART1 clock + * @arg RCM_APB2_PERIPH_ADC3 : Enable ADC3 clock + * + * @retval None + */ +void RCM_EnableAPB2PeriphClock(uint32_t APB2Periph) +{ + RCM->APB2CLKEN |= APB2Periph; +} + +/*! + * @brief Disable the High Speed APB (APB2) peripheral clock + * + * @param APB2Periph : Disable specifies clock of the APB2 peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_APB2_PERIPH_AFIO : Disable AFIO clock + * @arg RCM_APB2_PERIPH_GPIOA : Disable GPIOA clock + * @arg RCM_APB2_PERIPH_GPIOB : Disable GPIOB clock + * @arg RCM_APB2_PERIPH_GPIOC : Disable GPIOC clock + * @arg RCM_APB2_PERIPH_GPIOD : Disable GPIOD clock + * @arg RCM_APB2_PERIPH_GPIOE : Disable GPIOE clock + * @arg RCM_APB2_PERIPH_GPIOF : Disable GPIOF clock + * @arg RCM_APB2_PERIPH_GPIOG : Disable GPIOG clock + * @arg RCM_APB2_PERIPH_ADC1 : Disable ADC1 clock + * @arg RCM_APB2_PERIPH_ADC2 : Disable ADC2 clock + * @arg RCM_APB2_PERIPH_TMR1 : Disable TMR1 clock + * @arg RCM_APB2_PERIPH_SPI1 : Disable SPI1 clock + * @arg RCM_APB2_PERIPH_TMR8 : Disable TMR8 clock + * @arg RCM_APB2_PERIPH_USART1 : Disable USART1 clock + * @arg RCM_APB2_PERIPH_ADC3 : Disable ADC3 clock + * + * @retval None + */ +void RCM_DisableAPB2PeriphClock(uint32_t APB2Periph) +{ + RCM->APB2CLKEN &= (uint32_t)~APB2Periph; +} + +/*! + * @brief Enable the Low Speed APB (APB1) peripheral clock + * + * @param APB1Periph : Enable specifies clock of the APB1 peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_APB1_PERIPH_TMR2 : Enable TMR2 clock + * @arg RCM_APB1_PERIPH_TMR3 : Enable TMR3 clock + * @arg RCM_APB1_PERIPH_TMR4 : Enable TMR4 clock + * @arg RCM_APB1_PERIPH_TMR5 : Enable TMR5 clock + * @arg RCM_APB1_PERIPH_TMR6 : Enable TMR6 clock + * @arg RCM_APB1_PERIPH_TMR7 : Enable TMR7 clock + * @arg RCM_APB1_PERIPH_WWDT : Enable WWDT clock + * @arg RCM_APB1_PERIPH_SPI2 : Enable SPI2 clock + * @arg RCM_APB1_PERIPH_SPI3 : Enable SPI3 clock + * @arg RCM_APB1_PERIPH_USART2 : Enable USART2 clock + * @arg RCM_APB1_PERIPH_USART3 : Enable USART3 clock + * @arg RCM_APB1_PERIPH_UART4 : Enable UART4 clock + * @arg RCM_APB1_PERIPH_UART5 : Enable UART5 clock + * @arg RCM_APB1_PERIPH_I2C1 : Enable I2C1 clock + * @arg RCM_APB1_PERIPH_I2C2 : Enable I2C2 clock + * @arg RCM_APB1_PERIPH_USB : Enable USB clock + * @arg RCM_APB1_PERIPH_CAN1 : Enable CAN1 clock + * @arg RCM_APB1_PERIPH_CAN2 : Enable CAN2 clock + * @arg RCM_APB1_PERIPH_BAKR : Enable BAKR clock + * @arg RCM_APB1_PERIPH_PMU : Enable PMU clock + * @arg RCM_APB1_PERIPH_DAC : Enable DAC clock + * + * @retval None + */ +void RCM_EnableAPB1PeriphClock(uint32_t APB1Periph) +{ + RCM->APB1CLKEN |= APB1Periph; +} + +/*! + * @brief Disable the Low Speed APB (APB1) peripheral clock + * + * @param APB1Periph : Disable specifies clock of the APB1 peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_APB1_PERIPH_TMR2 : Disable TMR2 clock + * @arg RCM_APB1_PERIPH_TMR3 : Disable TMR3 clock + * @arg RCM_APB1_PERIPH_TMR4 : Disable TMR4 clock + * @arg RCM_APB1_PERIPH_TMR5 : Disable TMR5 clock + * @arg RCM_APB1_PERIPH_TMR6 : Disable TMR6 clock + * @arg RCM_APB1_PERIPH_TMR7 : Disable TMR7 clock + * @arg RCM_APB1_PERIPH_WWDT : Disable WWDT clock + * @arg RCM_APB1_PERIPH_SPI2 : Disable SPI2 clock + * @arg RCM_APB1_PERIPH_SPI3 : Disable SPI3 clock + * @arg RCM_APB1_PERIPH_USART2 : Disable USART2 clock + * @arg RCM_APB1_PERIPH_USART3 : Disable USART3 clock + * @arg RCM_APB1_PERIPH_UART4 : Disable UART4 clock + * @arg RCM_APB1_PERIPH_UART5 : Disable UART5 clock + * @arg RCM_APB1_PERIPH_I2C1 : Disable I2C1 clock + * @arg RCM_APB1_PERIPH_I2C2 : Disable I2C2 clock + * @arg RCM_APB1_PERIPH_USB : Disable USB clock + * @arg RCM_APB1_PERIPH_CAN1 : Disable CAN1 clock + * @arg RCM_APB1_PERIPH_CAN2 : Disable CAN2 clock + * @arg RCM_APB1_PERIPH_BAKR : Disable BAKR clock + * @arg RCM_APB1_PERIPH_PMU : Disable PMU clock + * @arg RCM_APB1_PERIPH_DAC : Disable DAC clock + * + * @retval None + */ +void RCM_DisableAPB1PeriphClock(uint32_t APB1Periph) +{ + RCM->APB1CLKEN &= (uint32_t)~APB1Periph; +} + +/*! + * @brief Enable High Speed APB (APB2) peripheral reset + * + * @param APB2Periph : Enable specifies APB2 peripheral reset. + * This parameter can be any combination of the following values: + * @arg RCM_APB2_PERIPH_AFIO : Enable AFIO reset + * @arg RCM_APB2_PERIPH_GPIOA : Enable GPIOA reset + * @arg RCM_APB2_PERIPH_GPIOB : Enable GPIOB reset + * @arg RCM_APB2_PERIPH_GPIOC : Enable GPIOC reset + * @arg RCM_APB2_PERIPH_GPIOD : Enable GPIOD reset + * @arg RCM_APB2_PERIPH_GPIOE : Enable GPIOE reset + * @arg RCM_APB2_PERIPH_GPIOF : Enable GPIOF reset + * @arg RCM_APB2_PERIPH_GPIOG : Enable GPIOG reset + * @arg RCM_APB2_PERIPH_ADC1 : Enable ADC1 reset + * @arg RCM_APB2_PERIPH_ADC2 : Enable ADC2 reset + * @arg RCM_APB2_PERIPH_TMR1 : Enable TMR1 reset + * @arg RCM_APB2_PERIPH_SPI1 : Enable SPI1 reset + * @arg RCM_APB2_PERIPH_TMR8 : Enable TMR8 reset + * @arg RCM_APB2_PERIPH_USART1 : Enable USART1 reset + * @arg RCM_APB2_PERIPH_ADC3 : Enable ADC3 reset + * + * @retval None + */ +void RCM_EnableAPB2PeriphReset(uint32_t APB2Periph) +{ + RCM->APB2RST |= APB2Periph; +} + +/*! + * @brief Disable High Speed APB (APB2) peripheral reset + * + * @param APB2Periph : Disable specifies APB2 peripheral reset. + * This parameter can be any combination of the following values: + * @arg RCM_APB2_PERIPH_AFIO : Disable AFIO reset + * @arg RCM_APB2_PERIPH_GPIOA : Disable GPIOA reset + * @arg RCM_APB2_PERIPH_GPIOB : Disable GPIOB reset + * @arg RCM_APB2_PERIPH_GPIOC : Disable GPIOC reset + * @arg RCM_APB2_PERIPH_GPIOD : Disable GPIOD reset + * @arg RCM_APB2_PERIPH_GPIOE : Disable GPIOE reset + * @arg RCM_APB2_PERIPH_GPIOF : Disable GPIOF reset + * @arg RCM_APB2_PERIPH_GPIOG : Disable GPIOG reset + * @arg RCM_APB2_PERIPH_ADC1 : Disable ADC1 reset + * @arg RCM_APB2_PERIPH_ADC2 : Disable ADC2 reset + * @arg RCM_APB2_PERIPH_TMR1 : Disable TMR1 reset + * @arg RCM_APB2_PERIPH_SPI1 : Disable SPI1 reset + * @arg RCM_APB2_PERIPH_TMR8 : Disable TMR8 reset + * @arg RCM_APB2_PERIPH_USART1 : Disable USART1 reset + * @arg RCM_APB2_PERIPH_ADC3 : Disable ADC3 reset + * + * @retval None + */ +void RCM_DisableAPB2PeriphReset(uint32_t APB2Periph) +{ + RCM->APB2RST &= (uint32_t)~APB2Periph; +} + +/*! + * @brief Enable Low Speed APB (APB1) peripheral reset + * + * @param APB1Periph : Enable specifies APB1 peripheral reset. + * This parameter can be any combination of the following values: + * @arg RCM_APB1_PERIPH_TMR2 : Enable TMR2 reset + * @arg RCM_APB1_PERIPH_TMR3 : Enable TMR3 reset + * @arg RCM_APB1_PERIPH_TMR4 : Enable TMR4 reset + * @arg RCM_APB1_PERIPH_TMR5 : Enable TMR5 reset + * @arg RCM_APB1_PERIPH_TMR6 : Enable TMR6 reset + * @arg RCM_APB1_PERIPH_TMR7 : Enable TMR7 reset + * @arg RCM_APB1_PERIPH_WWDT : Enable WWDT reset + * @arg RCM_APB1_PERIPH_SPI2 : Enable SPI2 reset + * @arg RCM_APB1_PERIPH_SPI3 : Enable SPI3 reset + * @arg RCM_APB1_PERIPH_USART2 : Enable USART2 reset + * @arg RCM_APB1_PERIPH_USART3 : Enable USART3 reset + * @arg RCM_APB1_PERIPH_UART4 : Enable UART4 reset + * @arg RCM_APB1_PERIPH_UART5 : Enable UART5 reset + * @arg RCM_APB1_PERIPH_I2C1 : Enable I2C1 reset + * @arg RCM_APB1_PERIPH_I2C2 : Enable I2C2 reset + * @arg RCM_APB1_PERIPH_USB : Enable USB reset + * @arg RCM_APB1_PERIPH_CAN1 : Enable CAN1 reset + * @arg RCM_APB1_PERIPH_CAN2 : Enable CAN2 reset + * @arg RCM_APB1_PERIPH_BAKR : Enable BAKR reset + * @arg RCM_APB1_PERIPH_PMU : Enable PMU reset + * @arg RCM_APB1_PERIPH_DAC : Enable DAC reset + * + * @retval None + */ +void RCM_EnableAPB1PeriphReset(uint32_t APB1Periph) +{ + RCM->APB1RST |= APB1Periph; +} + +/*! + * @brief Disable Low Speed APB (APB1) peripheral reset + * + * @param APB1Periph : Disable specifies APB1 peripheral reset. + * This parameter can be any combination of the following values: + * @arg RCM_APB1_PERIPH_TMR2 : Disable TMR2 reset + * @arg RCM_APB1_PERIPH_TMR3 : Disable TMR3 reset + * @arg RCM_APB1_PERIPH_TMR4 : Disable TMR4 reset + * @arg RCM_APB1_PERIPH_TMR5 : Disable TMR5 reset + * @arg RCM_APB1_PERIPH_TMR6 : Disable TMR6 reset + * @arg RCM_APB1_PERIPH_TMR7 : Disable TMR7 reset + * @arg RCM_APB1_PERIPH_WWDT : Disable WWDT reset + * @arg RCM_APB1_PERIPH_SPI2 : Disable SPI2 reset + * @arg RCM_APB1_PERIPH_SPI3 : Disable SPI3 reset + * @arg RCM_APB1_PERIPH_USART2 : Disable USART2 reset + * @arg RCM_APB1_PERIPH_USART3 : Disable USART3 reset + * @arg RCM_APB1_PERIPH_UART4 : Disable UART4 reset + * @arg RCM_APB1_PERIPH_UART5 : Disable UART5 reset + * @arg RCM_APB1_PERIPH_I2C1 : Disable I2C1 reset + * @arg RCM_APB1_PERIPH_I2C2 : Disable I2C2 reset + * @arg RCM_APB1_PERIPH_USB : Disable USB reset + * @arg RCM_APB1_PERIPH_CAN1 : Disable CAN1 reset + * @arg RCM_APB1_PERIPH_CAN2 : Disable CAN2 reset + * @arg RCM_APB1_PERIPH_BAKR : Disable BAKR reset + * @arg RCM_APB1_PERIPH_PMU : Disable PMU reset + * @arg RCM_APB1_PERIPH_DAC : Disable DAC reset + * + * @retval None + */ +void RCM_DisableAPB1PeriphReset(uint32_t APB1Periph) +{ + RCM->APB1RST &= (uint32_t)~APB1Periph; +} + +/*! + * @brief Enable the Backup domain reset + * + * @param None + * + * @retval None + * + * @note + */ +void RCM_EnableBackupReset(void) +{ + RCM->BDCTRL_B.BDRST = BIT_SET; +} + +/*! + * @brief Disable the Backup domain reset + * + * @param None + * + * @retval None + */ +void RCM_DisableBackupReset(void) +{ + RCM->BDCTRL_B.BDRST = BIT_RESET; +} + +/*! + * @brief Enable RCM interrupts + * + * @param interrupt : Enable specifies RCM interrupt sources. + * This parameter can be any combination of the following values: + * @arg RCM_INT_LSIRDY : LSI ready interrupt + * @arg RCM_INT_LSERDY : LSE ready interrupt + * @arg RCM_INT_HSIRDY : HSI ready interrupt + * @arg RCM_INT_HSERDY : HSE ready interrupt + * @arg RCM_INT_PLLRDY : PLL ready interrupt + * + * @retval None + */ +void RCM_EnableInterrupt(uint32_t interrupt) +{ + uint32_t temp; + + temp = interrupt << 8; + + RCM->INT |= temp; +} + +/*! + * @brief Disable RCM interrupts + * + * @param interrupt : Disable specifies RCM interrupt sources. + * This parameter can be any combination of the following values: + * @arg RCM_INT_LSIRDY : LSI ready interrupt + * @arg RCM_INT_LSERDY : LSE ready interrupt + * @arg RCM_INT_HSIRDY : HSI ready interrupt + * @arg RCM_INT_HSERDY : HSE ready interrupt + * @arg RCM_INT_PLLRDY : PLL ready interrupt + * + * @retval None + */ +void RCM_DisableInterrupt(uint32_t interrupt) +{ + uint32_t temp; + + temp = interrupt << 8; + + RCM->INT &= (uint32_t)~temp; +} + +/*! + * @brief Read the specified RCM flag status + * + * @param flag : Returns specifies the flag status. + * This parameter can be one of the following values: + * @arg RCM_FLAG_HSIRDY : HSI ready flag + * @arg RCM_FLAG_HSERDY : HSE ready flag + * @arg RCM_FLAG_PLLRDY : PLL ready flag + * @arg RCM_FLAG_LSERDY : LSE ready flag + * @arg RCM_FLAG_LSIRDY : LSI ready flag + * @arg RCM_FLAG_PINRST : NRST PIN Reset Occur Flag + * @arg RCM_FLAG_PORRST : POR/PDR Reset Occur Flag + * @arg RCM_FLAG_SWRST : Software Reset Occur Flag + * @arg RCM_FLAG_IWDTRST : Independent Watchdog Reset Occur Flag + * @arg RCM_FLAG_WWDTRST : Window Watchdog Reset Occur Flag + * @arg RCM_FLAG_LPRRST : Low Power Reset Occur Flag + * + * @retval The new state of flag (SET or RESET) + */ +uint8_t RCM_ReadStatusFlag(RCM_FLAG_T flag) +{ + uint32_t reg, bit; + + bit = (uint32_t)(1 << (flag & 0xff)); + + reg = (flag >> 8) & 0xff; + + switch (reg) + { + case 0: + reg = RCM->CTRL; + break; + + case 1: + reg = RCM->BDCTRL; + break; + + case 2: + reg = RCM->CSTS; + break; + + default: + break; + } + + if (reg & bit) + { + return SET; + } + + return RESET; +} + +/*! + * @brief Clears all the RCM reset flags + * + * @param None + * + * @retval None + * + * @note The reset flags are: + * RCM_FLAG_PINRST, RCM_FLAG_PWRST, RCM_FLAG_SWRST + * RCM_FLAG_IWDTRST, RCM_FLAG_WWDTRST, RCM_FLAG_LPRRST + */ +void RCM_ClearStatusFlag(void) +{ + RCM->CSTS_B.RSTFLGCLR = BIT_SET; +} + +/*! + * @brief Reads the specified RCM interrupt Flag + * + * @param flag ��Reads specifies RCM interrupt flag. + * This parameter can be one of the following values: + * @arg RCM_INT_LSIRDY : LSI ready interrupt flag + * @arg RCM_INT_LSERDY : LSE ready interrupt flag + * @arg RCM_INT_HSIRDY : HSI ready interrupt flag + * @arg RCM_INT_HSERDY : HSE ready interrupt flag + * @arg RCM_INT_PLLRDY : PLL ready interrupt flag + * @arg RCM_INT_CSS : Clock Security System interrupt flag + * + * @retval The new state of intFlag (SET or RESET) + */ +uint8_t RCM_ReadIntFlag(RCM_INT_T flag) +{ + uint8_t ret; + + ret = (RCM->INT& flag) ? SET : RESET; + + return ret; +} + +/*! + * @brief Clears the interrupt flag + * + * @param flag : Clears specifies interrupt flag. + * @arg RCM_INT_LSIRDY : Clear LSI ready interrupt flag + * @arg RCM_INT_LSERDY : Clear LSE ready interrupt flag + * @arg RCM_INT_HSIRDY : Clear HSI ready interrupt flag + * @arg RCM_INT_HSERDY : Clear HSE ready interrupt flag + * @arg RCM_INT_PLLRDY : Clear PLL ready interrupt flag + * @arg RCM_INT_CSS : Clear Clock Security System interrupt flag + * + * @retval None + */ +void RCM_ClearIntFlag(uint32_t flag) +{ + uint32_t temp; + + temp = flag << 16; + RCM->INT |= temp; +} + +/**@} end of group RCM_Functions */ +/**@} end of group RCM_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_rtc.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_rtc.c new file mode 100644 index 0000000000..7e4979dd19 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_rtc.c @@ -0,0 +1,266 @@ +/*! + * @file apm32e10x_rtc.c + * + * @brief This file provides all the RTC firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ +#include "apm32e10x_rtc.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup RTC_Driver + * @brief RTC driver modules + @{ +*/ + +/** @defgroup RTC_Functions Functions + @{ +*/ + +/*! + * @brief Enter RTC configuration mode. + * + * @param None + * + * @retval None + */ +void RTC_EnableConfigMode(void) +{ + RTC->CSTS_B.CFGMFLG = BIT_SET; +} + +/*! + * @brief Exit RTC configuration mode. + * + * @param None + * + * @retval None + */ +void RTC_DisableConfigMode(void) +{ + RTC->CSTS_B.CFGMFLG = BIT_RESET; +} + +/*! + * @brief Read the RTC counter value. + * + * @param None + * + * @retval RTC counter value. + */ +uint32_t RTC_ReadCounter(void) +{ + uint32_t reg = 0; + reg = (RTC->CNTH_B.CNTH) << 16; + reg |= (RTC->CNTL_B.CNTL); + return (reg); +} + +/*! + * @brief Config the RTC counter value. + * + * @param value: RTC counter new value. + * + * @retval None + */ +void RTC_ConfigCounter(uint32_t value) +{ + RTC_EnableConfigMode(); + RTC->CNTH_B.CNTH = value >> 16; + RTC->CNTL_B.CNTL = value & 0x0000FFFF; + RTC_DisableConfigMode(); +} + +/*! + * @brief Config the RTC prescaler value. + * + * @param value: RTC prescaler new value. + * + * @retval None + */ +void RTC_ConfigPrescaler(uint32_t value) +{ + RTC_EnableConfigMode(); + RTC->PSCRLDH_B.PSCRLDH = value >> 16; + RTC->PSCRLDL_B.PSCRLDL = value & 0x0000FFFF; + RTC_DisableConfigMode(); +} + +/*! + * @brief Config the RTC alarm value. + * + * @param value: RTC alarm new value. + * + * @retval None + */ +void RTC_ConfigAlarm(uint32_t value) +{ + RTC_EnableConfigMode(); + RTC->ALRH_B.ALRH = value >> 16; + RTC->ALRL_B.ALRL = value & 0x0000FFFF; + RTC_DisableConfigMode(); +} + +/*! + * @brief Reads the RTC divider value. + * + * @param None + * + * @retval RTC Divider value. + */ +uint32_t RTC_ReadDivider(void) +{ + uint32_t reg = 0; + reg = (RTC->PSCH_B.PSCH & 0x000F) << 16 ; + reg |= (RTC->PSCL_B.PSCL); + return (reg); +} + +/*! + * @brief Waits until last write operation on RTC registers has finished. + * + * @param None + * + * @retval None + */ +void RTC_WaitForLastTask(void) +{ + while(RTC->CSTS_B.OCFLG == BIT_RESET) + { + } +} + +/*! + * @brief Waits until the RTC registers + * + * @param None + * + * @retval None + */ +void RTC_WaitForSynchro(void) +{ + RTC->CSTS_B.RSYNCFLG = BIT_RESET; + while(RTC->CSTS_B.RSYNCFLG == BIT_RESET) + { + } +} + +/*! + * @brief Enable RTC interrupts. + * + * @param interrupt: specifies the RTC interrupt sources to be enabled + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt + */ +void RTC_EnableInterrupt(uint16_t interrupt) +{ + RTC->CTRL |= interrupt; +} + +/*! + * @brief Disable RTC interrupts. + * + * @param interrupt: specifies the RTC interrupt sources to be disabled + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt + * + * @retval None + */ +void RTC_DisableInterrupt(uint16_t interrupt) +{ + RTC->CTRL &= (uint32_t )~interrupt; +} + +/*! + * @brief Read flag bit + * + * @param flag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg RTC_FLAG_OC : RTC Operation Complete flag + * @arg RTC_FLAG_RSYNC: Registers Synchronized flag + * @arg RTC_FLAG_OVR : Overflow flag + * @arg RTC_FLAG_ALR : Alarm flag + * @arg RTC_FLAG_SEC : Second flag + * + * @retval flag bit + */ +uint8_t RTC_ReadStatusFlag(RTC_FLAG_T flag) +{ + return (RTC->CSTS & flag) ? SET : RESET; +} + +/*! + * @brief Clear flag bit + * + * @param flag: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg RTC_FLAG_OVR : Overflow flag + * @arg RTC_FLAG_ALR : Alarm flag + * @arg RTC_FLAG_SEC : Second flag + * + * @retval None + */ +void RTC_ClearStatusFlag(uint16_t flag) +{ + RTC->CSTS &= (uint32_t)~flag; +} + +/*! + * @brief Read interrupt flag bit is set + * + * @param flag: specifies the flag to check. + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt + * + * @retval None + */ +uint8_t RTC_ReadIntFlag(RTC_INT_T flag) +{ + return (RTC->CSTS & flag) ? SET : RESET; +} + +/*! + * @brief Clear RTC interrupt flag bit + * + * @param flag: specifies the flag to clear. + * This parameter can be one of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt + * + * @retval None + */ +void RTC_ClearIntFlag(uint16_t flag) +{ + RTC->CSTS &= (uint32_t)~flag; +} + +/**@} end of group RTC_Functions */ +/**@} end of group RTC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_sci2c.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_sci2c.c new file mode 100644 index 0000000000..38745c87e4 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_sci2c.c @@ -0,0 +1,913 @@ +/*! + * @file apm32e10x_sci2c.c + * + * @brief This file contains all the functions for the SCI2C peripheral + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_sci2c.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SCI2C_Driver + * @brief SCI2C driver modules + @{ +*/ + +/** @defgroup SCI2C_Functions Functions + @{ +*/ + +/*! + * @brief Set I2C peripheral registers to their default reset values + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_Reset(SCI2C_T *i2c) +{ + if(i2c == I2C3) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); + } + else + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_I2C2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_I2C2); + } + + i2c->SW = 0; + i2c->SW = 1; + i2c->INTEN = 0; +} + +/*! + * @brief Config the I2C peripheral according to the specified parameters in the sci2cConfig + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param sci2cConfig: pointer to a SCI2C_Config_T structure + * + * @retval None + */ +void SCI2C_Config(SCI2C_T *i2c, SCI2C_Config_T *sci2cConfig) +{ + i2c->SW = BIT_SET; + + i2c->CTRL2_B.I2CEN = BIT_RESET; + + if(sci2cConfig->mode == SCI2C_MODE_MASTER) + { + i2c->CTRL1_B.MST = BIT_SET; + i2c->CTRL1_B.SLADIS = BIT_SET; + } + else + { + i2c->CTRL1_B.MST = BIT_RESET; + } + + i2c->CTRL1_B.SPD = sci2cConfig->speed; + i2c->CTRL1_B.RSTAEN = sci2cConfig->restart; + + i2c->TFT = sci2cConfig->txFifoThreshold; + i2c->RFT = sci2cConfig->rxFifoThreshold; + + i2c->TARADDR_B.MAM = sci2cConfig->addrMode; + i2c->CTRL1_B.SAM = sci2cConfig->addrMode; + i2c->SLAADDR = sci2cConfig->slaveAddr; + + if(sci2cConfig->speed == SCI2C_SPEED_STANDARD) + { + i2c->SSCLC = sci2cConfig->clkLowPeriod; + i2c->SSCHC = sci2cConfig->clkHighPeriod; + } + else if(sci2cConfig->speed == SCI2C_SPEED_FAST) + { + i2c->FSCLC = sci2cConfig->clkLowPeriod; + i2c->FSCHC = sci2cConfig->clkHighPeriod; + } + else if(sci2cConfig->speed == SCI2C_SPEED_HIGH) + { + i2c->HSCLC = sci2cConfig->clkLowPeriod; + i2c->HSCHC = sci2cConfig->clkHighPeriod; + } +} + +/*! + * @brief Fills each sci2cConfig member with its default value + * + * @param sci2cConfig: pointer to a SCI2C_Config_T structure + * + * @retval None + */ +void SCI2C_ConfigStructInit(SCI2C_Config_T *sci2cConfig) +{ + sci2cConfig->addrMode = SCI2C_ADDR_MODE_7BIT; + sci2cConfig->slaveAddr = 0x55; + sci2cConfig->clkHighPeriod = 0x3C; + sci2cConfig->clkLowPeriod = 0x82; + sci2cConfig->mode = SCI2C_MODE_MASTER; + sci2cConfig->restart = SCI2C_RESTART_ENABLE; + sci2cConfig->rxFifoThreshold = 0; + sci2cConfig->txFifoThreshold = 0; + sci2cConfig->speed = SCI2C_SPEED_FAST; +} + +/*! + * @brief Read specified flag + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param flag: Specifies the flag to be checked + * The parameter can be one of following values: + * @arg SCI2C_FLAG_ACT: Activity flag + * @arg SCI2C_FLAG_TFNF: Tx FIFO not full flag + * @arg SCI2C_FLAG_TFE: TX FIFO empty flag + * @arg SCI2C_FLAG_RFNE: Rx FIFO not empty flag + * @arg SCI2C_FLAG_RFF: Rx FIFO full flag + * @arg SCI2C_FLAG_MA: Master activity flag + * @arg SCI2C_FLAG_SA: Slave activity flag + * @arg SCI2C_FLAG_I2CEN: I2C enable flag + * @arg SCI2C_FLAG_SDWB: Slave disable while busy flag + * @arg SCI2C_FLAG_SRDL: Slave receive data lost flag + * + * @retval The new state of flag (SET or RESET) + */ +uint8_t SCI2C_ReadStatusFlag(SCI2C_T *i2c, SCI2C_FLAG_T flag) +{ + uint8_t ret = RESET; + + if(flag & BIT8) + { + ret = i2c->STS2 & flag ? SET : RESET; + } + else + { + ret = i2c->STS1 & flag ? SET : RESET; + } + + return ret; +} + +/*! + * @brief Read specified interrupt flag + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param flag: Specifies the interrupt flag to be checked + * The parameter can be one of following values: + * @arg SCI2C_INT_RFU: Rx FIFO underflow interrupt flag + * @arg SCI2C_INT_RFO: Rx FIFO onverflow interrupt flag + * @arg SCI2C_INT_RFF: Rx FIFO full interrupt flag + * @arg SCI2C_INT_TFO: Tx FIFO onverflow interrupt flag + * @arg SCI2C_INT_TFE: Tx FIFO empty interrupt flag + * @arg SCI2C_INT_RR: Read request interrupt flag + * @arg SCI2C_INT_TA: Tx abort interrupt flag + * @arg SCI2C_INT_RD: Read done interrupt flag + * @arg SCI2C_INT_ACT: Activity interrupt flag + * @arg SCI2C_INT_STPD: Stop detect interrupt flag + * @arg SCI2C_INT_STAD: Start detect interrupt flag + * @arg SCI2C_INT_GC: Gernal call interrupt flag + * @arg SCI2C_INT_RSTAD: Restart detect interrupt flag + * @arg SCI2C_INT_MOH: Master on hold interrupt flag + * + * @retval The new state of flag (SET or RESET) + */ +uint8_t SCI2C_ReadIntFlag(SCI2C_T *i2c, SCI2C_INT_T flag) +{ + uint8_t ret = RESET; + + ret = i2c->INTSTS & flag ? SET : RESET; + + return ret; +} + +/*! + * @brief Clear specified interrupt flag + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param flag: Specifies the interrupt flag to be checked + * The parameter can be one of following values: + * @arg SCI2C_INT_RFU: Rx FIFO underflow interrupt flag + * @arg SCI2C_INT_RFO: Rx FIFO onverflow interrupt flag + * @arg SCI2C_INT_TFO: Tx FIFO onverflow interrupt flag + * @arg SCI2C_INT_RR: Read request interrupt flag + * @arg SCI2C_INT_TA: Tx abort interrupt flag + * @arg SCI2C_INT_RD: Read done interrupt flag + * @arg SCI2C_INT_ACT: Activity interrupt flag + * @arg SCI2C_INT_STPD: Stop detect interrupt flag + * @arg SCI2C_INT_STAD: Start detect interrupt flag + * @arg SCI2C_INT_GC: Gernal call interrupt flag + * @arg SCI2C_INT_ALL: All interrupt flag + * @retval The new state of flag (SET or RESET) + */ +void SCI2C_ClearIntFlag(SCI2C_T *i2c, SCI2C_INT_T flag) +{ + volatile uint32_t dummy = 0; + + if(flag == SCI2C_INT_ALL) + { + dummy = i2c->INTCLR; + } + else if(flag == SCI2C_INT_RFU) + { + dummy = i2c->RFUIC; + } + else if(flag == SCI2C_INT_RFO) + { + dummy = i2c->RFOIC; + } + else if(flag == SCI2C_INT_TFO) + { + dummy = i2c->TFOIC; + } + else if(flag == SCI2C_INT_RR) + { + dummy = i2c->RRIC; + } + else if(flag == SCI2C_INT_TA) + { + dummy = i2c->TAIC; + } + else if(flag == SCI2C_INT_RD) + { + dummy = i2c->RDIC; + } + else if(flag == SCI2C_INT_ACT) + { + dummy = i2c->AIC; + } + else if(flag == SCI2C_INT_STPD) + { + dummy = i2c->STPDIC; + } + else if(flag == SCI2C_INT_STAD) + { + dummy = i2c->STADIC; + } + else if(flag == SCI2C_INT_GC) + { + dummy = i2c->GCIC; + } +} + +/*! + * @brief Read specified interrupt flag(Raw register) + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param flag: Specifies the interrupt flag to be checked + * The parameter can be one of following values: + * @arg SCI2C_INT_RFU: Rx FIFO underflow interrupt flag + * @arg SCI2C_INT_RFO: Rx FIFO onverflow interrupt flag + * @arg SCI2C_INT_RFF: Rx FIFO full interrupt flag + * @arg SCI2C_INT_TFO: Tx FIFO onverflow interrupt flag + * @arg SCI2C_INT_TFE: Tx FIFO empty interrupt flag + * @arg SCI2C_INT_RR: Read request interrupt flag + * @arg SCI2C_INT_TA: Tx abort interrupt flag + * @arg SCI2C_INT_RD: Read done interrupt flag + * @arg SCI2C_INT_ACT: Activity interrupt flag + * @arg SCI2C_INT_STPD: Stop detect interrupt flag + * @arg SCI2C_INT_STAD: Start detect interrupt flag + * @arg SCI2C_INT_GC: Gernal call interrupt flag + * @arg SCI2C_INT_RSTAD: Restart detect interrupt flag + * @arg SCI2C_INT_MOH: Master on hold interrupt flag + * + * @retval The new state of flag (SET or RESET) + */ +uint8_t SCI2C_ReadRawIntFlag(SCI2C_T *i2c, SCI2C_INT_T flag) +{ + uint8_t ret = RESET; + + ret = i2c->RIS & flag ? SET : RESET; + + return ret; +} + +/*! + * @brief Enable the specified interrupts + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param interrupt: Specifies the interrupt sources + * The parameter can be any combination of following values: + * @arg SCI2C_INT_RFU: Rx FIFO underflow interrupt + * @arg SCI2C_INT_RFO: Rx FIFO onverflow interrupt + * @arg SCI2C_INT_RFF: Rx FIFO full interrupt + * @arg SCI2C_INT_TFO: Tx FIFO onverflow interrupt + * @arg SCI2C_INT_TFE: Tx FIFO empty interrupt + * @arg SCI2C_INT_RR: Read request interrupt + * @arg SCI2C_INT_TA: Tx abort interrupt + * @arg SCI2C_INT_RD: Read done interrupt + * @arg SCI2C_INT_ACT: Activity interrupt + * @arg SCI2C_INT_STPD: Stop detect interrupt + * @arg SCI2C_INT_STAD: Start detect interrupt + * @arg SCI2C_INT_GC: Gernal call interrupt + * @arg SCI2C_INT_RSTAD: Restart detect interrupt + * @arg SCI2C_INT_MOH: Master on hold interrupt + * + * @retval None + */ +void SCI2C_EnableInterrupt(SCI2C_T *i2c, uint16_t interrupt) +{ + i2c->INTEN |= interrupt; +} + +/*! + * @brief Disable the specified interrupts + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param interrupt: Specifies the interrupt sources + * The parameter can be any combination of following values: + * @arg SCI2C_INT_RFU: Rx FIFO underflow interrupt + * @arg SCI2C_INT_RFO: Rx FIFO onverflow interrupt + * @arg SCI2C_INT_RFF: Rx FIFO full interrupt + * @arg SCI2C_INT_TFO: Tx FIFO onverflow interrupt + * @arg SCI2C_INT_TFE: Tx FIFO empty interrupt + * @arg SCI2C_INT_RR: Read request interrupt + * @arg SCI2C_INT_TA: Tx abort interrupt + * @arg SCI2C_INT_RD: Read done interrupt + * @arg SCI2C_INT_ACT: Activity interrupt + * @arg SCI2C_INT_STPD: Stop detect interrupt + * @arg SCI2C_INT_STAD: Start detect interrupt + * @arg SCI2C_INT_GC: Gernal call interrupt + * @arg SCI2C_INT_RSTAD: Restart detect interrupt + * @arg SCI2C_INT_MOH: Master on hold interrupt + * + * @retval None + */ +void SCI2C_DisableInterrupt(SCI2C_T *i2c, uint16_t interrupt) +{ + i2c->INTEN &= ~interrupt; +} + +/*! + * @brief Enable stop detected only master in activity. + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + */ +void SCI2C_EnableStopDetectMasterActivity(SCI2C_T *i2c) +{ + i2c->CTRL1_B.DSMA = BIT_SET; +} + +/*! + * @brief Disable stop detected only master in activity. + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + */ +void SCI2C_DisableStopDetectMasterActivity(SCI2C_T *i2c) +{ + i2c->CTRL1_B.DSMA = BIT_RESET; +} + +/*! + * @brief Enable stop detected only address is matched in slave mode. + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + */ +void SCI2C_EnableStopDetectAddressed(SCI2C_T *i2c) +{ + i2c->CTRL1_B.DSA = BIT_SET; +} + +/*! + * @brief Disable stop detected only address is matched in slave mode. + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + */ +void SCI2C_DisableStopDetectAddressed(SCI2C_T *i2c) +{ + i2c->CTRL1_B.DSA = BIT_RESET; +} + +/*! + * @brief Enable restart + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_EnableRestart(SCI2C_T *i2c) +{ + i2c->CTRL1_B.RSTAEN = BIT_SET; +} + +/*! + * @brief Disable restart + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_DisableRestart(SCI2C_T *i2c) +{ + i2c->CTRL1_B.RSTAEN = BIT_RESET; +} + +/*! + * @brief Config speed. + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param speed: Specifies the speed. + * @arg SCI2C_SPEED_STANDARD: Standard speed. + * @arg SCI2C_SPEED_FAST: Fast speed. + * @arg SCI2C_SPEED_HIGH: High speed. + * + * @retval None + */ +void SCI2C_ConfigSpeed(SCI2C_T *i2c, SCI2C_SPEED_T speed) +{ + i2c->CTRL1_B.SPD = speed; +} + +/*! + * @brief Config master address. + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param mode: Specifies the address mode. + * @arg SCI2C_ADDR_MODE_7BIT: 7-bit address mode. + * @arg SCI2C_ADDR_MODE_10BIT: 10-bit address mode. + * + * @param addr: Specifies the address. + * + * @retval None + */ +void SCI2C_ConfigMasterAddr(SCI2C_T *i2c, SCI2C_ADDR_MODE_T mode, uint16_t addr) +{ + i2c->TARADDR_B.MAM = mode; + i2c->TARADDR_B.ADDR = addr; +} + + +/*! + * @brief Config slave address. + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param mode: Specifies the address mode. + * @arg SCI2C_ADDR_MODE_7BIT: 7-bit address mode. + * @arg SCI2C_ADDR_MODE_10BIT: 10-bit address mode. + * + * @param addr: Specifies the address. + * + * @retval None + */ +void SCI2C_ConfigSlaveAddr(SCI2C_T *i2c, SCI2C_ADDR_MODE_T mode, uint16_t addr) +{ + i2c->CTRL1_B.SAM = mode; + i2c->SLAADDR = addr; +} + +/*! + * @brief Enable master mode + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_EnableMasterMode(SCI2C_T *i2c) +{ + i2c->CTRL1_B.MST = BIT_SET; +} + +/*! + * @brief Disable master mode + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_DisableMasterMode(SCI2C_T *i2c) +{ + i2c->CTRL1_B.MST = BIT_RESET; +} + +/*! + * @brief Enable slave mode + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_EnableSlaveMode(SCI2C_T *i2c) +{ + i2c->CTRL1_B.SLADIS = BIT_RESET; +} + +/*! + * @brief Disable slave mode + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_DisableSlaveMode(SCI2C_T *i2c) +{ + i2c->CTRL1_B.SLADIS = BIT_SET; +} + +/*! + * @brief Config master code + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param code: Master code + * + * @retval None + */ +void SCI2C_ConfigMasterCode(SCI2C_T *i2c, uint8_t code) +{ + i2c->HSMC = code; +} + +/*! + * @brief Config data direction + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param dir: Data direction + * @arg SCI2C_DATA_DIR_WRITE: Write data + * @arg SCI2C_DATA_DIR_READ: Read data + * + * @retval None + */ +void SCI2C_ConfigDataDir(SCI2C_T *i2c, SCI2C_DATA_DIR_T dir) +{ + i2c->DATA = (uint32_t)(dir << 8); +} + +/*! + * @brief Transmit data + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param data: Data to be transmited + * + * @retval None + */ +void SCI2C_TxData(SCI2C_T *i2c, uint8_t data) +{ + i2c->DATA_B.DATA = data; +} + +/*! + * @brief Returns the most recent received data + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval Received data + * + * @note + */ +uint8_t SCI2C_RxData(SCI2C_T *i2c) +{ + return (uint8_t)(i2c->DATA & 0XFF); +} + +/*! + * @brief Config data register + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param stop: Enable or disable generate stop condition + * + * @param dataDir: Data direction. Read or write + * @arg SCI2C_DATA_DIR_WRITE: Write data + * @arg SCI2C_DATA_DIR_READ: Read data + * + * @param data: Data to be transmited + * + * @retval None + */ +void SCI2C_ConfigDataRegister(SCI2C_T *i2c, SCI2C_STOP_T stop, SCI2C_DATA_DIR_T dataDir, uint8_t data) +{ + i2c->DATA = (uint32_t)((stop << 9) | (dataDir << 8) | data); +} + +/*! + * @brief Read Rx FIFO data number + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +uint8_t SCI2C_ReadRxFifoDataCnt(SCI2C_T *i2c) +{ + return (uint8_t)i2c->RFL; +} + +/*! + * @brief Read Tx FIFO data number + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +uint8_t SCI2C_ReadTxFifoDataCnt(SCI2C_T *i2c) +{ + return (uint8_t)i2c->TFL; +} + +/*! + * @brief Config Rx FIFO threshold + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param threshold: FIFO threshold + * + * @retval None + */ +void SCI2C_ConfigRxFifoThreshold(SCI2C_T *i2c, uint8_t threshold) +{ + i2c->RFT = threshold; +} + +/*! + * @brief Config Tx FIFO threshold + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param threshold: FIFO threshold + * + * @retval None + */ +void SCI2C_ConfigTxFifoThreshold(SCI2C_T *i2c, uint8_t threshold) +{ + i2c->TFT = threshold; +} + +/*! + * @brief Enable I2C peripheral + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + + */ +void SCI2C_Enable(SCI2C_T *i2c) +{ + i2c->CTRL2_B.I2CEN = BIT_SET; +} + +/*! + * @brief Disable I2C peripheral + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_Disable(SCI2C_T *i2c) +{ + i2c->CTRL2_B.I2CEN = BIT_RESET; +} + +/*! + * @brief Abort I2C transmit + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval None + */ +void SCI2C_Abort(SCI2C_T *i2c) +{ + i2c->CTRL2_B.ABR = BIT_SET; +} + +/*! + * @brief Tx command block + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param enable: ENABLE or DISABLE + * + * @retval None + */ +void SCI2C_BlockTxCmd(SCI2C_T *i2c, uint8_t enable) +{ + i2c->CTRL2_B.TCB = enable; +} + +/*! + * @brief Config SCL high and low period + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param speed: Specifies the speed. + * @arg SCI2C_SPEED_STANDARD: Standard speed. + * @arg SCI2C_SPEED_FAST: Fast speed. + * @arg SCI2C_SPEED_HIGH: High speed. + * + * @param highPeriod: SCL high period + * + * @param lowPeriod: SCL low period + * + * @retval None + */ +void SCI2C_ConfigClkPeriod(SCI2C_T *i2c, SCI2C_SPEED_T speed, uint16_t highPeriod, uint16_t lowPeriod) +{ + if(speed == SCI2C_SPEED_STANDARD) + { + i2c->SSCLC = lowPeriod; + i2c->SSCHC = highPeriod; + } + else if(speed == SCI2C_SPEED_FAST) + { + i2c->FSCLC = lowPeriod; + i2c->FSCHC = highPeriod; + } + else if(speed == SCI2C_SPEED_HIGH) + { + i2c->HSCLC = lowPeriod; + i2c->HSCHC = highPeriod; + } +} + +/*! + * @brief Config SDA hold time length + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param txHold: Tx SDA hold time length + * + * @param rxHold: Rx SDA hold time length + * + * @retval None + */ +void SCI2C_ConfigSDAHoldTime(SCI2C_T *i2c, uint16_t txHold, uint8_t rxHold) +{ + i2c->SDAHOLD_B.TXHOLD = txHold; + i2c->SDAHOLD_B.RXHOLD = rxHold; +} + +/*! + * @brief Config SDA delay time + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param delay: SDA delay time + * + * @retval None + */ +void SCI2C_ConfigSDADelayTime(SCI2C_T *i2c, uint8_t delay) +{ + i2c->SDADLY = delay; +} + +/*! + * @brief Enable or disable generate gernal call ack + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param enable: SDA delay time + * + * @retval None + */ +void SCI2C_GernalCallAck(SCI2C_T *i2c, uint8_t enable) +{ + i2c->GCA = enable; +} + +/*! + * @brief When received data no ack generated in slave mode. + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param enable: ENABLE or DISABLE + * + * @retval None + */ +void SCI2C_SlaveDataNackOnly(SCI2C_T *i2c, uint8_t enable) +{ + i2c->SDNO = enable; +} + +/*! + * @brief Read Tx abort source + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @retval Return Tx abort source + */ +uint32_t SCI2C_ReadTxAbortSource(SCI2C_T *i2c) +{ + return (uint32_t)i2c->TAS; +} + +/*! + * @brief Enable DMA + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param dma: DMA requst source + * @arg SCI2C_DMA_RX: DMA RX channel + * @arg SCI2C_DMA_TX: DMA TX channel + * + * @retval None + */ +void SCI2C_EnableDMA(SCI2C_T *i2c, SCI2C_DMA_T dma) +{ + i2c->DMACTRL |= dma; +} + +/*! + * @brief Disable DMA + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param dma: DMA requst source + * @arg SCI2C_DMA_RX: DMA RX channel + * @arg SCI2C_DMA_TX: DMA TX channel + * + * @retval None + */ +void SCI2C_DisableDMA(SCI2C_T *i2c, SCI2C_DMA_T dma) +{ + i2c->DMACTRL &= (uint32_t)~dma; +} + +/*! + * @brief Config DMA Tx data level + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param cnt: DMA Tx data level + * + * @retval None + */ +void SCI2C_ConfigDMATxDataLevel(SCI2C_T *i2c, uint8_t cnt) +{ + i2c->DTDL = cnt; +} + +/*! + * @brief Config DMA Rx data level + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param cnt: DMA Rx data level + * + * @retval None + */ +void SCI2C_ConfigDMARxDataLevel(SCI2C_T *i2c, uint8_t cnt) +{ + i2c->DRDL = cnt; +} + +/*! + * @brief Config spike suppressio limit + * + * @param i2c: Select the the I2C peripheral.It can be I2C3 or I2C4 + * + * @param speed: I2C speed mode + * @arg SCI2C_SPEED_STANDARD: Standard speed. + * @arg SCI2C_SPEED_FAST: Fast speed. + * @arg SCI2C_SPEED_HIGH: High speed. + * + * @param limit: Spike suppressio limit value + * + * @retval None + */ +void SCI2C_ConfigSpikeSuppressionLimit(SCI2C_T *i2c, SCI2C_SPEED_T speed, uint8_t limit) +{ + if(speed == SCI2C_SPEED_HIGH) + { + i2c->HSSSL = limit; + } + else + { + i2c->LSSSL = limit; + } +} + +/**@} end of group SCI2C_Functions */ +/**@} end of group SCI2C_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ + diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_sdio.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_sdio.c new file mode 100644 index 0000000000..2240db6122 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_sdio.c @@ -0,0 +1,745 @@ +/*! + * @file apm32e10x_sdio.c + * + * @brief This file provides all the SDIO firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_sdio.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SDIO_Driver + * @brief SDIO driver modules + @{ +*/ + +/** @defgroup SDIO_Functions Functions + @{ +*/ + +/*! + * @brief Reset sdio peripheral registers to their default reset values + * + * @param None + * + * @retval None + */ +void SDIO_Reset(void) +{ + SDIO->PWRCTRL = 0x00000000; + SDIO->CLKCTRL = 0x00000000; + SDIO->ARG = 0x00000000; + SDIO->CMD = 0x00000000; + SDIO->DATATIME = 0x00000000; + SDIO->DATALEN = 0x00000000; + SDIO->DCTRL = 0x00000000; + SDIO->ICF = 0x00C007FF; + SDIO->MASK = 0x00000000; +} + +/*! + * @brief Config the SDIO peripheral according to the specified parameters in the sdioConfig + * + * @param sdioConfig: pointer to a SDIO_Config_T structure + * + * @retval None + */ +void SDIO_Config(SDIO_Config_T* sdioConfig) +{ + uint32_t tmp = 0; + + tmp = SDIO->CLKCTRL; + tmp &= 0xFFFF8100; + + tmp |= (sdioConfig->clockDiv | sdioConfig->clockPowerSave | sdioConfig->clockBypass | sdioConfig->busWide | + sdioConfig->clockEdge | sdioConfig->hardwareFlowControl); + + SDIO->CLKCTRL = tmp; +} + +/*! + * @brief Fills each SDIO_Config_T member with its default value + * + * @param sdioConfig: pointer to a SDIO_Config_T structure + * + * @retval None + */ +void SDIO_ConfigStructInit(SDIO_Config_T* sdioConfig) +{ + sdioConfig->clockDiv = 0x00; + sdioConfig->clockEdge = SDIO_CLOCK_EDGE_RISING; + sdioConfig->clockBypass = SDIO_CLOCK_BYPASS_DISABLE; + sdioConfig->clockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + sdioConfig->busWide = SDIO_BUSWIDE_1B; + sdioConfig->hardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; +} + +/*! + * @brief Enables the SDIO clock + * + * @param None + * + * @retval None + */ +void SDIO_EnableClock(void) +{ + *(__IO uint32_t *) CLKCTRL_CLKEN_BB = (uint32_t)SET; +} + +/*! + * @brief Disables the SDIO clock + * + * @param None + * + * @retval None + */ +void SDIO_DisableClock(void) +{ + *(__IO uint32_t *) CLKCTRL_CLKEN_BB = (uint32_t)RESET; +} + +/*! + * @brief Sets the power status of the controller + * + * @param powerState: new state of the Power state + * The parameter can be one of following values: + * @arg SDIO_POWER_STATE_OFF + * @arg SDIO_POWER_STATE_ON + * @retval None + */ +void SDIO_ConfigPowerState(SDIO_POWER_STATE_T powerState) +{ + SDIO->PWRCTRL &= 0xFFFFFFFC; + SDIO->PWRCTRL |= powerState; +} + +/*! + * @brief Reads the SDIO power state + * + * @param None + * + * @retval The new state SDIO power + * + * @note 0x00:Power OFF, 0x02:Power UP, 0x03:Power ON + */ +uint32_t SDIO_ReadPowerState(void) +{ + return (SDIO->PWRCTRL & (~0xFFFFFFFC)); +} + +/*! + * @brief Enables the SDIO DMA request + * + * @param None + * + * @retval None + */ +void SDIO_EnableDMA(void) +{ + *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)SET; +} + +/*! + * @brief Disables the SDIO DMA request + * + * @param None + * + * @retval None + */ +void SDIO_DisableDMA(void) +{ + *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)RESET; +} + +/*! + * @brief Configs the SDIO Command and send the command + * + * @param cmdConfig: pointer to a SDIO_CMDConfig_T structure + * + * @retval None + * + * @note + */ +void SDIO_TxCommand(SDIO_CMDConfig_T *cmdConfig) +{ + uint32_t tmpreg = 0; + + SDIO->ARG = cmdConfig->argument; + tmpreg = SDIO->CMD; + tmpreg &= 0xFFFFF800; + tmpreg |= (uint32_t)cmdConfig->cmdIndex | cmdConfig->response + | cmdConfig->wait | cmdConfig->CPSM; + SDIO->CMD = tmpreg; +} + +/*! + * @brief Fills each SDIO_CMD_ConfigStruct_T member with its default value + * + * @param cmdConfig: pointer to a SDIO_CMDConfig_T structure + * + * @retval None + * + * @note + */ +void SDIO_TxCommandStructInit(SDIO_CMDConfig_T* cmdConfig) +{ + cmdConfig->argument = 0x00; + cmdConfig->cmdIndex = 0x00; + cmdConfig->response = SDIO_RESPONSE_NO; + cmdConfig->wait = SDIO_WAIT_NO; + cmdConfig->CPSM = SDIO_CPSM_DISABLE; +} + +/*! + * @brief Reads the SDIO command response + * + * @param None + * + * @retval The command index of the last command response received + * + * @note + */ +uint8_t SDIO_ReadCommandResponse(void) +{ + return (uint8_t)(SDIO->CMDRES); +} + +/*! + * @brief Reads the SDIO response + * + * @param res: Specifies the SDIO response register + * The parameter can be one of following values: + * @arg SDIO_RES1: Response Register 1 + * @arg SDIO_RES2: Response Register 2 + * @arg SDIO_RES3: Response Register 3 + * @arg SDIO_RES4: Response Register 4 + * + * @retval The Corresponding response register value + */ +uint32_t SDIO_ReadResponse(SDIO_RES_T res) +{ + __IO uint32_t tmp = 0; + + tmp = ((uint32_t)(SDIO_BASE + 0x14)) + res; + + return (*(__IO uint32_t *) tmp); +} + +/*! + * @brief Configs the SDIO Dataaccording to the specified parameters in the dataConfig + * + * @param dataConfig: pointer to a SDIO_DataConfig_T structure + * + * @retval None + */ +void SDIO_ConfigData(SDIO_DataConfig_T* dataConfig) +{ + uint32_t tmpreg = 0; + + SDIO->DATATIME = dataConfig->dataTimeOut; + + SDIO->DATALEN = dataConfig->dataLength; + + tmpreg = SDIO->DCTRL; + + tmpreg &= 0xFFFFFF08; + + tmpreg |= (uint32_t)dataConfig->dataBlockSize | dataConfig->transferDir + | dataConfig->transferMode | dataConfig->DPSM; + + SDIO->DCTRL = tmpreg; +} + +/*! + * @brief Fills each SDIO_DataConfig_T member with its default value + * + * @param dataConfig: pointer to a SDIO_DataConfig_T structure + * + * @retval None + */ +void SDIO_ConfigDataStructInit(SDIO_DataConfig_T* dataConfig) +{ + dataConfig->dataTimeOut = 0xFFFFFFFF; + dataConfig->dataLength = 0x00; + dataConfig->dataBlockSize = SDIO_DATA_BLOCKSIZE_1B; + dataConfig->transferDir = SDIO_TRANSFER_DIR_TOCARD; + dataConfig->transferMode = SDIO_TRANSFER_MODE_BLOCK; + dataConfig->DPSM = SDIO_DPSM_DISABLE; +} + +/*! + * @brief Reads the SDIO Data counter + * + * @param None + * + * @retval The SDIO Data counter value + */ +uint32_t SDIO_ReadDataCounter(void) +{ + return SDIO->DCNT; +} + +/*! + * @brief Write the SDIO Data + * + * @param Data��Write 32-bit data + * + * @retval None + */ +void SDIO_WriteData(uint32_t data) +{ + SDIO->FIFODATA = data; +} + +/*! + * @brief Reads the SDIO Data + * + * @param None + * + * @retval The SDIO FIFO Data value + */ +uint32_t SDIO_ReadData(void) +{ + return SDIO->FIFODATA; +} + +/*! + * @brief Reads the SDIO FIFO count value + * + * @param None + * + * @retval The SDIO FIFO count value + */ +uint32_t SDIO_ReadFIFOCount(void) +{ + return SDIO->FIFOCNT; +} + +/*! + * @brief Enables SDIO start read wait + * + * @param None + * + * @retval None + */ +void SDIO_EnableStartReadWait(void) +{ + *(__IO uint32_t *) DCTRL_RWSTR_BB = (uint32_t) SET; +} + +/*! + * @brief Disables SDIO start read wait + * + * @param None + * + * @retval None + */ +void SDIO_DisableStopReadWait(void) +{ + *(__IO uint32_t *) DCTRL_RWSTR_BB = (uint32_t) RESET; +} + +/*! + * @brief Enables SDIO stop read wait + * + * @param None + * + * @retval None + */ +void SDIO_EnableStopReadWait(void) +{ + *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) SET; +} + +/*! + * @brief Disables SDIO stop read wait + * + * @param None + * + * @retval None + */ +void SDIO_DisableStartReadWait(void) +{ + *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) RESET; +} + +/*! + * @brief Sets the read wait interval + * + * @param readWaitMode: SDIO read Wait Mode + * The parameter can be one of following values: + * @arg SDIO_READ_WAIT_MODE_CLK: Read Wait control by stopping SDIOCLK + * @arg SDIO_READ_WAIT_MODE_DATA2: Read Wait control using SDIO_DATA2 + * + * @retval None + * + * @note + */ +void SDIO_ConfigSDIOReadWaitMode(SDIO_READ_WAIT_MODE_T readWaitMode) +{ + *(__IO uint32_t *) DCTRL_RDWAIT_BB = readWaitMode; +} +/*! + * @brief Enables SDIO SD I/O Mode Operation + * + * @param None + * + * @retval None + */ +void SDIO_EnableSDIO(void) +{ + *(__IO uint32_t *) DCTRL_SDIOF_BB = (uint32_t)SET; +} + +/*! + * @brief Disables SDIO SD I/O Mode Operation + * + * @param None + * + * @retval None + */ +void SDIO_DisableSDIO(void) +{ + *(__IO uint32_t *) DCTRL_SDIOF_BB = (uint32_t)RESET; +} + +/*! + * @brief Ensables SDIO SD I/O Mode suspend command sending + * + * @param None + * + * @retval None + */ +void SDIO_EnableTxSDIOSuspend(void) +{ + *(__IO uint32_t *) CMD_SDIOSC_BB = (uint32_t)SET; +} + +/*! + * @brief Disables SDIO SD I/O Mode suspend command sending + * + * @param None + * + * @retval None + */ +void SDIO_DisableTxSDIOSuspend(void) +{ + *(__IO uint32_t *) CMD_SDIOSC_BB = (uint32_t)RESET; +} + +/*! + * @brief Enables the command completion signal + * + * @param None + * + * @retval None + */ +void SDIO_EnableCommandCompletion(void) +{ + *(__IO uint32_t *) CMD_CMDCPEN_BB = (uint32_t)SET; +} + +/*! + * @brief Disables the command completion signal + * + * @param None + * + * @retval None + */ +void SDIO_DisableCommandCompletion(void) +{ + *(__IO uint32_t *) CMD_CMDCPEN_BB = (uint32_t)RESET; +} + +/*! + * @brief Enables the CE-ATA interrupt + * + * @param None + * + * @retval None + */ +void SDIO_EnableCEATAInterrupt(void) +{ + *(__IO uint32_t *) CMD_INTEN_BB = (uint32_t)((~((uint32_t)SET)) & ((uint32_t)0x1)); +} + +/*! + * @brief Disables the CE-ATA interrupt + * + * @param None + * + * @retval None + */ +void SDIO_DisableCEATAInterrupt(void) +{ + *(__IO uint32_t *) CMD_INTEN_BB = (uint32_t)((~((uint32_t)RESET)) & ((uint32_t)0x1)); +} + +/*! + * @brief Ensables Sends CE-ATA command + * + * @param None + * + * @retval None + */ +void SDIO_EnableTxCEATA(void) +{ + *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)SET; +} + +/*! + * @brief Disables Sends CE-ATA command + * + * @param None + * + * @retval None + */ +void SDIO_DisableTxCEATA(void) +{ + *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)RESET; +} + +/*! + * @brief Enables the specified SDIO interrupt + * + * @param interrupt: Select the SDIO interrupt source + * The parameter can be any combination of following values: + * @arg SDIO_INT_COMRESP: Command response received (CRC check failed) interrupt + * @arg SDIO_INT_DBDR: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_INT_CMDRESTO: Command response timeout interrupt + * @arg SDIO_INT_DATATO: Data timeout interrupt + * @arg SDIO_INT_TXUDRER: Transmit FIFO underrun error interrupt + * @arg SDIO_INT_RXOVRER: Received FIFO overrun error interrupt + * @arg SDIO_INT_CMDRES: Command response received (CRC check passed) interrupt + * @arg SDIO_INT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_INT_DATAEND: Data end (data counter is zero) interrupt + * @arg SDIO_INT_SBE: Start bit not detected on all data signals in wide bus mode interrupt + * @arg SDIO_INT_DBCP: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_INT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_INT_TXACT: Data transmit in progress interrupt + * @arg SDIO_INT_RXACT: Data receive in progress interrupt + * @arg SDIO_INT_TXFHF: Transmit FIFO Half Empty interrupt + * @arg SDIO_INT_RXFHF: Receive FIFO Half Full interrupt + * @arg SDIO_INT_TXFF: Transmit FIFO full interrupt + * @arg SDIO_INT_RXFF: Receive FIFO full interrupt + * @arg SDIO_INT_TXFE: Transmit FIFO empty interrupt + * @arg SDIO_INT_RXFE: Receive FIFO empty interrupt + * @arg SDIO_INT_TXDA: Data available in transmit FIFO interrupt + * @arg SDIO_INT_RXDA: Data available in receive FIFO interrupt + * @arg SDIO_INT_SDIOINT: SD I/O interrupt received interrupt + * @arg SDIO_INT_ATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @retval None + */ +void SDIO_EnableInterrupt(uint32_t interrupt) +{ + SDIO->MASK |= interrupt; +} + +/*! + * @brief Disables the specified SDIO interrupt + * + * @param interrupt: Select the SDIO interrupt source + * The parameter can be any combination of following values: + * @arg SDIO_INT_COMRESP: Command response received (CRC check failed) interrupt + * @arg SDIO_INT_DBDR: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_INT_CMDRESTO: Command response timeout interrupt + * @arg SDIO_INT_DATATO: Data timeout interrupt + * @arg SDIO_INT_TXUDRER: Transmit FIFO underrun error interrupt + * @arg SDIO_INT_RXOVRER: Received FIFO overrun error interrupt + * @arg SDIO_INT_CMDRES: Command response received (CRC check passed) interrupt + * @arg SDIO_INT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_INT_DATAEND: Data end (data counter is zero) interrupt + * @arg SDIO_INT_SBE: Start bit not detected on all data signals in wide bus mode interrupt + * @arg SDIO_INT_DBCP: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_INT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_INT_TXACT: Data transmit in progress interrupt + * @arg SDIO_INT_RXACT: Data receive in progress interrupt + * @arg SDIO_INT_TXFHF: Transmit FIFO Half Empty interrupt + * @arg SDIO_INT_RXFHF: Receive FIFO Half Full interrupt + * @arg SDIO_INT_TXFF: Transmit FIFO full interrupt + * @arg SDIO_INT_RXFF: Receive FIFO full interrupt + * @arg SDIO_INT_TXFE: Transmit FIFO empty interrupt + * @arg SDIO_INT_RXFE: Receive FIFO empty interrupt + * @arg SDIO_INT_TXDA: Data available in transmit FIFO interrupt + * @arg SDIO_INT_RXDA: Data available in receive FIFO interrupt + * @arg SDIO_INT_SDIOINT: SD I/O interrupt received interrupt + * @arg SDIO_INT_ATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @retval None + */ +void SDIO_DisableInterrupt(uint32_t interrupt) +{ + SDIO->MASK &= ~interrupt; +} + +/*! + * @brief Reads the specified SDIO flag + * + * @param flag: Select the flag to read + * The parameter can be one of following values: + * @arg SDIO_FLAG_COMRESP: Command response received (CRC check failed) flag + * @arg SDIO_FLAG_DBDR: Data block sent/received (CRC check failed) flag + * @arg SDIO_FLAG_CMDRESTO: Command response timeout flag + * @arg SDIO_FLAG_DATATO: Data timeout flag + * @arg SDIO_FLAG_TXUDRER: Transmit FIFO underrun error flag + * @arg SDIO_FLAG_RXOVRER: Received FIFO overrun error flag + * @arg SDIO_FLAG_CMDRES: Command response received (CRC check passed) flag + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) flag + * @arg SDIO_FLAG_DATAEND: Data end (data counter is zero) flag + * @arg SDIO_FLAG_SBE: Start bit not detected on all data signals in wide bus mode flag + * @arg SDIO_FLAG_DBCP: Data block sent/received (CRC check passed) flag + * @arg SDIO_FLAG_CMDACT: Command transfer in progress flag + * @arg SDIO_FLAG_TXACT: Data transmit in progress flag + * @arg SDIO_FLAG_RXACT: Data receive in progress flag + * @arg SDIO_FLAG_TXFHF: Transmit FIFO Half Empty flag + * @arg SDIO_FLAG_RXFHF: Receive FIFO Half Full flag + * @arg SDIO_FLAG_TXFF: Transmit FIFO full flag + * @arg SDIO_FLAG_RXFF: Receive FIFO full flag + * @arg SDIO_FLAG_TXFE: Transmit FIFO empty flag + * @arg SDIO_FLAG_RXFE: Receive FIFO empty flag + * @arg SDIO_FLAG_TXDA: Data available in transmit FIFO flag + * @arg SDIO_FLAG_RXDA: Data available in receive FIFO flag + * @arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag + * @arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received for CMD61 flag + * + * @retval SET or RESET + */ +uint8_t SDIO_ReadStatusFlag(SDIO_FLAG_T flag) +{ + uint8_t bitstatus = RESET; + + if ((SDIO->STS & flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/*! + * @brief Clears the specified SDIO flag + * + * @param flag: Select the flag to clear + * The parameter can be any combination of following values: + * @arg SDIO_FLAG_COMRESP: Command response received (CRC check failed) flag + * @arg SDIO_FLAG_DBDR: Data block sent/received (CRC check failed) flag + * @arg SDIO_FLAG_CMDRESTO: Command response timeout flag + * @arg SDIO_FLAG_DATATO: Data timeout flag + * @arg SDIO_FLAG_TXUDRER: Transmit FIFO underrun error flag + * @arg SDIO_FLAG_RXOVRER: Received FIFO overrun error flag + * @arg SDIO_FLAG_CMDRES: Command response received (CRC check passed) flag + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) flag + * @arg SDIO_FLAG_DATAEND: Data end (data counter is zero) flag + * @arg SDIO_FLAG_SBE: Start bit not detected on all data signals in wide bus mode flag + * @arg SDIO_FLAG_DBCP: Data block sent/received (CRC check passed) flag + * @arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag + * @arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received for CMD61 flag + * + * @retval None + */ +void SDIO_ClearStatusFlag(uint32_t flag) +{ + SDIO->ICF = flag; +} + +/*! + * @brief Reads the specified SDIO Interrupt flag + * + * @param flag: Select the SDIO interrupt source + * The parameter can be one of following values: + * @arg SDIO_INT_COMRESP: Command response received (CRC check failed) interrupt + * @arg SDIO_INT_DBDR: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_INT_CMDRESTO: Command response timeout interrupt + * @arg SDIO_INT_DATATO: Data timeout interrupt + * @arg SDIO_INT_TXUDRER: Transmit FIFO underrun error interrupt + * @arg SDIO_INT_RXOVRER: Received FIFO overrun error interrupt + * @arg SDIO_INT_CMDRES: Command response received (CRC check passed) interrupt + * @arg SDIO_INT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_INT_DATAEND: Data end (data counter is zero) interrupt + * @arg SDIO_INT_SBE: Start bit not detected on all data signals in wide bus mode interrupt + * @arg SDIO_INT_DBCP: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_INT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_INT_TXACT: Data transmit in progress interrupt + * @arg SDIO_INT_RXACT: Data receive in progress interrupt + * @arg SDIO_INT_TXFHF: Transmit FIFO Half Empty interrupt + * @arg SDIO_INT_RXFHF: Receive FIFO Half Full interrupt + * @arg SDIO_INT_TXFF: Transmit FIFO full interrupt + * @arg SDIO_INT_RXFF: Receive FIFO full interrupt + * @arg SDIO_INT_TXFE: Transmit FIFO empty interrupt + * @arg SDIO_INT_RXFE: Receive FIFO empty interrupt + * @arg SDIO_INT_TXDA: Data available in transmit FIFO interrupt + * @arg SDIO_INT_RXDA: Data available in receive FIFO interrupt + * @arg SDIO_INT_SDIOINT: SD I/O interrupt received interrupt + * @arg SDIO_INT_ATAEND: CE-ATA command completion signal received for CMD61 interrupt + * + * @retval SET or RESET + */ +uint8_t SDIO_ReadIntFlag(SDIO_INT_T flag) +{ + uint32_t intEnable; + uint32_t intStatus; + + intEnable = (uint32_t)(SDIO->MASK & flag); + intStatus = (uint32_t)(SDIO->STS & flag); + + if (intEnable && intStatus) + { + return SET; + } + + return RESET; +} + +/*! + * @brief Clears the specified SDIO Interrupt pending bits + * + * @param flag: Select the SDIO interrupt source + * The parameter can be any combination of following values: + * @arg SDIO_INT_COMRESP: Command response received (CRC check failed) interrupt + * @arg SDIO_INT_DBDR: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_INT_CMDRESTO: Command response timeout interrupt + * @arg SDIO_INT_DATATO: Data timeout interrupt + * @arg SDIO_INT_TXUDRER: Transmit FIFO underrun error interrupt + * @arg SDIO_INT_RXOVRER: Received FIFO overrun error interrupt + * @arg SDIO_INT_CMDRES: Command response received (CRC check passed) interrupt + * @arg SDIO_INT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_INT_DATAEND: Data end (data counter is zero) interrupt + * @arg SDIO_INT_SBE: Start bit not detected on all data signals in wide bus mode interrupt + * @arg SDIO_INT_DBCP: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_INT_SDIOINT: SD I/O interrupt received interrupt + * @arg SDIO_INT_ATAEND: CE-ATA command completion signal received for CMD61 interrupt + * + * @retval None + */ +void SDIO_ClearIntFlag(uint32_t flag) +{ + SDIO->ICF = flag; +} + +/**@} end of group SDIO_Functions */ +/**@} end of group SDIO_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_smc.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_smc.c new file mode 100644 index 0000000000..e01f689114 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_smc.c @@ -0,0 +1,976 @@ +/*! + * @file apm32e10x_smc.c + * + * @brief This file provides all the SMC firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_smc.h" +#include "apm32e10x_rcm.h" + + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SMC_Driver + * @brief SMC driver modules + @{ +*/ + +/** @defgroup SMC_Functions Functions + @{ +*/ + +/*! + * @brief Rest the SMC NOR/SRAM Banks registers + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK1_NORSRAM_1: SMC Bank1 NOR/SRAM1 + * @arg SMC_BANK1_NORSRAM_2: SMC Bank1 NOR/SRAM2 + * @arg SMC_BANK1_NORSRAM_3: SMC Bank1 NOR/SRAM3 + * @arg SMC_BANK1_NORSRAM_4: SMC Bank1 NOR/SRAM4 + * + * @retval None + */ +void SMC_ResetNORSRAM(SMC_BANK1_NORSRAM_T bank) +{ + if (bank == SMC_BANK1_NORSRAM_1) + { + SMC_Bank1->CSCTRL1 = 0x000030DB; + SMC_Bank1->CSTIM1 = 0x0FFFFFFF; + SMC_Bank1E->WRTTIM1 = 0x0FFFFFFF; + } + else if (bank == SMC_BANK1_NORSRAM_2) + { + SMC_Bank1->CSCTRL2 = 0x000030D2; + SMC_Bank1->CSTIM2 = 0x0FFFFFFF; + SMC_Bank1E->WRTTIM2 = 0x0FFFFFFF; + } + else if (bank == SMC_BANK1_NORSRAM_3) + { + SMC_Bank1->CSCTRL3 = 0x000030D2; + SMC_Bank1->CSTIM3 = 0x0FFFFFFF; + SMC_Bank1E->WRTTIM3 = 0x0FFFFFFF; + } + else if (bank == SMC_BANK1_NORSRAM_4) + { + SMC_Bank1->CSCTRL4 = 0x000030D2; + SMC_Bank1->CSTIM4 = 0x0FFFFFFF; + SMC_Bank1E->WRTTIM4 = 0x0FFFFFFF; + } +} + +/*! + * @brief Rest the SMC NAND Banks registers + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND: SMC Bank2 NAND + * @arg SMC_BANK3_NAND: SMC Bank3 NAND + * + * @retval None + */ +void SMC_ResetNAND(SMC_BANK_NAND_T bank) +{ + if(bank == SMC_BANK2_NAND) + { + /* Set the SMC_Bank2 registers to their reset values */ + SMC_Bank2->CTRL2 = 0x00000018; + SMC_Bank2->STSINT2 = 0x00000040; + SMC_Bank2->CMSTIM2 = 0xFCFCFCFC; + SMC_Bank2->AMSTIM2 = 0xFCFCFCFC; + } + /** SMC_BANK3_NAND */ + else if (bank == SMC_BANK3_NAND) + { + /* Set the SMC_Bank3 registers to their reset values */ + SMC_Bank3->CTRL3 = 0x00000018; + SMC_Bank3->STSINT3 = 0x00000040; + SMC_Bank3->CMSTIM3 = 0xFCFCFCFC; + SMC_Bank3->AMSTIM3 = 0xFCFCFCFC; + } +} + +/*! + * @brief Reset the SMC PCCARD Banks registers + * + * @param None + * + * @retval None + */ +void SMC_ResetPCCard(void) +{ + /** Set the SMC_Bank4 registers to their reset values */ + SMC_Bank4->CTRL4 = 0x00000018; + SMC_Bank4->STSINT4 = 0x00000040; + SMC_Bank4->CMSTIM4 = 0xFCFCFCFC; + SMC_Bank4->AMSTIM4 = 0xFCFCFCFC; + SMC_Bank4->IOSTIM4 = 0xFCFCFCFC; +} + +/*! + * @brief Config the SMC NOR/SRAM Banks according to the specified parameters in the smcNORSRAMConfig. + * + * @param smcNORSRAMConfig: Point to a SMC_NORSRAMConfig_T structure + * + * @retval None + */ +void SMC_ConfigNORSRAM(SMC_NORSRAMConfig_T* smcNORSRAMConfig) +{ + if (smcNORSRAMConfig->bank == SMC_BANK1_NORSRAM_1) + { + SMC_Bank1->CSCTRL1_B.ADMUXEN = smcNORSRAMConfig->dataAddressMux; + SMC_Bank1->CSCTRL1_B.MTYPECFG = smcNORSRAMConfig->memoryType; + SMC_Bank1->CSCTRL1_B.MDBWIDCFG = smcNORSRAMConfig->memoryDataWidth; + SMC_Bank1->CSCTRL1_B.BURSTEN = smcNORSRAMConfig->burstAcceesMode; + SMC_Bank1->CSCTRL1_B.WSASYNCEN = smcNORSRAMConfig->asynchronousWait; + SMC_Bank1->CSCTRL1_B.WSPOLCFG = smcNORSRAMConfig->waitSignalPolarity; + SMC_Bank1->CSCTRL1_B.WRAPBEN = smcNORSRAMConfig->wrapMode; + SMC_Bank1->CSCTRL1_B.WTIMCFG = smcNORSRAMConfig->waitSignalActive; + SMC_Bank1->CSCTRL1_B.WREN = smcNORSRAMConfig->writeOperation; + SMC_Bank1->CSCTRL1_B.WAITEN = smcNORSRAMConfig->waiteSignal; + SMC_Bank1->CSCTRL1_B.EXTMODEEN = smcNORSRAMConfig->extendedMode; + SMC_Bank1->CSCTRL1_B.WRBURSTEN = smcNORSRAMConfig->writeBurst; + + if (smcNORSRAMConfig->memoryType == SMC_MEMORY_TYPE_NOR) + { + SMC_Bank1->CSCTRL1_B.NORFMACCEN = BIT_SET; + } + + SMC_Bank1->CSTIM1_B.ADDRSETCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime; + SMC_Bank1->CSTIM1_B.ADDRHLDCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime; + SMC_Bank1->CSTIM1_B.DATASETCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime; + SMC_Bank1->CSTIM1_B.BUSTURNCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime; + SMC_Bank1->CSTIM1_B.CLKDIVCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->clockDivision; + SMC_Bank1->CSTIM1_B.DATALATCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->dataLatency; + SMC_Bank1->CSTIM1_B.ASYNCACCCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->accessMode; + + if (smcNORSRAMConfig->extendedMode == SMC_EXTENDEN_MODE_ENABLE) + { + SMC_Bank1E->WRTTIM1_B.ADDRSETCFG = \ + smcNORSRAMConfig->writeTimingStruct->addressSetupTime; + SMC_Bank1E->WRTTIM1_B.ADDRHLDCFG = \ + smcNORSRAMConfig->writeTimingStruct->addressHodeTime; + SMC_Bank1E->WRTTIM1_B.DATASETCFG = \ + smcNORSRAMConfig->writeTimingStruct->dataSetupTime; + SMC_Bank1E->WRTTIM1_B.BUSTURNCFG = \ + smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime; + SMC_Bank1E->WRTTIM1_B.ASYNCACCCFG = \ + smcNORSRAMConfig->writeTimingStruct->accessMode; + } + else + { + SMC_Bank1E->WRTTIM1 = 0x0FFFFFFF; + } + } + else if (smcNORSRAMConfig->bank == SMC_BANK1_NORSRAM_2) + { + SMC_Bank1->CSCTRL2_B.ADMUXEN = smcNORSRAMConfig->dataAddressMux; + SMC_Bank1->CSCTRL2_B.MTYPECFG = smcNORSRAMConfig->memoryType; + SMC_Bank1->CSCTRL2_B.MDBWIDCFG = smcNORSRAMConfig->memoryDataWidth; + SMC_Bank1->CSCTRL2_B.BURSTEN = smcNORSRAMConfig->burstAcceesMode; + SMC_Bank1->CSCTRL2_B.WSASYNCEN = smcNORSRAMConfig->asynchronousWait; + SMC_Bank1->CSCTRL2_B.WSPOLCFG = smcNORSRAMConfig->waitSignalPolarity; + SMC_Bank1->CSCTRL2_B.WRAPBEN = smcNORSRAMConfig->wrapMode; + SMC_Bank1->CSCTRL2_B.WTIMCFG = smcNORSRAMConfig->waitSignalActive; + SMC_Bank1->CSCTRL2_B.WREN = smcNORSRAMConfig->writeOperation; + SMC_Bank1->CSCTRL2_B.WAITEN = smcNORSRAMConfig->waiteSignal; + SMC_Bank1->CSCTRL2_B.EXTMODEEN = smcNORSRAMConfig->extendedMode; + SMC_Bank1->CSCTRL2_B.WRBURSTEN = smcNORSRAMConfig->writeBurst; + + if (smcNORSRAMConfig->memoryType == SMC_MEMORY_TYPE_NOR) + { + SMC_Bank1->CSCTRL2_B.NORFMACCEN = BIT_SET; + } + + SMC_Bank1->CSTIM2_B.ADDRSETCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime; + SMC_Bank1->CSTIM2_B.ADDRHLDCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime; + SMC_Bank1->CSTIM2_B.DATASETCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime; + SMC_Bank1->CSTIM2_B.BUSTURNCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime; + SMC_Bank1->CSTIM2_B.CLKDIVCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->clockDivision; + SMC_Bank1->CSTIM2_B.DATALATCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->dataLatency; + SMC_Bank1->CSTIM2_B.ASYNCACCCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->accessMode; + + if (smcNORSRAMConfig->extendedMode == SMC_EXTENDEN_MODE_ENABLE) + { + SMC_Bank1E->WRTTIM2_B.ADDRSETCFG = \ + smcNORSRAMConfig->writeTimingStruct->addressSetupTime; + SMC_Bank1E->WRTTIM2_B.ADDRHLDCFG = \ + smcNORSRAMConfig->writeTimingStruct->addressHodeTime; + SMC_Bank1E->WRTTIM2_B.DATASETCFG = \ + smcNORSRAMConfig->writeTimingStruct->dataSetupTime; + SMC_Bank1E->WRTTIM2_B.BUSTURNCFG = \ + smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime; + SMC_Bank1E->WRTTIM2_B.ASYNCACCCFG = \ + smcNORSRAMConfig->writeTimingStruct->accessMode; + } + else + { + SMC_Bank1E->WRTTIM2 = 0x0FFFFFFF; + } + } + else if (smcNORSRAMConfig->bank == SMC_BANK1_NORSRAM_3) + { + SMC_Bank1->CSCTRL3_B.ADMUXEN = smcNORSRAMConfig->dataAddressMux; + SMC_Bank1->CSCTRL3_B.MTYPECFG = smcNORSRAMConfig->memoryType; + SMC_Bank1->CSCTRL3_B.MDBWIDCFG = smcNORSRAMConfig->memoryDataWidth; + SMC_Bank1->CSCTRL3_B.BURSTEN = smcNORSRAMConfig->burstAcceesMode; + SMC_Bank1->CSCTRL3_B.WSASYNCEN = smcNORSRAMConfig->asynchronousWait; + SMC_Bank1->CSCTRL3_B.WSPOLCFG = smcNORSRAMConfig->waitSignalPolarity; + SMC_Bank1->CSCTRL3_B.WRAPBEN = smcNORSRAMConfig->wrapMode; + SMC_Bank1->CSCTRL3_B.WTIMCFG = smcNORSRAMConfig->waitSignalActive; + SMC_Bank1->CSCTRL3_B.WREN = smcNORSRAMConfig->writeOperation; + SMC_Bank1->CSCTRL3_B.WAITEN = smcNORSRAMConfig->waiteSignal; + SMC_Bank1->CSCTRL3_B.EXTMODEEN = smcNORSRAMConfig->extendedMode; + SMC_Bank1->CSCTRL3_B.WRBURSTEN = smcNORSRAMConfig->writeBurst; + + if (smcNORSRAMConfig->memoryType == SMC_MEMORY_TYPE_NOR) + { + SMC_Bank1->CSCTRL3_B.NORFMACCEN = BIT_SET; + } + + SMC_Bank1->CSTIM3_B.ADDRSETCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime; + SMC_Bank1->CSTIM3_B.ADDRHLDCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime; + SMC_Bank1->CSTIM3_B.DATASETCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime; + SMC_Bank1->CSTIM3_B.BUSTURNCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime; + SMC_Bank1->CSTIM3_B.CLKDIVCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->clockDivision; + SMC_Bank1->CSTIM3_B.DATALATCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->dataLatency; + SMC_Bank1->CSTIM3_B.ASYNCACCCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->accessMode; + + if (smcNORSRAMConfig->extendedMode == SMC_EXTENDEN_MODE_ENABLE) + { + SMC_Bank1E->WRTTIM3_B.ADDRSETCFG = \ + smcNORSRAMConfig->writeTimingStruct->addressSetupTime; + SMC_Bank1E->WRTTIM3_B.ADDRHLDCFG = \ + smcNORSRAMConfig->writeTimingStruct->addressHodeTime; + SMC_Bank1E->WRTTIM3_B.DATASETCFG = \ + smcNORSRAMConfig->writeTimingStruct->dataSetupTime; + SMC_Bank1E->WRTTIM3_B.BUSTURNCFG = \ + smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime; + SMC_Bank1E->WRTTIM3_B.ASYNCACCCFG = \ + smcNORSRAMConfig->writeTimingStruct->accessMode; + } + else + { + SMC_Bank1E->WRTTIM3 = 0x0FFFFFFF; + } + } + else if (smcNORSRAMConfig->bank == SMC_BANK1_NORSRAM_4) + { + SMC_Bank1->CSCTRL4_B.ADMUXEN = smcNORSRAMConfig->dataAddressMux; + SMC_Bank1->CSCTRL4_B.MTYPECFG = smcNORSRAMConfig->memoryType; + SMC_Bank1->CSCTRL4_B.MDBWIDCFG = smcNORSRAMConfig->memoryDataWidth; + SMC_Bank1->CSCTRL4_B.BURSTEN = smcNORSRAMConfig->burstAcceesMode; + SMC_Bank1->CSCTRL4_B.WSASYNCEN = smcNORSRAMConfig->asynchronousWait; + SMC_Bank1->CSCTRL4_B.WSPOLCFG = smcNORSRAMConfig->waitSignalPolarity; + SMC_Bank1->CSCTRL4_B.WRAPBEN = smcNORSRAMConfig->wrapMode; + SMC_Bank1->CSCTRL4_B.WTIMCFG = smcNORSRAMConfig->waitSignalActive; + SMC_Bank1->CSCTRL4_B.WREN = smcNORSRAMConfig->writeOperation; + SMC_Bank1->CSCTRL4_B.WAITEN = smcNORSRAMConfig->waiteSignal; + SMC_Bank1->CSCTRL4_B.EXTMODEEN = smcNORSRAMConfig->extendedMode; + SMC_Bank1->CSCTRL4_B.WRBURSTEN = smcNORSRAMConfig->writeBurst; + + if (smcNORSRAMConfig->memoryType == SMC_MEMORY_TYPE_NOR) + { + SMC_Bank1->CSCTRL4_B.NORFMACCEN = BIT_SET; + } + + SMC_Bank1->CSTIM4_B.ADDRSETCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime; + SMC_Bank1->CSTIM4_B.ADDRHLDCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime; + SMC_Bank1->CSTIM4_B.DATASETCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime; + SMC_Bank1->CSTIM4_B.BUSTURNCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime; + SMC_Bank1->CSTIM4_B.CLKDIVCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->clockDivision; + SMC_Bank1->CSTIM4_B.DATALATCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->dataLatency; + SMC_Bank1->CSTIM4_B.ASYNCACCCFG = \ + smcNORSRAMConfig->readWriteTimingStruct->accessMode; + + if (smcNORSRAMConfig->extendedMode == SMC_EXTENDEN_MODE_ENABLE) + { + SMC_Bank1E->WRTTIM4_B.ADDRSETCFG = \ + smcNORSRAMConfig->writeTimingStruct->addressSetupTime; + SMC_Bank1E->WRTTIM4_B.ADDRHLDCFG = \ + smcNORSRAMConfig->writeTimingStruct->addressHodeTime; + SMC_Bank1E->WRTTIM4_B.DATASETCFG = \ + smcNORSRAMConfig->writeTimingStruct->dataSetupTime; + SMC_Bank1E->WRTTIM4_B.BUSTURNCFG = \ + smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime; + SMC_Bank1E->WRTTIM4_B.ASYNCACCCFG = \ + smcNORSRAMConfig->writeTimingStruct->accessMode; + } + else + { + SMC_Bank1E->WRTTIM4 = 0x0FFFFFFF; + } + } +} + +/*! + * @brief Config the SMC NAND Banks according to the specified parameters in the smcNANDConfig. + * + * @param smcNANDConfig : Point to a SMC_NANDConfig_T structure. + * + * @retval None + */ +void SMC_ConfigNAND(SMC_NANDConfig_T* smcNANDConfig) +{ + if (smcNANDConfig->bank == SMC_BANK2_NAND) + { + SMC_Bank2->CTRL2_B.WAITFEN = smcNANDConfig->waitFeature; + SMC_Bank2->CTRL2_B.DBWIDCFG = smcNANDConfig->memoryDataWidth; + SMC_Bank2->CTRL2_B.ECCEN = smcNANDConfig->ECC; + SMC_Bank2->CTRL2_B.ECCPSCFG = smcNANDConfig->ECCPageSize; + SMC_Bank2->CTRL2_B.C2RDCFG = smcNANDConfig->TCLRSetupTime; + SMC_Bank2->CTRL2_B.A2RDCFG = smcNANDConfig->TARSetupTime; + SMC_Bank2->CTRL2_B.MTYPECFG = BIT_SET; + + SMC_Bank2->CMSTIM2_B.SET2 = \ + smcNANDConfig->commonSpaceTimingStruct->setupTime; + SMC_Bank2->CMSTIM2_B.WAIT2 = \ + smcNANDConfig->commonSpaceTimingStruct->waitSetupTime; + SMC_Bank2->CMSTIM2_B.HLD2 = \ + smcNANDConfig->commonSpaceTimingStruct->holdSetupTime; + SMC_Bank2->CMSTIM2_B.HIZ2 = \ + smcNANDConfig->commonSpaceTimingStruct->HiZSetupTime; + + SMC_Bank2->AMSTIM2_B.SET2 = \ + smcNANDConfig->attributeSpaceTimingStruct->setupTime; + SMC_Bank2->AMSTIM2_B.WAIT2 = \ + smcNANDConfig->attributeSpaceTimingStruct->waitSetupTime; + SMC_Bank2->AMSTIM2_B.HLD2 = \ + smcNANDConfig->attributeSpaceTimingStruct->holdSetupTime; + SMC_Bank2->AMSTIM2_B.HIZ2 = \ + smcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime; + } + else if (smcNANDConfig->bank == SMC_BANK3_NAND) + { + SMC_Bank3->CTRL3_B.WAITFEN = smcNANDConfig->waitFeature; + SMC_Bank3->CTRL3_B.DBWIDCFG = smcNANDConfig->memoryDataWidth; + SMC_Bank3->CTRL3_B.ECCEN = smcNANDConfig->ECC; + SMC_Bank3->CTRL3_B.ECCPSCFG = smcNANDConfig->ECCPageSize; + SMC_Bank3->CTRL3_B.C2RDCFG = smcNANDConfig->TCLRSetupTime; + SMC_Bank3->CTRL3_B.A2RDCFG = smcNANDConfig->TARSetupTime; + SMC_Bank3->CTRL3_B.MTYPECFG = BIT_SET; + + SMC_Bank3->CMSTIM3_B.SET3 = \ + smcNANDConfig->commonSpaceTimingStruct->setupTime; + SMC_Bank3->CMSTIM3_B.WAIT3 = \ + smcNANDConfig->commonSpaceTimingStruct->waitSetupTime; + SMC_Bank3->CMSTIM3_B.HLD3 = \ + smcNANDConfig->commonSpaceTimingStruct->holdSetupTime; + SMC_Bank3->CMSTIM3_B.HIZ3 = \ + smcNANDConfig->commonSpaceTimingStruct->HiZSetupTime; + + SMC_Bank3->AMSTIM3_B.SET3 = \ + smcNANDConfig->attributeSpaceTimingStruct->setupTime; + SMC_Bank3->AMSTIM3_B.WAIT3 = \ + smcNANDConfig->attributeSpaceTimingStruct->waitSetupTime; + SMC_Bank3->AMSTIM3_B.HLD3 = \ + smcNANDConfig->attributeSpaceTimingStruct->holdSetupTime; + SMC_Bank3->AMSTIM3_B.HIZ3 = \ + smcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime; + } +} + +/*! + * @brief Config the SMC PCCARD according to the specified parameters in the smcPCCardConfig. + * + * @param smcPCCardConfig: Point to a SMC_PCCARDConfig_T structure. + * + * @retval None + */ +void SMC_ConfigPCCard(SMC_PCCARDConfig_T* smcPCCardConfig) +{ + SMC_Bank4->CTRL4_B.WAITFEN = smcPCCardConfig->waitFeature; + SMC_Bank4->CTRL4_B.C2RDCFG = smcPCCardConfig->TCLRSetupTime; + SMC_Bank4->CTRL4_B.A2RDCFG = smcPCCardConfig->TARSetupTime; + SMC_Bank4->CTRL4_B.DBWIDCFG = BIT_SET; + + SMC_Bank4->CMSTIM4_B.SET4 = \ + smcPCCardConfig->commonSpaceTimingStruct->setupTime; + SMC_Bank4->CMSTIM4_B.WAIT4 = \ + smcPCCardConfig->commonSpaceTimingStruct->waitSetupTime; + SMC_Bank4->CMSTIM4_B.HLD4 = \ + smcPCCardConfig->commonSpaceTimingStruct->holdSetupTime; + SMC_Bank4->CMSTIM4_B.HIZ4 = \ + smcPCCardConfig->commonSpaceTimingStruct->HiZSetupTime; + + SMC_Bank4->AMSTIM4_B.SET4 = \ + smcPCCardConfig->attributeSpaceTimingStruct->setupTime; + SMC_Bank4->AMSTIM4_B.WAIT4 = \ + smcPCCardConfig->attributeSpaceTimingStruct->waitSetupTime; + SMC_Bank4->AMSTIM4_B.HLD4 = \ + smcPCCardConfig->attributeSpaceTimingStruct->holdSetupTime; + SMC_Bank4->AMSTIM4_B.HIZ4 = \ + smcPCCardConfig->attributeSpaceTimingStruct->HiZSetupTime; + + SMC_Bank4->IOSTIM4_B.SET = \ + smcPCCardConfig->IOSpaceTimingStruct->setupTime; + SMC_Bank4->IOSTIM4_B.WAIT = \ + smcPCCardConfig->IOSpaceTimingStruct->waitSetupTime; + SMC_Bank4->IOSTIM4_B.HLD = \ + smcPCCardConfig->IOSpaceTimingStruct->holdSetupTime; + SMC_Bank4->IOSTIM4_B.HIZ = \ + smcPCCardConfig->IOSpaceTimingStruct->HiZSetupTime; +} + +/*! + * @brief Fills each smcNORSRAMConfig member with its default value. + * + * @param smcNORSRAMConfig : Point to a SMC_NORSRAMConfig_T structure. + * + * @retval None + */ +void SMC_ConfigNORSRAMStructInit(SMC_NORSRAMConfig_T* smcNORSRAMConfig) +{ + /* Reset NOR/SRAM Init structure parameters values */ + smcNORSRAMConfig->bank = SMC_BANK1_NORSRAM_1; + smcNORSRAMConfig->dataAddressMux = SMC_DATA_ADDRESS_MUX_ENABLE; + smcNORSRAMConfig->memoryType = SMC_MEMORY_TYPE_SRAM; + smcNORSRAMConfig->memoryDataWidth = SMC_MEMORY_DATA_WIDTH_8BIT; + smcNORSRAMConfig->burstAcceesMode = SMC_BURST_ACCESS_MODE_DISABLE; + smcNORSRAMConfig->asynchronousWait = SMC_ASYNCHRONOUS_WAIT_DISABLE; + smcNORSRAMConfig->waitSignalPolarity = SMC_WAIT_SIGNAL_POLARITY_LOW; + smcNORSRAMConfig->wrapMode = SMC_WRAP_MODE_DISABLE; + smcNORSRAMConfig->waitSignalActive = SMC_WAIT_SIGNAL_ACTIVE_BEFORE_WAIT_STATE; + smcNORSRAMConfig->writeOperation = SMC_WRITE_OPERATION_ENABLE; + smcNORSRAMConfig->waiteSignal = SMC_WAITE_SIGNAL_ENABLE; + smcNORSRAMConfig->extendedMode = SMC_EXTENDEN_MODE_DISABLE; + smcNORSRAMConfig->writeBurst = SMC_WRITE_BURST_DISABLE; + smcNORSRAMConfig->readWriteTimingStruct->addressSetupTime = 0xF; + smcNORSRAMConfig->readWriteTimingStruct->addressHodeTime = 0xF; + smcNORSRAMConfig->readWriteTimingStruct->dataSetupTime = 0xFF; + smcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime = 0xF; + smcNORSRAMConfig->readWriteTimingStruct->clockDivision = 0xF; + smcNORSRAMConfig->readWriteTimingStruct->dataLatency = 0xF; + smcNORSRAMConfig->readWriteTimingStruct->accessMode = SMC_ACCESS_MODE_A; + smcNORSRAMConfig->writeTimingStruct->addressSetupTime = 0xF; + smcNORSRAMConfig->writeTimingStruct->addressHodeTime = 0xF; + smcNORSRAMConfig->writeTimingStruct->dataSetupTime = 0xFF; + smcNORSRAMConfig->writeTimingStruct->busTurnaroundTime = 0xF; + smcNORSRAMConfig->writeTimingStruct->clockDivision = 0xF; + smcNORSRAMConfig->writeTimingStruct->dataLatency = 0xF; + smcNORSRAMConfig->writeTimingStruct->accessMode = SMC_ACCESS_MODE_A; + +} + +/*! + * @brief Fills each smcNANDConfig member with its default value. + * + * @param smcNANDConfig : Point to a SMC_NANDConfig_T structure. + * + * @retval None + */ +void SMC_ConfigNANDStructInit(SMC_NANDConfig_T* smcNANDConfig) +{ + /* Reset NAND Init structure parameters values */ + smcNANDConfig->bank = SMC_BANK2_NAND; + smcNANDConfig->waitFeature = SMC_WAIT_FEATURE_DISABLE; + smcNANDConfig->memoryDataWidth = SMC_MEMORY_DATA_WIDTH_8BIT; + smcNANDConfig->ECC = SMC_ECC_DISABLE; + smcNANDConfig->ECCPageSize = SMC_ECC_PAGE_SIZE_BYTE_256; + smcNANDConfig->TCLRSetupTime = 0x0; + smcNANDConfig->TARSetupTime = 0x0; + smcNANDConfig->commonSpaceTimingStruct->setupTime = 0xFC; + smcNANDConfig->commonSpaceTimingStruct->waitSetupTime = 0xFC; + smcNANDConfig->commonSpaceTimingStruct->holdSetupTime = 0xFC; + smcNANDConfig->commonSpaceTimingStruct->HiZSetupTime = 0xFC; + smcNANDConfig->attributeSpaceTimingStruct->setupTime = 0xFC; + smcNANDConfig->attributeSpaceTimingStruct->waitSetupTime = 0xFC; + smcNANDConfig->attributeSpaceTimingStruct->holdSetupTime = 0xFC; + smcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime = 0xFC; +} + +/*! + * @brief Fills each smcPCCardConfig member with its default value. + * + * @param smcPCCardConfig : Point to a SMC_PCCARDConfig_T structure. + * + * @retval None + */ +void SMC_ConfigPCCardStructInit(SMC_PCCARDConfig_T* smcPCCardConfig) +{ + /* Reset PCCARD Init structure parameters values */ + smcPCCardConfig->waitFeature = SMC_WAIT_FEATURE_DISABLE; + smcPCCardConfig->TCLRSetupTime = 0x0; + smcPCCardConfig->TARSetupTime = 0x0; + smcPCCardConfig->commonSpaceTimingStruct->setupTime = 0xFC; + smcPCCardConfig->commonSpaceTimingStruct->waitSetupTime = 0xFC; + smcPCCardConfig->commonSpaceTimingStruct->holdSetupTime = 0xFC; + smcPCCardConfig->commonSpaceTimingStruct->HiZSetupTime = 0xFC; + smcPCCardConfig->attributeSpaceTimingStruct->setupTime = 0xFC; + smcPCCardConfig->attributeSpaceTimingStruct->waitSetupTime = 0xFC; + smcPCCardConfig->attributeSpaceTimingStruct->holdSetupTime = 0xFC; + smcPCCardConfig->attributeSpaceTimingStruct->HiZSetupTime = 0xFC; + smcPCCardConfig->IOSpaceTimingStruct->setupTime = 0xFC; + smcPCCardConfig->IOSpaceTimingStruct->waitSetupTime = 0xFC; + smcPCCardConfig->IOSpaceTimingStruct->holdSetupTime = 0xFC; + smcPCCardConfig->IOSpaceTimingStruct->HiZSetupTime = 0xFC; +} + +/*! + * @brief Enables the specified NOR/SRAM Memory Bank. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK1_NORSRAM_1: SMC Bank1 NOR/SRAM1 + * @arg SMC_BANK1_NORSRAM_2: SMC Bank1 NOR/SRAM2 + * @arg SMC_BANK1_NORSRAM_3: SMC Bank1 NOR/SRAM3 + * @arg SMC_BANK1_NORSRAM_4: SMC Bank1 NOR/SRAM4 + * + * @retval None + */ +void SMC_EnableNORSRAM(SMC_BANK1_NORSRAM_T bank) +{ + if (bank == SMC_BANK1_NORSRAM_1) + { + SMC_Bank1->CSCTRL1_B.MBKEN = BIT_SET; + } + else if (bank == SMC_BANK1_NORSRAM_2) + { + SMC_Bank1->CSCTRL2_B.MBKEN = BIT_SET; + } + else if (bank == SMC_BANK1_NORSRAM_3) + { + SMC_Bank1->CSCTRL3_B.MBKEN = BIT_SET; + } + else if (bank == SMC_BANK1_NORSRAM_4) + { + SMC_Bank1->CSCTRL4_B.MBKEN = BIT_SET; + } +} + +/*! + * @brief Disbles the specified NOR/SRAM Memory Bank. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK1_NORSRAM_1: SMC Bank1 NOR/SRAM1 + * @arg SMC_BANK1_NORSRAM_2: SMC Bank1 NOR/SRAM2 + * @arg SMC_BANK1_NORSRAM_3: SMC Bank1 NOR/SRAM3 + * @arg SMC_BANK1_NORSRAM_4: SMC Bank1 NOR/SRAM4 + * + * @retval None + */ +void SMC_DisableNORSRAM(SMC_BANK1_NORSRAM_T bank) +{ + if (bank == SMC_BANK1_NORSRAM_1) + { + SMC_Bank1->CSCTRL1_B.MBKEN = BIT_RESET; + } + else if (bank == SMC_BANK1_NORSRAM_2) + { + SMC_Bank1->CSCTRL2_B.MBKEN = BIT_RESET; + } + else if (bank == SMC_BANK1_NORSRAM_3) + { + SMC_Bank1->CSCTRL3_B.MBKEN = BIT_RESET; + } + else if (bank == SMC_BANK1_NORSRAM_4) + { + SMC_Bank1->CSCTRL4_B.MBKEN = BIT_RESET; + } +} +/*! + * @brief Enables the specified NAND Memory Bank. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND: SMC Bank2 NAND + * @arg SMC_BANK3_NAND: SMC Bank3 NAND + * + * @retval None + */ +void SMC_EnableNAND(SMC_BANK_NAND_T bank) +{ + if(bank == SMC_BANK2_NAND) + { + SMC_Bank2->CTRL2_B.MBKEN = BIT_SET; + } + else if (bank == SMC_BANK3_NAND) + { + SMC_Bank3->CTRL3_B.MBKEN = BIT_SET; + } +} + +/*! + * @brief Disbles the specified NAND Memory Bank. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND: SMC Bank2 NAND + * @arg SMC_BANK3_NAND: SMC Bank3 NAND + * + * @retval None + */ +void SMC_DisableNAND(SMC_BANK_NAND_T bank) +{ + if(bank == SMC_BANK2_NAND) + { + SMC_Bank2->CTRL2_B.MBKEN = BIT_RESET; + } + else if (bank == SMC_BANK3_NAND) + { + SMC_Bank3->CTRL3_B.MBKEN = BIT_RESET; + } +} + +/*! + * @brief Enables the specified PC Card Memory Bank. + * + * @param None + * + * @retval None + */ +void SMC_EnablePCCARD(void) +{ + SMC_Bank4->CTRL4_B.MBKEN = BIT_SET; +} + +/*! + * @brief Disables the specified PC Card Memory Bank. + * + * @param None + * + * @retval None + */ +void SMC_DisablePCCARD(void) +{ + SMC_Bank4->CTRL4_B.MBKEN = BIT_RESET; +} + +/*! + * @brief Enbles the SMC NAND ECC feature. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND: SMC Bank2 NAND + * @arg SMC_BANK3_NAND: SMC Bank3 NAND + * + * @retval None + */ +void SMC_EnableNANDECC(SMC_BANK_NAND_T bank) +{ + if (bank == SMC_BANK2_NAND) + { + SMC_Bank2->CTRL2_B.ECCEN = BIT_SET; + } + else if (bank == SMC_BANK3_NAND) + { + SMC_Bank3->CTRL3_B.ECCEN = BIT_SET; + } +} + +/*! + * @brief Disbles or disables the SMC NAND ECC feature. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND: SMC Bank2 NAND + * @arg SMC_BANK3_NAND: SMC Bank3 NAND + * + * @retval None + * + * @note + */ +void SMC_DisableNANDECC(SMC_BANK_NAND_T bank) +{ + if (bank == SMC_BANK2_NAND) + { + SMC_Bank2->CTRL2_B.ECCEN = BIT_RESET; + } + else if (bank == SMC_BANK3_NAND) + { + SMC_Bank3->CTRL3_B.ECCEN = BIT_RESET; + } +} + +/*! + * @brief Read the error correction code register value. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND: SMC Bank2 NAND + * @arg SMC_BANK3_NAND: SMC Bank3 NAND + * + * @retval The value of Error Correction Code (ECC). + */ +uint32_t SMC_ReadECC(SMC_BANK_NAND_T bank) +{ + uint32_t eccval = 0x00000000; + + if(bank == SMC_BANK2_NAND) + { + eccval = SMC_Bank2->ECCRS2; + } + else if (bank == SMC_BANK3_NAND) + { + eccval = SMC_Bank3->ECCRS3; + } + return eccval; +} + +/*! + * @brief Enables the specified SMC interrupts. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND : SMC Bank2 NAND + * @arg SMC_BANK3_NAND : SMC Bank3 NAND + * @arg SMC_BANK4_PCCARD: SMC Bank4 PCCARD + * + * @param interrupt: Select the SMC interrupt sources. + * This parameter can be any combination of the following values: + * @arg SMC_INT_EDGE_RISING : Rising edge detection interrupt. + * @arg SMC_INT_LEVEL_HIGH : High level detection interrupt. + * @arg SMC_INT_EDGE_FALLING: Falling edge detection interrupt. + * + * @retval None + */ +void SMC_EnableInterrupt(SMC_BANK_NAND_T bank, uint32_t interrupt) +{ + if(bank == SMC_BANK2_NAND) + { + SMC_Bank2->STSINT2 |= interrupt; + } + else if(bank == SMC_BANK3_NAND) + { + SMC_Bank3->STSINT3 |= interrupt; + } + else + { + SMC_Bank4->STSINT4 |= interrupt; + } +} + +/*! + * @brief Enables the specified SMC interrupts. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND : SMC Bank2 NAND + * @arg SMC_BANK3_NAND : SMC Bank3 NAND + * @arg SMC_BANK4_PCCARD: SMC Bank4 PCCARD + * + * @param interrupt: Select the SMC interrupt sources. + * This parameter can be any combination of the following values: + * @arg SMC_INT_EDGE_RISING : Rising edge detection interrupt. + * @arg SMC_INT_LEVEL_HIGH : High level edge detection interrupt. + * @arg SMC_INT_EDGE_FALLING: Falling edge detection interrupt. + * + * @retval None + */ +void SMC_DisableInterrupt(SMC_BANK_NAND_T bank, uint32_t interrupt) +{ + if(bank == SMC_BANK2_NAND) + { + SMC_Bank2->STSINT2 &= ~interrupt; + } + else if(bank == SMC_BANK3_NAND) + { + SMC_Bank3->STSINT3 &= ~interrupt; + } + else + { + SMC_Bank4->STSINT4 &= ~interrupt; + } +} + +/*! + * @brief Read the status of specified SMC flag. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND : SMC Bank2 NAND + * @arg SMC_BANK3_NAND : SMC Bank3 NAND + * @arg SMC_BANK4_PCCARD: SMC Bank4 PCCARD + * + * @param flag: Select the SMC interrupt sources. + * This parameter can be one of the following values: + * @arg SMC_FLAG_EDGE_RISING : Rising egde detection Flag. + * @arg SMC_FLAG_LEVEL_HIGH : High level detection Flag. + * @arg SMC_FLAG_EDGE_FALLING: Falling egde detection Flag. + * @arg SMC_FLAG_FIFO_EMPTY : FIFO empty Flag. + * + * @retval SET or RESET + * + * @note + */ +uint16_t SMC_ReadStatusFlag(SMC_BANK_NAND_T bank, SMC_FLAG_T flag) +{ + if (bank == SMC_BANK2_NAND) + { + return (SMC_Bank2->STSINT2 & flag) ? SET : RESET; + } + else if (bank == SMC_BANK3_NAND) + { + return (SMC_Bank3->STSINT3 & flag) ? SET : RESET; + } + else + { + return (SMC_Bank4->STSINT4 & flag) ? SET : RESET; + } +} + +/*! + * @brief Clears the SMC's pending flags. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND : SMC Bank2 NAND + * @arg SMC_BANK3_NAND : SMC Bank3 NAND + * @arg SMC_BANK4_PCCARD: SMC Bank4 PCCARD + * + * @param flag: Select the SMC interrupt sources. + * This parameter can be any combination of the following values: + * @arg SMC_FLAG_EDGE_RISING : Rising egde detection Flag. + * @arg SMC_FLAG_LEVEL_HIGH : High level detection Flag. + * @arg SMC_FLAG_EDGE_FALLING: Falling egde detection Flag. + * + * @retval None + */ +void SMC_ClearStatusFlag(SMC_BANK_NAND_T bank, uint32_t flag) +{ + if(bank == SMC_BANK2_NAND) + { + SMC_Bank2->STSINT2 &= ~flag; + } + else if(bank == SMC_BANK3_NAND) + { + SMC_Bank3->STSINT3 &= ~flag; + } + else + { + SMC_Bank4->STSINT4 &= ~flag; + } +} + +/*! + * @brief Read the specified SMC interrupt has occurred or not. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND : SMC Bank2 NAND + * @arg SMC_BANK3_NAND : SMC Bank3 NAND + * @arg SMC_BANK4_PCCARD: SMC Bank4 PCCARD + * + * @param interrupt: Select the SMC interrupt source. + * This parameter can be one of the following values: + * @arg SMC_INT_EDGE_RISING : Rising edge detection interrupt. + * @arg SMC_INT_LEVEL_HIGH : High level edge detection interrupt. + * @arg SMC_INT_EDGE_FALLING: Falling edge detection interrupt. + * + * @retval The status of specified SMC interrupt source. + */ +uint16_t SMC_ReadIntFlag(SMC_BANK_NAND_T bank, SMC_INT_T flag) +{ + uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; + + if(bank == SMC_BANK2_NAND) + { + tmpsr = SMC_Bank2->STSINT2; + } + else if(bank == SMC_BANK3_NAND) + { + tmpsr = SMC_Bank3->STSINT3; + } + else + { + tmpsr = SMC_Bank4->STSINT4; + } + + itstatus = tmpsr & flag; + itenable = tmpsr & (flag >> 3); + + if((itstatus != RESET) && (itenable != RESET)) + { + return SET; + } + else + { + return RESET; + } +} + +/*! + * @brief Clears the SMC's interrupt Flag. + * + * @param bank: Selects the SMC Bank. + * The parameter can be one of following values: + * @arg SMC_BANK2_NAND : SMC Bank2 NAND + * @arg SMC_BANK3_NAND : SMC Bank3 NAND + * @arg SMC_BANK4_PCCARD: SMC Bank4 PCCARD + * + * @param interrupt: Select the SMC interrupt sources. + * This parameter can be any combination of the following values: + * @arg SMC_INT_EDGE_RISING : Rising edge detection interrupt. + * @arg SMC_INT_LEVEL_HIGH : High level edge detection interrupt. + * @arg SMC_INT_EDGE_FALLING: Falling edge detection interrupt. + * + * @retval None + */ +void SMC_ClearIntFlag(SMC_BANK_NAND_T bank, uint32_t flag) +{ + if(bank == SMC_BANK2_NAND) + { + SMC_Bank2->STSINT2 &= ~(flag >> 3); + } + else if(bank == SMC_BANK3_NAND) + { + SMC_Bank3->STSINT3 &= ~(flag >> 3); + } + else + { + SMC_Bank4->STSINT4 &= ~(flag >> 3); + } +} + +/**@} end of group SMC_Functions */ +/**@} end of group SMC_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_spi.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_spi.c new file mode 100644 index 0000000000..b4a4fe9bb0 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_spi.c @@ -0,0 +1,619 @@ +/*! + * @file apm32e10x_spi.c + * + * @brief This file provides all the SPI firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_spi.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SPI_Driver + * @brief SPI driver modules + @{ +*/ + +/** @defgroup SPI_Functions Functions + @{ +*/ + +/*! + * @brief Reset the specified SPIx peripheral + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_I2S_Reset(SPI_T* spi) +{ + if(spi == SPI1) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_SPI1); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_SPI1); + } + else if(spi == SPI2) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_SPI2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_SPI2); + } + else if(spi == SPI3) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_SPI3); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_SPI3); + } +} + +/*! + * @brief Config the SPI peripheral according to the specified parameters in the spiConfig + * + * @param spi: The SPIx can be 1,2,3 + * + * @param spiConfig: pointer to a SPI_Config_T structure + * + * @retval None + */ +void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig) +{ + spi->CTRL1 &= 0x3040; + spi->CTRL1 |= (uint16_t)((uint32_t)spiConfig->direction | spiConfig->mode | + spiConfig->length | spiConfig->polarity | + spiConfig->phase | spiConfig->nss | + spiConfig->baudrateDiv | spiConfig->firstBit); + spi->CRCPOLY = spiConfig->crcPolynomial; +} + +/*! + * @brief Config the I2S peripheral according to the specified parameters in the spiConfig + * + * @param spi: The SPIx can be 2,3 + * + * @param i2sConfig: pointer to a I2S_Config_T structure + * + * @retval None + */ +void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig) +{ + uint16_t i2sDiv = 2, i2sOdd = 0, packetSize = 1; + uint32_t tmp = 0; + uint32_t sysClock = 0; + + /* Clear MODESEL, I2SEN, I2SMOD, PFSSEL, I2SSSEL, CPOL, DATALEN and CHLEN bits */ + spi->I2SCFG &= 0xF040; + spi->I2SPSC = 0x0002; + + if(i2sConfig->audioDiv == I2S_AUDIO_DIV_DEFAULT) + { + spi->I2SPSC_B.ODDPSC = 0; + spi->I2SPSC_B.I2SPSC = 2; + } + else + { + if(i2sConfig->length == I2S_DATA_LENGHT_16B) + { + packetSize = 1; + } + else + { + packetSize = 2; + } + + sysClock = RCM_ReadSYSCLKFreq(); + + if(i2sConfig->MCLKOutput == I2S_MCLK_OUTPUT_ENABLE) + { + tmp = (uint16_t)(((((sysClock / 256) * 10) / i2sConfig ->audioDiv)) + 5); + } + else + { + tmp = (uint16_t)(((((sysClock / (32 * packetSize)) *10 ) / i2sConfig ->audioDiv )) + 5); + } + tmp = tmp / 10; + + i2sOdd = (uint16_t)(tmp & (uint16_t)0x0001); + i2sDiv = (uint16_t)((tmp - i2sOdd) / 2); + + if ((i2sDiv < 2) || (i2sDiv > 0xFF)) + { + i2sDiv = 2; + i2sOdd = 0; + } + } + + spi->I2SPSC_B.I2SPSC = i2sDiv; + spi->I2SPSC_B.ODDPSC = i2sOdd; + spi->I2SPSC |= i2sConfig->MCLKOutput; + + spi->I2SCFG = (uint32_t)i2sConfig->mode | \ + (uint32_t)i2sConfig->standard | \ + (uint32_t)i2sConfig->length | \ + (uint32_t)i2sConfig->polarity; + + /** select I2S mode */ + spi->I2SCFG_B.MODESEL = BIT_SET; +} + +/*! + * @brief Fills each SPI_Config_T member with its default value + * + * @param spiConfig: pointer to a SPI_Config_T structure + * + * @retval None + */ +void SPI_ConfigStructInit(SPI_Config_T* spiConfig) +{ + spiConfig->direction = SPI_DIRECTION_2LINES_FULLDUPLEX; + spiConfig->mode = SPI_MODE_SLAVE; + spiConfig->length = SPI_DATA_LENGTH_8B; + spiConfig->polarity = SPI_CLKPOL_LOW; + spiConfig->phase = SPI_CLKPHA_1EDGE; + spiConfig->nss = SPI_NSS_HARD; + spiConfig->baudrateDiv = SPI_BAUDRATE_DIV_2; + spiConfig->firstBit = SPI_FIRSTBIT_MSB; + spiConfig->crcPolynomial = 7; +} + +/*! + * @brief Fills each I2S_Config_T member with its default value + * + * @param i2sConfig: pointer to a I2S_Config_T structure + * + * @retval None + */ +void I2S_ConfigStructInit(I2S_Config_T* i2sConfig) +{ + i2sConfig->mode = I2S_MODE_SLAVE_TX; + i2sConfig->standard = I2S_STANDARD_PHILLIPS; + i2sConfig->length = I2S_DATA_LENGHT_16B; + i2sConfig->MCLKOutput = I2S_MCLK_OUTPUT_DISABLE; + i2sConfig->audioDiv = I2S_AUDIO_DIV_DEFAULT; + i2sConfig->polarity = I2S_CLKPOL_LOW; +} +/*! + * @brief Enables the specified SPI peripheral + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_Enable(SPI_T* spi) +{ + spi->CTRL1_B.SPIEN = BIT_SET; +} + +/*! + * @brief Disable the specified SPI peripheral + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_Disable(SPI_T* spi) +{ + spi->CTRL1_B.SPIEN = BIT_RESET; +} + +/*! + * @brief Enables the specified I2S peripheral + * + * @param spi: The I2S can be SPI2,SPI3 + * + * @retval None + */ +void I2S_Enable(SPI_T* spi) +{ + spi->I2SCFG_B.I2SEN = BIT_SET; +} + +/*! + * @brief Disable the specified I2S peripheral + * + * @param spi: The I2S can be SPI2,SPI3 + * + * @retval None + */ +void I2S_Disable(SPI_T* spi) +{ + spi->I2SCFG_B.I2SEN = BIT_RESET; +} + +/*! + * @brief Enables the SPIx/I2Sx DMA interface. + * + * @param spi: The SPIx can be 1,2,3, When the I2S can be 2,3 + * + * @param dmaReq: specifies the SPI/I2S DMA transfer request + * The parameter can be one of following values: + * @arg SPI_I2S_DMA_REQ_TX: Tx buffer DMA transfer request + * @arg SPI_I2S_DMA_REQ_RX: Rx buffer DMA transfer request + * @retval None + */ +void SPI_I2S_EnableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq) +{ + if(dmaReq == SPI_I2S_DMA_REQ_TX) + { + spi->CTRL2_B.TXDEN = ENABLE; + } + else + { + spi->CTRL2_B.RXDEN = ENABLE; + } +} + +/*! + * @brief Disables the SPIx/I2Sx DMA interface. + * + * @param spi: The SPIx can be 1,2,3, When the I2S can be 2,3 + * + * @param dmaReq: specifies the SPI/I2S DMA transfer request + * The parameter can be one of following values: + * @arg SPI_I2S_DMA_REQ_TX: Tx buffer DMA transfer request + * @arg SPI_I2S_DMA_REQ_RX: Rx buffer DMA transfer request + * @retval None + */ +void SPI_I2S_DisableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq) +{ + if(dmaReq == SPI_I2S_DMA_REQ_TX) + { + spi->CTRL2_B.TXDEN = DISABLE; + } + else + { + spi->CTRL2_B.RXDEN = DISABLE; + } +} + +/*! + * @brief Transmits a Data through the SPIx/I2Sx peripheral. + * + * @param spi: The SPIx can be 1,2,3, When the I2S can be 2,3 + * + * @param data: Data to be transmitted + * + * @retval None + */ +void SPI_I2S_TxData(SPI_T* spi, uint16_t data) +{ + spi->DATA = data; +} + +/*! + * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. + * + * @param spi: The SPIx can be 1,2,3, When the I2S can be 2,3 + * + * @retval data :The value of the received data + * + * @retval None + */ +uint16_t SPI_I2S_RxData(SPI_T* spi) +{ + return spi->DATA; +} + +/*! + * @brief Set the SPI NSS internal by Software + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_SetSoftwareNSS(SPI_T* spi) +{ + spi->CTRL1_B.ISSEL = BIT_SET; +} + +/*! + * @brief Reset the SPI NSS internal by Software + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_ResetSoftwareNSS(SPI_T* spi) +{ + spi->CTRL1_B.ISSEL = BIT_RESET; +} + +/*! + * @brief Enables the specified SPI SS output + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_EnableSSOutput(SPI_T* spi) +{ + spi->CTRL2_B.SSOEN = BIT_SET; +} + +/*! + * @brief Disable the specified SPI SS output + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_DisableSSOutput(SPI_T* spi) +{ + spi->CTRL2_B.SSOEN = BIT_RESET; +} + +/*! + * @brief Configures the specified SPI data size + * + * @param spi: The SPIx can be 1,2,3 + * + * @param length: specifies the SPI data size. + * This parameter can be one of the following values: + * @arg SPI_DATA_LENGTH_16B: Set data frame format to 16bit + * @arg SPI_DATA_LENGTH_8B : Set data frame format to 8bit + * + * @retval None + */ +void SPI_ConfigDataSize(SPI_T* spi, SPI_DATA_LENGTH_T length) +{ + spi->CTRL1_B.DFLSEL = BIT_RESET; + spi->CTRL1 |= length; +} + +/*! + * @brief Transmit CRC value + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_TxCRC(SPI_T* spi) +{ + spi->CTRL1_B.CRCNXT = BIT_SET; +} + +/*! + * @brief Enables the specified SPI CRC value calculation of the transferred bytes + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval None + */ +void SPI_EnableCRC(SPI_T* spi) +{ + spi->CTRL1_B.CRCEN = BIT_SET; +} + +/*! + * @brief Disable the specified SPI CRC value calculation of the transferred bytes + * + * @param spi: The SPIx can be 1,2,3 + * + */ +void SPI_DisableCRC(SPI_T* spi) +{ + spi->CTRL1_B.CRCEN = BIT_RESET; +} + +/*! + * @brief Reads the specified SPI transmit CRC register value + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval The SPI transmit CRC register value + */ +uint16_t SPI_ReadTxCRC(SPI_T* spi) +{ + return spi->TXCRC_B.TXCRC; +} + +/*! + * @brief Reads the specified SPI receive CRC register value + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval The SPI receive CRC register value + */ +uint16_t SPI_ReadRxCRC(SPI_T* spi) +{ + return spi->RXCRC_B.RXCRC; +} + +/*! + * @brief Reads the specified SPI CRC Polynomial register value + * + * @param spi: The SPIx can be 1,2,3 + * + * @retval The SPI CRC Polynomial register value + */ +uint16_t SPI_ReadCRCPolynomial(SPI_T* spi) +{ + return spi->CRCPOLY_B.CRCPOLY; +} + +/*! + * @brief Configures the specified SPI data transfer direction + * + * @param spi: The SPIx can be 1,2,3 + * + * @param direction: Select the SPI data transfer direction + * The parameter can be one of following values: + * @arg SPI_DIRECTION_RX: Selects Rx receive direction + * @arg SPI_DIRECTION_TX: Selects Tx transmission direction + * @retval None + */ +void SPI_ConfigBiDirectionalLine(SPI_T* spi, SPI_DIRECTION_SELECT_T direction) +{ + if(direction == SPI_DIRECTION_TX) + { + spi->CTRL1 |= SPI_DIRECTION_TX; + } + else + { + spi->CTRL1 &= SPI_DIRECTION_RX; + } +} + +/*! + * @brief Enables the specified SPI/I2S interrupts. + * + * @param spi: The SPIx can be 1,2,3, When the I2S can be 2,3 + * + * @param interrupt: specifies the TMR interrupts sources + * The parameter can be one of following values: + * @arg SPI_I2S_INT_TXBE: Tx buffer empty interrupt + * @arg SPI_I2S_INT_RXBNE: Rx buffer not empty interrupt + * @arg SPI_I2S_INT_ERR: Error interrupt + * @retval None + */ +void SPI_I2S_EnableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt) +{ + spi->CTRL2 |= (interrupt >> 8); +} + +/*! + * @brief Disables the specified SPI/I2S interrupts. + * + * @param spi: The SPIx can be 1,2,3, When the I2S can be 2,3 + * + * @param interrupt: specifies the TMR interrupts sources + * The parameter can be one of following values: + * @arg SPI_I2S_INT_TXBE: Tx buffer empty interrupt + * @arg SPI_I2S_INT_RXBNE: Rx buffer not empty interrupt + * @arg SPI_I2S_INT_ERR: Error interrupt + * @retval None + */ +void SPI_I2S_DisableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt) +{ + spi->CTRL2 &= ~(interrupt >> 8); +} + +/*! + * @brief Checks whether the specified SPI/I2S flag is set or not. + * + * @param spi: The SPIx can be 1,2,3, When the I2S can be 2,3 + * + * @param flag: specifies the SPI/I2S flag to check + * The parameter can be one of following values: + * @arg SPI_FLAG_RXBNE: Receive buffer not empty flag + * @arg SPI_FLAG_TXBE: Transmit buffer empty flag + * @arg I2S_FLAG_SCHDIR: Side Channel flag + * @arg I2S_FLAG_UDR: Underrun Error flag + * @arg SPI_FLAG_CRCE: CRC Error flag + * @arg SPI_FLAG_ME: Mode Error flag + * @arg SPI_FLAG_OVR: Overrun flag + * @arg SPI_FLAG_BSY: Busy flag + * + * @retval SET or RESET + */ +uint8_t SPI_I2S_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag) +{ + if((spi->STS & flag) != RESET) + { + return SET; + } + else + { + return RESET; + } +} + +/*! + * @brief Clears the SPIx CRC Error flag + * + * @param spi: The SPIx can be 1,2,3 + * + * @param flag: only clears SPI_FLAG_CRCE(CRC Error flag) + * + * @retval None + * + * @note 1)SPI_FLAG_OVR: (OverRun error) flag is cleared by software sequence: + * a read operation to SPI_DATA register (SPI_I2S_RxData()) + * followed by a read operation to SPI_STS register (SPI_I2S_ReadStatusFlag()). + * 2)I2S_FLAG_UDR: (UnderRun error) flag is cleared: + * a read operation to SPI_STS register (SPI_I2S_ReadStatusFlag()). + * 3)SPI_FLAG_ME: (Mode Fault) flag is cleared by software sequence: + * a read/write operation to SPI_STS register (SPI_I2S_ReadStatusFlag()) + * followed by a write operation to SPI_CTRL1 register (SPI_Enable()). + */ +void SPI_I2S_ClearStatusFlag(SPI_T* spi, SPI_FLAG_T flag) +{ + spi->STS_B.CRCEFLG = BIT_RESET; +} + +/*! + * @brief Checks whether the specified SPI/I2S interrupt has occurred or not. + * + * @param spi: The SPIx can be 1,2,3, When the I2S can be 2,3 + * + * @param flag: specifies the SPI/I2S interrupt flag to check. + * The parameter can be one of following values: + * @arg SPI_I2S_INT_RXBNE: Receive buffer not empty interrupt flag + * @arg SPI_I2S_INT_TXBE: Transmit buffer empty interrupt flag + * @arg SPI_I2S_INT_OVR: Overrun interrupt flag + * @arg SPI_INT_CRCE: CRC Error interrupt flag + * @arg SPI_INT_ME: Mode Error interrupt flag + * @arg I2S_INT_UDR: Underrun Error interrupt flag + * + * @retval SET or RESET + */ +uint8_t SPI_I2S_ReadIntFlag(SPI_T* spi, SPI_I2S_INT_T flag) +{ + uint32_t intEnable; + uint32_t intStatus; + + intEnable = (uint32_t)(spi->CTRL2 & (flag>>8)); + intStatus = (uint32_t)(spi->STS & flag); + + if (intEnable && intStatus) + { + return SET; + } + + return RESET; +} + +/*! + * @brief Clears the SPIx CRC Error interrupt flag + * + * @param spi: The SPIx can be 1,2,3 + * + * @param flag: only clears SPI_INT_CRCE(CRC Error interrupt flag) + * + * @retval None + * + * @note 1)SPI_I2S_INT_OVR: (OverRun interrupt error) flag is cleared by software sequence: + * a read operation to SPI_DATA register (SPI_I2S_RxData()) + * followed by a read operation to SPI_STS register (SPI_I2S_ReadIntFlag()). + * 2)I2S_INT_UDR: (UnderRun interrupt error) flag is cleared: + * a read operation to SPI_STS register (SPI_I2S_ReadIntFlag()). + * 3)SPI_INT_ME: (Mode interrupt Fault) flag is cleared by software sequence: + * a read/write operation to SPI_STS register (SPI_I2S_ReadIntFlag()) + * followed by a write operation to SPI_CTRL1 register (SPI_Enable()). + */ +void SPI_I2S_ClearIntFlag(SPI_T* spi, SPI_I2S_INT_T flag) +{ + spi->STS_B.CRCEFLG = BIT_RESET; +} + +/**@} end of group SPI_Functions */ +/**@} end of group SPI_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_tmr.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_tmr.c new file mode 100644 index 0000000000..01783bc3cb --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_tmr.c @@ -0,0 +1,2148 @@ +/*! + * @file apm32e10x_tmr.c + * + * @brief This file provides all the TMR firmware functions. + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_tmr.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup TMR_Driver + * @brief TMR driver modules + @{ +*/ + +/** @defgroup TMR_Functions Functions + @{ +*/ + +static void TI1Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI2Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI3Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI4Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); + +/*! + * @brief Deinitializes the TMRx peripheral registers to their default reset values. + * + * @param tmr: Select TMRx peripheral, The x can be 1 to 8 + * + * @retval None + * + * @note + */ +void TMR_Reset(TMR_T* tmr) +{ + if (tmr == TMR1) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_TMR1); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_TMR1); + } + else if (tmr == TMR2) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR2); + } + else if (tmr == TMR3) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR3); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR3); + } + else if (tmr == TMR4) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR4); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR4); + } + else if (tmr == TMR5) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR5); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR5); + } + else if (tmr == TMR6) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR6); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR6); + } + else if (tmr == TMR7) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR7); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR7); + } + else if (tmr == TMR8) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_TMR8); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_TMR8); + } +} + +/*! + * @brief Initializes the base timer through the structure + * + * @param tmr: Select TMRx peripheral, The x can be 1 to 8 + * + * @param baseConfig: Pointer to a TMR_BaseConfig_T structure + * + * @retval None + */ +void TMR_ConfigTimeBase(TMR_T* tmr, TMR_BaseConfig_T* baseConfig) +{ + uint16_t temp; + + if ((tmr == TMR1) || (tmr == TMR8) || (tmr == TMR2) || (tmr == TMR3) || + (tmr == TMR4) || (tmr == TMR5)) + { + temp = tmr->CTRL1; + temp &= 0x038F; + temp |= baseConfig->countMode; + tmr->CTRL1 = temp; + } + + if ((tmr != TMR6) && (tmr != TMR7)) + { + tmr->CTRL1_B.CLKDIV = baseConfig->clockDivision; + } + + tmr->AUTORLD = baseConfig->period; + tmr->PSC = baseConfig->division; + + if ((tmr == TMR1) || (tmr == TMR8)) + { + tmr->REPCNT = baseConfig->repetitionCounter; + } + tmr->CEG_B.UEG = 0x01; +} + +/*! + * @brief Configure channel 1 according to parameters + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OC1Config: Pointer to a TMR_OCConfig_T structure + * + * @retval None + */ +void TMR_ConfigOC1(TMR_T* tmr, TMR_OCConfig_T* OC1Config) +{ + tmr->CCEN_B.CC1EN = BIT_RESET; + + tmr->CCM1_COMPARE_B.CC1SEL = BIT_RESET; + tmr->CCM1_COMPARE_B.OC1MOD = OC1Config->mode; + + tmr->CCEN_B.CC1POL = OC1Config->polarity; + tmr->CCEN_B.CC1EN = OC1Config->outputState; + + if ((tmr == TMR1) || (tmr == TMR8)) + { + tmr->CCEN_B.CC1NPOL = OC1Config->nPolarity; + tmr->CCEN_B.CC1NEN = OC1Config->outputNState; + + tmr->CTRL2_B.OC1OIS = BIT_RESET; + tmr->CTRL2_B.OC1NOIS = BIT_RESET; + tmr->CTRL2_B.OC1OIS = OC1Config->idleState; + tmr->CTRL2_B.OC1NOIS = OC1Config->nIdleState; + } + tmr->CC1 = OC1Config->pulse; +} + +/*! + * @brief Configure channel 2 according to parameters + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OC2Config: Pointer to a TMR_OCConfig_T structure + * + * @retval None + */ +void TMR_ConfigOC2(TMR_T* tmr, TMR_OCConfig_T* OC2Config) +{ + tmr->CCEN_B.CC2EN = BIT_RESET; + + tmr->CCM1_COMPARE_B.OC2MOD = BIT_RESET; + tmr->CCM1_COMPARE_B.CC2SEL = BIT_RESET; + tmr->CCM1_COMPARE_B.OC2MOD = OC2Config->mode; + + tmr->CCEN_B.CC2POL = BIT_RESET; + tmr->CCEN_B.CC2POL = OC2Config->polarity; + tmr->CCEN_B.CC2EN = OC2Config->outputState; + + if ((tmr == TMR1) || (tmr == TMR8)) + { + tmr->CCEN_B.CC2NPOL = BIT_RESET; + tmr->CCEN_B.CC2NPOL = OC2Config->nPolarity; + + tmr->CCEN_B.CC2NEN = BIT_RESET; + tmr->CCEN_B.CC2NEN = OC2Config->outputNState; + + tmr->CTRL2_B.OC2OIS = BIT_RESET; + tmr->CTRL2_B.OC2NOIS = BIT_RESET; + tmr->CTRL2_B.OC2OIS = OC2Config->idleState; + tmr->CTRL2_B.OC2NOIS = OC2Config->nIdleState; + } + tmr->CC2 = OC2Config->pulse; +} + +/*! + * @brief Configure channel 3 according to parameters + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OC3Config: Pointer to a TMR_OCConfig_T structure + * + * @retval None + */ +void TMR_ConfigOC3(TMR_T* tmr, TMR_OCConfig_T* OC3Config) +{ + tmr->CCEN_B.CC3EN = BIT_RESET; + + tmr->CCM2_COMPARE_B.OC3MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.CC3SEL = BIT_RESET; + tmr->CCM2_COMPARE_B.OC3MOD = OC3Config->mode; + + tmr->CCEN_B.CC3POL = BIT_RESET; + tmr->CCEN_B.CC3POL = OC3Config->polarity; + tmr->CCEN_B.CC3EN = OC3Config->outputState; + + if ((tmr == TMR1) || (tmr == TMR8)) + { + tmr->CCEN_B.CC3NPOL = BIT_RESET; + tmr->CCEN_B.CC3NPOL = OC3Config->nPolarity; + tmr->CCEN_B.CC3NEN = BIT_RESET; + tmr->CCEN_B.CC3NEN = OC3Config->outputNState; + + tmr->CTRL2_B.OC3OIS = BIT_RESET; + tmr->CTRL2_B.OC3NOIS = BIT_RESET; + tmr->CTRL2_B.OC3OIS = OC3Config->idleState; + tmr->CTRL2_B.OC3NOIS = OC3Config->nIdleState; + } + tmr->CC3 = OC3Config->pulse; +} + +/*! + * @brief Configure channel 4 according to parameters + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OC4Config: Pointer to a TMR_OCConfig_T structure + * + * @retval None + */ +void TMR_ConfigOC4(TMR_T* tmr, TMR_OCConfig_T* OC4Config) +{ + tmr->CCEN_B.CC4EN = BIT_RESET; + + tmr->CCM2_COMPARE_B.OC4MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.CC4SEL = BIT_RESET; + tmr->CCM2_COMPARE_B.OC4MOD = OC4Config->mode; + + tmr->CCEN_B.CC4POL = BIT_RESET; + tmr->CCEN_B.CC4POL = OC4Config->polarity; + tmr->CCEN_B.CC4EN = OC4Config->outputState; + + if ((tmr == TMR1) || (tmr == TMR8)) + { + tmr->CTRL2_B.OC4OIS = BIT_RESET; + tmr->CTRL2_B.OC4OIS = OC4Config->idleState; + } + tmr->CC4 = OC4Config->pulse; +} + +/*! + * @brief Configure Peripheral equipment + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param ICConfig: Pointer to a TMR_ICConfig_T structure + * + * @retval None + */ +void TMR_ConfigIC(TMR_T* tmr, TMR_ICConfig_T* ICConfig) +{ + if (ICConfig->channel == TMR_CHANNEL_1) + { + TI1Config(tmr, ICConfig->polarity, ICConfig->selection, ICConfig->filter); + TMR_ConfigIC1Prescal(tmr, ICConfig->prescaler); + } + else if (ICConfig->channel == TMR_CHANNEL_2) + { + TI2Config(tmr, ICConfig->polarity, ICConfig->selection, ICConfig->filter); + TMR_ConfigIC2Prescal(tmr, ICConfig->prescaler); + } + else if (ICConfig->channel == TMR_CHANNEL_3) + { + TI3Config(tmr, ICConfig->polarity, ICConfig->selection, ICConfig->filter); + TMR_ConfigIC3Prescal(tmr, ICConfig->prescaler); + } + else if (ICConfig->channel == TMR_CHANNEL_4) + { + TI4Config(tmr, ICConfig->polarity, ICConfig->selection, ICConfig->filter); + TMR_ConfigIC4Prescal(tmr, ICConfig->prescaler); + } +} + +/*! + * @brief Configures the: Break feature, dead time, Lock level, the IMOS + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @param BDTConfig: Pointer to a TMR_BDTConfig_T structure + * + * @retval None + */ +void TMR_ConfigBDT(TMR_T* tmr, TMR_BDTConfig_T* BDTConfig) +{ + tmr->BDT = (BDTConfig->IMOS)<<10 |\ + (BDTConfig->RMOS)<<11 |\ + (BDTConfig->lockLevel)<<8 |\ + (BDTConfig->deadTime) |\ + (BDTConfig->BRKState)<<12 |\ + (BDTConfig->BRKPolarity)<<13 |\ + (BDTConfig->automaticOutput)<<14; +} + +/*! + * @brief Initialize the Base timer with its default value. + * + * @param baseConfig: pointer to a TMR_BaseConfig_T + * + * @retval None + */ +void TMR_ConfigTimeBaseStructInit(TMR_BaseConfig_T* baseConfig) +{ + baseConfig->period = 0xFFFF; + baseConfig->division = 0x0000; + baseConfig->clockDivision = TMR_CLOCK_DIV_1; + baseConfig->countMode = TMR_COUNTER_MODE_UP; + baseConfig->repetitionCounter = 0x0000; +} + +/*! + * @brief Initialize the OC timer with its default value. + * + * @param OCConfig: pointer to a TMR_OCConfig_T + * + * @retval None + */ +void TMR_ConfigOCStructInit(TMR_OCConfig_T* OCConfig) +{ + OCConfig->mode = TMR_OC_MODE_TMRING; + OCConfig->outputState = TMR_OC_STATE_DISABLE; + OCConfig->outputNState = TMR_OC_NSTATE_DISABLE; + OCConfig->pulse = 0x0000; + OCConfig->polarity = TMR_OC_POLARITY_HIGH; + OCConfig->nPolarity = TMR_OC_NPOLARITY_HIGH; + OCConfig->idleState = TMR_OC_IDLE_STATE_RESET; + OCConfig->nIdleState = TMR_OC_NIDLE_STATE_RESET; +} + +/*! + * @brief Initialize the IC timer with its default value. + * + * @param ICConfig: pointer to a TMR_ICConfig_T + * + * @retval None + */ +void TMR_ConfigICStructInit(TMR_ICConfig_T* ICConfig) +{ + ICConfig->channel = TMR_CHANNEL_1; + ICConfig->polarity = TMR_IC_POLARITY_RISING; + ICConfig->selection = TMR_IC_SELECTION_DIRECT_TI; + ICConfig->prescaler = TMR_IC_PSC_1; + ICConfig->filter = 0x00; +} + +/*! + * @brief Initialize the BDT timer with its default value. + * + * @param BDTConfig: pointer to a TMR_BDTConfig_T + * + * @retval None + */ +void TMR_ConfigBDTStructInit( TMR_BDTConfig_T* BDTConfig) +{ + BDTConfig->RMOS = TMR_RMOS_STATE_DISABLE; + BDTConfig->IMOS = TMR_IMOS_STATE_DISABLE; + BDTConfig->lockLevel = TMR_LOCK_LEVEL_OFF; + BDTConfig->deadTime = 0x00; + BDTConfig->BRKState = TMR_BRK_STATE_DISABLE; + BDTConfig->BRKPolarity = TMR_BRK_POLARITY_LOW; + BDTConfig->automaticOutput = TMR_AUTOMATIC_OUTPUT_DISABLE; +} + +/*! + * @brief Enable the specified TMR peripheral + * + * @param tmr: The TMRx can be 1 to 8 + * + * @retval None + */ +void TMR_Enable(TMR_T* tmr) +{ + tmr->CTRL1_B.CNTEN = ENABLE; +} + +/*! + * @brief Disable the specified TMR peripheral + * + * @param tmr: The TMRx can be 1 to 8 + * + * @retval None + */ +void TMR_Disable(TMR_T* tmr) +{ + tmr->CTRL1_B.CNTEN = DISABLE; +} + +/*! + * @brief Config of TMR to PWM + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param PWMConfig: pointer to a TMR_ICConfig_T + * + * @retval None + */ +void TMR_ConfigPWM(TMR_T* tmr, TMR_ICConfig_T* PWMConfig) +{ + uint16_t icpolarity = TMR_IC_POLARITY_RISING; + uint16_t icselection = TMR_IC_SELECTION_DIRECT_TI; + + if (PWMConfig->polarity == TMR_IC_POLARITY_RISING) + { + icpolarity = TMR_IC_POLARITY_FALLING; + } + else + { + icpolarity = TMR_IC_POLARITY_RISING; + } + + if (PWMConfig->selection == TMR_IC_SELECTION_DIRECT_TI) + { + icselection = TMR_IC_SELECTION_INDIRECT_TI; + } + else + { + icselection = TMR_IC_SELECTION_DIRECT_TI; + } + + if (PWMConfig->channel == TMR_CHANNEL_1) + { + TI1Config(tmr, PWMConfig->polarity, PWMConfig->selection, PWMConfig->filter); + TMR_ConfigIC1Prescal(tmr, PWMConfig->prescaler); + TI2Config(tmr, icpolarity, icselection, PWMConfig->filter); + TMR_ConfigIC2Prescal(tmr, PWMConfig->prescaler); + } + else + { + TI2Config(tmr, PWMConfig->polarity, PWMConfig->selection, PWMConfig->filter); + TMR_ConfigIC2Prescal(tmr, PWMConfig->prescaler); + TI1Config(tmr, icpolarity, icselection, PWMConfig->filter); + TMR_ConfigIC1Prescal(tmr, PWMConfig->prescaler); + } +} + +/*! + * @brief Enable TMRx PWM output + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @retval None + */ +void TMR_EnablePWMOutputs(TMR_T* tmr) +{ + tmr->BDT_B.MOEN = ENABLE; +} + +/*! + * @brief Disable TMRx PWM output. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @retval None + */ +void TMR_DisablePWMOutputs(TMR_T* tmr) +{ + tmr->BDT_B.MOEN = DISABLE; +} + +/*! + * @brief Configures the TMRx's DMA interface. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param baseAddress: pointer to a TMR_DMA_BASE_T + * + * @param burstLength: pointer to a TMR_DMA_BURSTLENGTH_T + * + * @retval None + */ +void TMR_ConfigDMA(TMR_T* tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T burstLength) +{ + tmr->DCTRL = (uint32_t)baseAddress | (uint32_t)burstLength; +} + +/*! + * @brief Enable TMRx Requests. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param souces: specifies the TMR DMA souces + * The parameter can be any combination of following values: + * @arg TMR_DMA_SOURCE_UPDATE: TMR update DMA souces + * @arg TMR_DMA_SOURCE_CC1: TMR Capture Compare 1 DMA souces + * @arg TMR_DMA_SOURCE_CC2: TMR Capture Compare 2 DMA souces + * @arg TMR_DMA_SOURCE_CC3: TMR Capture Compare 3 DMA souces + * @arg TMR_DMA_SOURCE_CC4: TMR Capture Compare 4 DMA souces + * @arg TMR_DMA_SOURCE_COM: TMR Commutation DMA souces + * @arg TMR_DMA_SOURCE_TRG: TMR Trigger DMA souces + * @retval None + * + * @note + */ +void TMR_EnableDMASoure(TMR_T* tmr, uint16_t dmaSource) +{ + tmr->DIEN |= dmaSource; +} + +/*! + * @brief Disable TMRx Requests. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param souces: specifies the TMR DMA souces + * The parameter can be any combination of following values: + * @arg TMR_DMA_SOURCE_UPDATE: TMR update DMA souces + * @arg TMR_DMA_SOURCE_CC1: TMR Capture Compare 1 DMA souces + * @arg TMR_DMA_SOURCE_CC2: TMR Capture Compare 2 DMA souces + * @arg TMR_DMA_SOURCE_CC3: TMR Capture Compare 3 DMA souces + * @arg TMR_DMA_SOURCE_CC4: TMR Capture Compare 4 DMA souces + * @arg TMR_DMA_SOURCE_COM: TMR Commutation DMA souces + * @arg TMR_DMA_SOURCE_TRG: TMR Trigger DMA souces + * @retval None + * + * @note + */ +void TMR_DisableDMASoure(TMR_T* tmr, uint16_t dmaSource) +{ + tmr->DIEN &= ~dmaSource; +} + +/*! + * @brief Configures the TMRx internal Clock + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval None + */ +void TMR_ConfigInternalClock(TMR_T* tmr) +{ + tmr->SMCTRL_B.SMFSEL = DISABLE; +} + +/*! + * @brief Configures the TMRx Internal Trigger as External Clock + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param triggerSource: specifies the TMR trigger souces + * The parameter can be one of following values: + * @arg TMR_TRIGGER_SOURCE_ITR0: TMR Internal Trigger 0 + * @arg TMR_TRIGGER_SOURCE_ITR1: TMR Internal Trigger 1 + * @arg TMR_TRIGGER_SOURCE_ITR2: TMR Internal Trigger 2 + * @arg TMR_TRIGGER_SOURCE_ITR3: TMR Internal Trigger 3 + * @retval None + */ +void TMR_ConfigIntTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource) +{ + TMR_SelectInputTrigger(tmr, triggerSource); + tmr->SMCTRL_B.SMFSEL = 0x07; +} + +/*! + * @brief Configures the TMRx Trigger as External Clock + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param triggerSource: specifies the TMR trigger souces + * The parameter can be one of following values: + * @arg TMR_TRIGGER_SOURCE_TI1F_ED: TI1 Edge Detector + * @arg TMR_TRIGGER_SOURCE_TI1FP1: Filtered Timer Input 1 + * @arg TMR_TRIGGER_SOURCE_TI2FP2: Filtered Timer Input 2 + * + * @param ICpolarity: specifies the TMR IC polarity + * The parameter can be one of following values: + * @arg TMR_IC_POLARITY_RISING: TMR IC polarity rising + * @arg TMR_IC_POLARITY_FALLING: TMR IC polarity falling + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F. + * + * @retval None + */ +void TMR_ConfigTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource, + TMR_IC_POLARITY_T ICpolarity, uint16_t ICfilter) +{ + if (triggerSource == 0x06) + { + TI2Config(tmr, ICpolarity, TMR_IC_SELECTION_DIRECT_TI, ICfilter); + } + else + { + TI1Config(tmr, ICpolarity, TMR_IC_SELECTION_DIRECT_TI, ICfilter); + } + + TMR_SelectInputTrigger(tmr, triggerSource); + tmr->SMCTRL_B.SMFSEL = 0x07; +} + +/*! + * @brief Configures the External clock Mode1 + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param prescaler: specifies the external Trigger Prescaler + * The parameter can be one of following values: + * @arg TMR_EXTTRG_PSC_OFF: ETRP Prescaler OFF + * @arg TMR_EXTTRG_PSC_DIV2: ETRP frequency divided by 2 + * @arg TMR_EXTTRG_PSC_DIV4: ETRP frequency divided by 4 + * @arg TMR_EXTTRG_PSC_DIV8: ETRP frequency divided by 8 + * + * @param polarity: specifies the TMR IC polarity + * The parameter can be one of following values: + * @arg TMR_EXTTRG_POL_INVERTED: Active low or falling edge active + * @arg TMR_EXTTGR_POL_NONINVERTED: Active high or rising edge active + * + * @param filter: This parameter must be a value between 0x00 and 0x0F. + * + * @retval None + */ +void TMR_ConfigETRClockMode1(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter) +{ + TMR_ConfigETR(tmr, prescaler, polarity, filter); + tmr->SMCTRL_B.SMFSEL = BIT_RESET; + tmr->SMCTRL_B.SMFSEL = 0x07; + tmr->SMCTRL_B.TRGSEL = 0x07; +} + +/*! + * @brief Configures the External clock Mode2 + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param prescaler: specifies the external Trigger Prescaler + * The parameter can be one of following values: + * @arg TMR_EXTTRG_PSC_OFF: ETRP Prescaler OFF + * @arg TMR_EXTTRG_PSC_DIV2: ETRP frequency divided by 2 + * @arg TMR_EXTTRG_PSC_DIV4: ETRP frequency divided by 4 + * @arg TMR_EXTTRG_PSC_DIV8: ETRP frequency divided by 8 + * + * @param polarity: specifies the TMR IC polarity + * The parameter can be one of following values: + * @arg TMR_EXTTRG_POL_INVERTED: Active low or falling edge active + * @arg TMR_EXTTGR_POL_NONINVERTED: Active high or rising edge active + * + * @param filter: This parameter must be a value between 0x00 and 0x0F. + * + * @retval None + */ +void TMR_ConfigETRClockMode2(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter) +{ + TMR_ConfigETR(tmr, prescaler, polarity, filter); + tmr->SMCTRL_B.ECEN = ENABLE; +} +/*! + * @brief Configures the TMRx External Trigger (ETR). + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param prescaler: specifies the external Trigger Prescaler + * The parameter can be one of following values: + * @arg TMR_EXTTRG_PSC_OFF: ETRP Prescaler OFF + * @arg TMR_EXTTRG_PSC_DIV2: ETRP frequency divided by 2 + * @arg TMR_EXTTRG_PSC_DIV4: ETRP frequency divided by 4 + * @arg TMR_EXTTRG_PSC_DIV8: ETRP frequency divided by 8 + * + * @param polarity: specifies the TMR IC polarity + * The parameter can be one of following values: + * @arg TMR_EXTTRG_POL_INVERTED: Active low or falling edge active + * @arg TMR_EXTTGR_POL_NONINVERTED: Active high or rising edge active + * + * @param filter: This parameter must be a value between 0x00 and 0x0F. + * + * @retval None + */ +void TMR_ConfigETR(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter) +{ + tmr->SMCTRL &= 0x00FF; + tmr->SMCTRL_B.ETPCFG = prescaler; + tmr->SMCTRL_B.ETPOL = polarity; + tmr->SMCTRL_B.ETFCFG = filter; +} + +/*! + * @brief Configures the TMRx prescaler. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param prescaler: specifies the prescaler Register value + * + * @param pscReloadMode: specifies the TMR prescaler Reload mode + * The parameter can be one of following values: + * @arg TMR_PSC_RELOAD_UPDATE: The Prescaler is loaded at the update event + * @arg TMR_PSC_RELOAD_IMMEDIATE: The Prescaler is loaded immediately + * @retval None + */ +void TMR_ConfigPrescaler(TMR_T* tmr, uint16_t prescaler, TMR_PSC_RELOAD_T pscReloadMode) +{ + tmr->PSC = prescaler; + tmr->CEG_B.UEG = pscReloadMode; +} + +/*! + * @brief Config counter mode + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param countMode:specifies the Counter Mode to be used + * The parameter can be one of following values: + * @arg TMR_COUNTER_MODE_UP: Timer Up Counting Mode + * @arg TMR_COUNTER_MODE_DOWN: Timer Down Counting Mode + * @arg TMR_COUNTER_MODE_CENTERALIGNED1: Timer Center Aligned Mode1 + * @arg TMR_COUNTER_MODE_CENTERALIGNED2: Timer Center Aligned Mode2 + * @arg TMR_COUNTER_MODE_CENTERALIGNED3: Timer Center Aligned Mode3 + * @retval None + */ +void TMR_ConfigCounterMode(TMR_T* tmr, TMR_COUNTER_MODE_T countMode) +{ + tmr->CTRL1_B.CNTDIR = BIT_RESET; + tmr->CTRL1_B.CAMSEL = BIT_RESET; + tmr->CTRL1 |= countMode; +} + +/*! + * @brief Selects the Input Trigger source + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param triggerSource: specifies the Input Trigger source + * The parameter can be one of following values: + * @arg TMR_TRIGGER_SOURCE_ITR0: Internal Trigger 0 + * @arg TMR_TRIGGER_SOURCE_ITR1: Internal Trigger 1 + * @arg TMR_TRIGGER_SOURCE_ITR2: Internal Trigger 2 + * @arg TMR_TRIGGER_SOURCE_ITR3: Internal Trigger 3 + * @arg TMR_TRIGGER_SOURCE_TI1F_ED: TI1 Edge Detector + * @arg TMR_TRIGGER_SOURCE_TI1FP1: Filtered Timer Input 1 + * @arg TMR_TRIGGER_SOURCE_TI2FP2: Filtered Timer Input 2 + * @arg TMR_TRIGGER_SOURCE_ETRF: External Trigger input + * + * @retval None + */ +void TMR_SelectInputTrigger(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource) +{ + tmr->SMCTRL_B.TRGSEL = BIT_RESET; + tmr->SMCTRL_B.TRGSEL = triggerSource; +} + +/*! + * @brief Configures the Encoder Interface. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param encodeMode: specifies the Encoder Mode + * The parameter can be one of following values: + * @arg TMR_ENCODER_MODE_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level + * @arg TMR_ENCODER_MODE_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level + * @arg TMR_ENCODER_MODE_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending + * on the level of the other input + * + * @param IC1Polarity: specifies the TMR IC1 polarity + * The parameter can be one of following values: + * @arg TMR_IC_POLARITY_RISING: TMR IC polarity rising + * @arg TMR_IC_POLARITY_FALLING: TMR IC polarity falling + * + * @param IC2Polarity: specifies the TMR IC2 polarity + * The parameter can be one of following values: + * @arg TMR_IC_POLARITY_RISING: TMR IC polarity rising + * @arg TMR_IC_POLARITY_FALLING: TMR IC polarity falling + * @retval None + */ +void TMR_ConfigEncodeInterface(TMR_T* tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC_POLARITY_T IC1Polarity, + TMR_IC_POLARITY_T IC2Polarity) +{ + tmr->SMCTRL_B.SMFSEL = BIT_RESET; + tmr->SMCTRL_B.SMFSEL = encodeMode; + + tmr->CCM1_CAPTURE_B.CC1SEL = BIT_RESET ; + tmr->CCM1_CAPTURE_B.CC2SEL = BIT_RESET ; + tmr->CCM1_CAPTURE_B.CC1SEL = 0x01 ; + tmr->CCM1_CAPTURE_B.CC2SEL = 0x01 ; + + tmr->CCEN_B.CC1POL = BIT_RESET; + tmr->CCEN_B.CC2POL = BIT_RESET; + tmr->CCEN |= ((IC1Polarity | (IC2Polarity << 4))); +} + +/*! + * @brief Forces the output 1 waveform to active or inactive level. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param forcesAction: specifies the forced Action to be set to the output waveform + * The parameter can be one of following values: + * @arg TMR_FORCED_ACTION_ACTIVE: Force active level on OC1REF + * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF + * @retval None + */ +void TMR_ConfigForcedOC1(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +{ + tmr->CCM1_COMPARE_B.OC1MOD = BIT_RESET; + tmr->CCM1_COMPARE_B.OC1MOD = forcesAction; +} + +/*! + * @brief Forces the output 2 waveform to active or inactive level. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param forcesAction: specifies the forced Action to be set to the output waveform + * The parameter can be one of following values: + * @arg TMR_FORCED_ACTION_ACTIVE: Force active level on OC1REF + * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF + * @retval None + */ +void TMR_ConfigForcedOC2(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +{ + tmr->CCM1_COMPARE_B.OC2MOD = BIT_RESET; + tmr->CCM1_COMPARE_B.OC2MOD = forcesAction; +} + +/*! + * @brief Forces the output 3 waveform to active or inactive level. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param forcesAction: specifies the forced Action to be set to the output waveform + * The parameter can be one of following values: + * @arg TMR_FORCED_ACTION_ACTIVE: Force active level on OC1REF + * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF + * + * @retval None + */ +void TMR_ConfigForcedOC3(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +{ + tmr->CCM2_COMPARE_B.OC3MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.OC3MOD = forcesAction; +} + +/*! + * @brief Forces the output 4 waveform to active or inactive level. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param forcesAction: specifies the forced Action to be set to the output waveform + * The parameter can be one of following values: + * @arg TMR_FORCED_ACTION_ACTIVE: Force active level on OC1REF + * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF + * + * @retval None + */ +void TMR_ConfigForcedOC4(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +{ + tmr->CCM2_COMPARE_B.OC4MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.OC4MOD = forcesAction; +} + +/*! + * @brief Enables peripheral Preload register on AUTORLD. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @retval None + */ +void TMR_EnableAutoReload(TMR_T* tmr) +{ + tmr->CTRL1_B.ARPEN = ENABLE; +} + +/*! + * @brief Disable peripheral Preload register on AUTORLD. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @retval None + */ +void TMR_DisableAutoReload(TMR_T* tmr) +{ + tmr->CTRL1_B.ARPEN = DISABLE; +} + +/*! + * @brief Enable Selects the TMR peripheral Commutation event. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @retval None + */ +void TMR_EnableSelectCOM(TMR_T* tmr) +{ + tmr->CTRL2_B.CCUSEL = ENABLE; +} +/*! + * @brief Disable Selects the TMR peripheral Commutation event. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @retval None + */ +void TMR_DisableSelectCOM(TMR_T* tmr) +{ + tmr->CTRL2_B.CCUSEL = DISABLE; +} + +/*! + * @brief Enable Capture Compare DMA source. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval None + */ +void TMR_EnableCCDMA(TMR_T* tmr) +{ + tmr->CTRL2_B.CCDSEL = ENABLE; +} + +/*! + * @brief Disable Capture Compare DMA source. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval None + */ +void TMR_DisableCCDMA(TMR_T* tmr) +{ + tmr->CTRL2_B.CCDSEL = DISABLE; +} + +/*! + * @brief Enable Capture Compare Preload Control bit. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @retval None + */ +void TMR_EnableCCPreload(TMR_T* tmr) +{ + tmr->CTRL2_B.CCPEN = ENABLE; +} + +/*! + * @brief Disable Capture Compare Preload Control bit. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @retval None + */ +void TMR_DisableCCPreload(TMR_T* tmr) +{ + tmr->CTRL2_B.CCPEN = DISABLE; +} + +/*! + * @brief Enables or disables the peripheral Preload register on CCM1. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCPreload: specifies the Output Compare Channel Preload + * The parameter can be one of following values: + * @arg TMR_OC_PRELOAD_DISABLE + * @arg TMR_OC_PRELOAD_ENABLE + * @retval None + */ +void TMR_ConfigOC1Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +{ + tmr->CCM1_COMPARE_B.OC1PEN = OCPreload; +} + +/*! + * @brief Enables or disables the peripheral Preload register on CCM2. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCPreload: specifies the Output Compare Channel Preload + * The parameter can be one of following values: + * @arg TMR_OC_PRELOAD_DISABLE + * @arg TMR_OC_PRELOAD_ENABLE + * @retval None + */ +void TMR_ConfigOC2Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +{ + tmr->CCM1_COMPARE_B.OC2PEN = OCPreload; +} + +/*! + * @brief Enables or disables the peripheral Preload register on CCM3. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCPreload: specifies the Output Compare Channel Preload + * The parameter can be one of following values: + * @arg TMR_OC_PRELOAD_DISABLE + * @arg TMR_OC_PRELOAD_ENABLE + * @retval None + */ +void TMR_ConfigOC3Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +{ + tmr->CCM2_COMPARE_B.OC3PEN = OCPreload; +} + +/*! + * @brief Enables or disables the peripheral Preload register on CCM4. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCPreload: specifies the Output Compare Channel Preload + * The parameter can be one of following values: + * @arg TMR_OC_PRELOAD_DISABLE + * @arg TMR_OC_PRELOAD_ENABLE + * @retval Nonee + */ +void TMR_ConfigOC4Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +{ + tmr->CCM2_COMPARE_B.OC4PEN = OCPreload; +} + +/*! + * @brief Configures the Output Compare 1 Fast feature. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCFast: specifies the Output Compare Channel Fast + * The parameter can be one of following values: + * @arg TMR_OC_FAST_DISABLE + * @arg TMR_OC_FAST_ENABLE + * @retval None + */ +void TMR_ConfigOC1Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +{ + tmr->CCM1_COMPARE_B.OC1FEN = OCFast; +} + +/*! + * @brief Configures the Output Compare 2 Fast feature. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCFast: specifies the Output Compare Channel Fast + * The parameter can be one of following values: + * @arg TMR_OC_FAST_DISABLE + * @arg TMR_OC_FAST_ENABLE + * @retval None + */ +void TMR_ConfigOC2Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +{ + tmr->CCM1_COMPARE_B.OC2FEN = OCFast; +} + +/*! + * @brief Configures the Output Compare 2 Fast feature. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCFast: specifies the Output Compare Channel Fast + * The parameter can be one of following values: + * @arg TMR_OC_FAST_DISABLE + * @arg TMR_OC_FAST_ENABLE + * @retval None + */ +void TMR_ConfigOC3Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +{ + tmr->CCM2_COMPARE_B.OC3FEN = OCFast; +} + +/*! + * @brief Configures the Output Compare 4 Fast feature. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCFast: specifies the Output Compare Channel Fast + * The parameter can be one of following values: + * @arg TMR_OC_FAST_DISABLE + * @arg TMR_OC_FAST_ENABLE + * @retval None + */ +void TMR_ConfigOC4Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +{ + tmr->CCM2_COMPARE_B.OC4FEN = OCFast; +} + +/*! + * @brief Clears or safeguards the OCREF1 signal on an external event + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCClear: specifies the Output Compare Channel1 Clear + * The parameter can be one of following values: + * @arg TMR_OC_CLEAR_DISABLE + * @arg TMR_OC_CLEAR_ENABLE + * @retval None + */ +void TMR_ClearOC1Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +{ + tmr->CCM1_COMPARE_B.OC1CEN = OCClear; +} + +/*! + * @brief Clears or safeguards the OCREF2 signal on an external event + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCClear: specifies the Output Compare Channel1 Clear + * The parameter can be one of following values: + * @arg TMR_OC_CLEAR_DISABLE + * @arg TMR_OC_CLEAR_ENABLE + * @retval None + */ +void TMR_ClearOC2Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +{ + tmr->CCM1_COMPARE_B.OC2CEN = OCClear; +} + +/*! + * @brief Clears or safeguards the OCREF3 signal on an external event + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCClear: specifies the Output Compare Channel1 Clear + * The parameter can be one of following values: + * @arg TMR_OC_CLEAR_DISABLE + * @arg TMR_OC_CLEAR_ENABLE + * @retval None + */ +void TMR_ClearOC3Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +{ + tmr->CCM2_COMPARE_B.OC3CEN = OCClear; +} + +/*! + * @brief Clears or safeguards the OCREF4 signal on an external event + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param OCClear: specifies the Output Compare Channel1 Clear + * The parameter can be one of following values: + * @arg TMR_OC_CLEAR_DISABLE + * @arg TMR_OC_CLEAR_ENABLE + * @retval None + */ +void TMR_ClearOC4Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +{ + tmr->CCM2_COMPARE_B.OC4CEN = OCClear; +} + +/*! + * @brief Configures the channel 1 polarity. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param polarity: specifies the OC1 Polarity + * The parameter can be one of following values: + * @arg TMR_OC_POLARITY_HIGH: Output Compare active high + * @arg TMR_OC_POLARITY_LOW: Output Compare active low + * @retval Nonee + */ +void TMR_ConfigOC1Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +{ + tmr->CCEN_B.CC1POL = polarity; +} + +/*! + * @brief Configures the channel 1 nPolarity. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @param nPolarity: specifies the OC1 nPolarity + * The parameter can be one of following values: + * @arg TMR_OC_NPOLARITY_HIGH: Output Compare active high + * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low + * @retval None + */ +void TMR_ConfigOC1NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +{ + tmr->CCEN_B.CC1NPOL = nPolarity; +} + +/*! + * @brief Configures the channel 2 polarity. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param polarity: specifies the OC2 Polarity + * The parameter can be one of following values: + * @arg TMR_OC_POLARITY_HIGH: Output Compare active high + * @arg TMR_OC_POLARITY_LOW: Output Compare active low + * @retval None + */ +void TMR_ConfigOC2Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +{ + tmr->CCEN_B.CC2POL = polarity; +} + +/*! + * @brief Configures the channel 2 nPolarity. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @param nPolarity: specifies the OC2 nPolarity + * The parameter can be one of following values: + * @arg TMR_OC_NPOLARITY_HIGH: Output Compare active high + * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low + * @retval None + */ +void TMR_ConfigOC2NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +{ + tmr->CCEN_B.CC2NPOL = nPolarity; +} + +/*! + * @brief Configures the channel 3 polarity. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param polarity: specifies the OC3 Polarity + * The parameter can be one of following values: + * @arg TMR_OC_POLARITY_HIGH: Output Compare active high + * @arg TMR_OC_POLARITY_LOW: Output Compare active low + * @retval None + */ +void TMR_ConfigOC3Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +{ + tmr->CCEN_B.CC3POL = polarity; +} + +/*! + * @brief Configures the channel 3 nPolarity. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @param nPolarity: specifies the OC3 nPolarity + * The parameter can be one of following values: + * @arg TMR_OC_NPOLARITY_HIGH: Output Compare active high + * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low + * @retval None + */ +void TMR_ConfigOC3NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +{ + tmr->CCEN_B.CC3NPOL = nPolarity; +} + +/*! + * @brief Configures the channel 4 polarity. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param polarity: specifies the OC4 Polarity + * The parameter can be one of following values: + * @arg TMR_OC_POLARITY_HIGH: Output Compare active high + * @arg TMR_OC_POLARITY_LOW: Output Compare active low + * @retval None + */ +void TMR_ConfigOC4Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +{ + tmr->CCEN_B.CC4POL = polarity; +} + +/*! + * @brief Enables the Capture Compare Channel x. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param channel: specifies the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * @arg TMR_CHANNEL_4: Timer Channel 4 + * @retval None + */ +void TMR_EnableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +{ + tmr->CCEN |= BIT_SET << channel; +} + +/*! + * @brief Disables the Capture Compare Channel x. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param channel: specifies the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * @arg TMR_CHANNEL_4: Timer Channel 4 + * @retval None + */ +void TMR_DisableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +{ + tmr->CCEN &= ~(BIT_SET << channel); +} + +/*! + * @brief Enables the Capture Compare Channelx N. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @param channel: specifies the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * @retval None + */ +void TMR_EnableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +{ + tmr->CCEN |= 0x04 << (channel); +} + +/*! + * @brief Disables the Capture Compare Channelx N. + * + * @param tmr: The TMRx it can be TMR1 and TMR8 + * + * @param channel: specifies the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * @retval None + */ +void TMR_DisableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +{ + tmr->CCEN &= ~(0x04 << (channel)); +} + +/*! + * @brief Selects the Output Compare Mode. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param channel: specifies the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * @arg TMR_CHANNEL_4: Timer Channel 4 + * + * @param mode: specifies the Output Compare Mode + * The parameter can be one of following values: + * @arg TMR_OC_MODE_TMRING + * @arg TMR_OC_MODE_ACTIVE + * @arg TMR_OC_MODE_INACTIVE + * @arg TMR_OC_MODE_TOGGEL + * @arg TMR_OC_MODE_LOWLEVEL + * @arg TMR_OC_MODE_HIGHLEVEL + * @arg TMR_OC_MODE_PWM1 + * @arg TMR_OC_MODE_PWM2 + * @retval None + */ +void TMR_SelectOCxMode(TMR_T* tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T mode) +{ + tmr->CCEN &= BIT_RESET << channel; + + if (channel == TMR_CHANNEL_1) + { + tmr->CCM1_COMPARE_B.OC1MOD = mode; + } + else if (channel == TMR_CHANNEL_2) + { + tmr->CCM1_COMPARE_B.OC2MOD = mode; + } + else if (channel == TMR_CHANNEL_3) + { + tmr->CCM2_COMPARE_B.OC3MOD = mode; + } + else if (channel == TMR_CHANNEL_4) + { + tmr->CCM2_COMPARE_B.OC4MOD = mode; + } +} + +/*! + * @brief Enable the TMRx update event + * + * @param tmr: The TMRx can be 1 to 8 + * + * @retval None + */ +void TMR_EnableUpdate(TMR_T* tmr) +{ + tmr->CTRL1_B.UD = DISABLE; +} + +/*! + * @brief Disable the TMRx update event + * + * @param tmr: The TMRx can be 1 to 8 + * + * @retval None + */ +void TMR_DisableUpdate(TMR_T* tmr) +{ + tmr->CTRL1_B.UD = ENABLE; +} + +/*! + * @brief Configures the Update Request Interrupt source + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param updateSource: Config the Update source + * The parameter can be one of following values: + * @arg TMR_UPDATE_SOURCE_GLOBAL + * @arg TMR_UPDATE_SOURCE_REGULAR + * @retval None + */ +void TMR_ConfigUPdateRequest(TMR_T* tmr, TMR_UPDATE_SOURCE_T updateSource) +{ + if (updateSource != TMR_UPDATE_SOURCE_GLOBAL) + { + tmr->CTRL1_B.URSSEL = BIT_SET; + } + else + { + tmr->CTRL1_B.URSSEL = BIT_RESET; + } +} + +/*! + * @brief Enables Hall sensor interface. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval None + */ +void TMR_EnableHallSensor(TMR_T* tmr) +{ + tmr->CTRL2_B.TI1SEL = ENABLE; +} + +/*! + * @brief Disable Hall sensor interface. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval None + */ +void TMR_DisableHallSensor(TMR_T* tmr) +{ + tmr->CTRL2_B.TI1SEL = DISABLE; +} + +/*! + * @brief Config the Sing pulse Mode. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param singlePulseMode: specifies the Single Pulse Mode + * The parameter can be one of following values: + * @arg TMR_SPM_REPETITIVE + * @arg TMR_SPM_SINGLE + * @retval None + */ +void TMR_ConfigSinglePulseMode(TMR_T* tmr, TMR_SPM_T singlePulseMode) +{ + tmr->CTRL1_B.SPMEN = singlePulseMode; +} + +/*! + * @brief Selects the Trigger Output Mode. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param TRGOSource: specifies the Trigger Output source + * The parameter can be one of following values: + * @arg TMR_TRGO_SOURCE_RESET + * @arg TMR_TRGO_SOURCE_ENABLE + * @arg TMR_TRGO_SOURCE_UPDATE + * The under is not for TMR6 and TMR7 + * @arg TMR_TRGO_SOURCE_OC1 + * @arg TMR_TRGO_SOURCE_OC1REF + * @arg TMR_TRGO_SOURCE_OC2REF + * @arg TMR_TRGO_SOURCE_OC3REF + * @arg TMR_TRGO_SOURCE_OC4REF + * @retval None + */ +void TMR_SelectOutputTrigger(TMR_T* tmr, TMR_TRGO_SOURCE_T TRGOSource) +{ + tmr->CTRL2_B.MMSEL = TRGOSource; +} + +/*! + * @brief Selects the Slave Mode. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param slaveMode: specifies the Timer Slave Mode. + * The parameter can be one of following values: + * @arg TMR_SLAVE_MODE_RESET + * @arg TMR_SLAVE_MODE_GATED + * @arg TMR_SLAVE_MODE_TRIGGER + * @arg TMR_SLAVE_MODE_EXTERNAL1 + * @retval None + */ +void TMR_SelectSlaveMode(TMR_T* tmr, TMR_SLAVE_MODE_T slaveMode) +{ + tmr->SMCTRL_B.SMFSEL = slaveMode; +} + +/*! + * @brief Enable the Master Slave Mode + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval None + */ +void TMR_EnableMasterSlaveMode(TMR_T* tmr) +{ + tmr->SMCTRL_B.MSMEN = ENABLE; +} + +/*! + * @brief Disable the Master Slave Mode + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval None + */ +void TMR_DisableMasterSlaveMode(TMR_T* tmr) +{ + tmr->SMCTRL_B.MSMEN = DISABLE; +} + +/*! + * @brief Configs the Counter Register value + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param counter: Counter register new value + * + * @retval None + */ +void TMR_ConfigCounter(TMR_T* tmr, uint16_t counter) +{ + tmr->CNT = counter; +} + +/*! + * @brief Configs the AutoReload Register value + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param autoReload: autoReload register new value + * + * @retval None + */ +void TMR_ConfigAutoreload(TMR_T* tmr, uint16_t autoReload) +{ + tmr->AUTORLD = autoReload; +} + +/*! + * @brief Configs the Capture Compare1 Register value + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param compare1: specifies the Capture Compare1 value. + * + * @retval None + */ +void TMR_ConfigCompare1(TMR_T* tmr, uint16_t compare1) +{ + tmr->CC1 = compare1; +} + +/*! + * @brief Configs the Capture Compare2 Register value + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param compare2: specifies the Capture Compare1 value. + * + * @retval None + */ +void TMR_ConfigCompare2(TMR_T* tmr, uint16_t compare2) +{ + tmr->CC2 = compare2; +} + +/*! + * @brief Configs the Capture Compare3 Register value + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param compare3: specifies the Capture Compare1 value. + * + * @retval None + */ +void TMR_ConfigCompare3(TMR_T* tmr, uint16_t compare3) +{ + tmr->CC3 = compare3; +} + +/*! + * @brief Configs the Capture Compare4 Register value + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param compare4: specifies the Capture Compare1 value. + * + * @retval None + */ +void TMR_ConfigCompare4(TMR_T* tmr, uint16_t compare4) +{ + tmr->CC4 = compare4; +} + +/*! + * @brief Configs the TMRx Input Capture 1 prescaler. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param prescaler: specifies the Input Capture Channel1 Perscaler + * The parameter can be one of following values: + * @arg TMR_IC_PSC_1: no prescaler + * @arg TMR_IC_PSC_2: capture is done once every 2 events + * @arg TMR_IC_PSC_4: capture is done once every 4 events + * @arg TMR_IC_PSC_8: capture is done once every 8 events + * @retval None + */ +void TMR_ConfigIC1Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +{ + tmr->CCM1_CAPTURE_B.IC1PSC = BIT_RESET; + tmr->CCM1_CAPTURE_B.IC1PSC = prescaler; +} +/*! + * @brief Sets the TMRx Input Capture 2 prescaler. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param prescaler: specifies the Input Capture Channel2 Perscaler + * The parameter can be one of following values: + * @arg TMR_IC_PSC_1: no prescaler + * @arg TMR_IC_PSC_2: capture is done once every 2 events + * @arg TMR_IC_PSC_4: capture is done once every 4 events + * @arg TMR_IC_PSC_8: capture is done once every 8 events + * @retval None + */ +void TMR_ConfigIC2Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +{ + tmr->CCM1_CAPTURE_B.IC2PSC = BIT_RESET; + tmr->CCM1_CAPTURE_B.IC2PSC = prescaler; +} + +/*! + * @brief Configs the TMRx Input Capture 3 prescaler. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param prescaler: specifies the Input Capture Channel3 Perscaler + * The parameter can be one of following values: + * @arg TMR_IC_PSC_1: no prescaler + * @arg TMR_IC_PSC_2: capture is done once every 2 events + * @arg TMR_IC_PSC_4: capture is done once every 4 events + * @arg TMR_IC_PSC_8: capture is done once every 8 events + * @retval None + */ +void TMR_ConfigIC3Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +{ + tmr->CCM2_CAPTURE_B.IC3PSC = BIT_RESET; + tmr->CCM2_CAPTURE_B.IC3PSC = prescaler; +} + +/*! + * @brief Configs the TMRx Input Capture 4 prescaler. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param prescaler: specifies the Input Capture Channel4 Perscaler + * The parameter can be one of following values: + * @arg TMR_IC_PSC_1: no prescaler + * @arg TMR_IC_PSC_2: capture is done once every 2 events + * @arg TMR_IC_PSC_4: capture is done once every 4 events + * @arg TMR_IC_PSC_8: capture is done once every 8 events + * @retval None + */ +void TMR_ConfigIC4Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +{ + tmr->CCM2_CAPTURE_B.IC4PSC = BIT_RESET; + tmr->CCM2_CAPTURE_B.IC4PSC = prescaler; +} + +/*! + * @brief Configs the Clock Division value + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param clockDivision: specifies the clock division value. + * The parameter can be one of following values: + * @arg TMR_CLOCK_DIV_1: TDTS = Tck_tim + * @arg TMR_CLOCK_DIV_2: TDTS = 2*Tck_tim + * @arg TMR_CLOCK_DIV_4: TDTS = 4*Tck_tim + * @retval None + */ +void TMR_ConfigClockDivision(TMR_T* tmr, TMR_CLOCK_DIV_T clockDivision) +{ + tmr->CTRL1_B.CLKDIV = clockDivision; +} + +/*! + * @brief Read Input Capture 1 value. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval Capture Compare 1 Register value. + */ +uint16_t TMR_ReadCaputer1(TMR_T* tmr) +{ + return tmr->CC1; +} + +/*! + * @brief Read Input Capture 2 value. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval Capture Compare 2 Register value. + */ +uint16_t TMR_ReadCaputer2(TMR_T* tmr) +{ + return tmr->CC2; +} + +/*! + * @brief Read Input Capture 3 value. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval Capture Compare 3 Register value. + */ +uint16_t TMR_ReadCaputer3(TMR_T* tmr) +{ + return tmr->CC3; +} + +/*! + * @brief Read Input Capture 4 value. + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @retval Capture Compare 4 Register value. + */ +uint16_t TMR_ReadCaputer4(TMR_T* tmr) +{ + return tmr->CC4; +} + +/*! + * @brief Read the TMRx Counter value. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @retval Counter Register value. + */ +uint16_t TMR_ReadCounter(TMR_T* tmr) +{ + return tmr->CNT; +} + +/*! + * @brief Read the TMRx Prescaler value. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @retval Prescaler Register value. + */ +uint16_t TMR_ReadPrescaler(TMR_T* tmr) +{ + return tmr->PSC; +} + +/*! + * @brief Enable intterupts + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param interrupt: specifies the TMR interrupts sources + * The parameter can be any combination of following values: + * @arg TMR_INT_UPDATE: Timer update Interrupt source + * @arg TMR_INT_CC1: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC2: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC3: Timer Capture Compare 3 Interrupt source + * @arg TMR_INT_CC4: Timer Capture Compare 4 Interrupt source + * @arg TMR_INT_COM: Timer Commutation Interrupt source (Only for TMR1 and TMR8) + * @arg TMR_INT_TRG: Timer Trigger Interrupt source + * @arg TMR_INT_BRK: Timer Break Interrupt source (Only for TMR1 and TMR8) + * @retval None + * + * @note TMR6 and TMR7 can only generate an TMR_INT_UPDATE. + */ +void TMR_EnableInterrupt(TMR_T* tmr, uint16_t interrupt) +{ + tmr->DIEN |= interrupt; +} + +/*! + * @brief Disable intterupts + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param interrupt: specifies the TMR interrupts sources + * The parameter can be any combination of following values: + * @arg TMR_INT_UPDATE: Timer update Interrupt source + * @arg TMR_INT_CC1: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC2: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC3: Timer Capture Compare 3 Interrupt source + * @arg TMR_INT_CC4: Timer Capture Compare 4 Interrupt source + * @arg TMR_INT_COM: Timer Commutation Interrupt source (Only for TMR1 and TMR8) + * @arg TMR_INT_TRG: Timer Trigger Interrupt source + * @arg TMR_INT_BRK: Timer Break Interrupt source (Only for TMR1 and TMR8) + * @retval None + * + * @note TMR6 and TMR7 can only generate an TMR_INT_UPDATE. + */ +void TMR_DisableInterrupt(TMR_T* tmr, uint16_t interrupt) +{ + tmr->DIEN &= ~interrupt; +} + +/*! + * @brief Configures the TMRx event to be generate by software. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param eventSources: specifies the TMR event sources + * The parameter can be any combination of following values: + * @arg TMR_EVENT_UPDATE: Timer update Interrupt source + * @arg TMR_EVENT_CC1: Timer Capture Compare 1 Event source + * @arg TMR_EVENT_CC2: Timer Capture Compare 1 Event source + * @arg TMR_EVENT_CC3: Timer Capture Compare 3 Event source + * @arg TMR_EVENT_CC4: Timer Capture Compare 4 Event source + * @arg TMR_EVENT_COM: Timer Commutation Event source (Only for TMR1 and TMR8) + * @arg TMR_EVENT_TRG: Timer Trigger Event source + * @arg TMR_EVENT_BRK: Timer Break Event source (Only for TMR1 and TMR8) + * @retval None + * + * @note TMR6 and TMR7 can only generate an TMR_EVENT_UPDATE. + */ +void TMR_GenerateEvent(TMR_T* tmr, uint16_t eventSources) +{ + tmr->CEG = eventSources; +} + +/*! + * @brief Check whether the flag is set or reset + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param interrupt: specifies the TMR interrupts sources + * The parameter can be any combination of following values: + * @arg TMR_FLAG_UPDATE: Timer update Flag + * @arg TMR_FLAG_CC1: Timer Capture Compare 1 Flag + * @arg TMR_FLAG_CC2: Timer Capture Compare 2 Flag + * @arg TMR_FLAG_CC3: Timer Capture Compare 3 Flag + * @arg TMR_FLAG_CC4: Timer Capture Compare 4 Flag + * @arg TMR_FLAG_COM: Timer Commutation Flag (Only for TMR1 and TMR8) + * @arg TMR_FLAG_TRG: Timer Trigger Flag + * @arg TMR_FLAG_BRK: Timer Break Flag (Only for TMR1 and TMR8) + * @arg TMR_FLAG_CC1RC: Timer Capture Compare 1 Repetition Flag + * @arg TMR_FLAG_CC2RC: Timer Capture Compare 2 Repetition Flag + * @arg TMR_FLAG_CC3RC: Timer Capture Compare 3 Repetition Flag + * @arg TMR_FLAG_CC4RC: Timer Capture Compare 4 Repetition Flag + * @retval None + * + * @note TMR6 and TMR7 can only generate an TMR_FLAG_UPDATE. + */ +uint16_t TMR_ReadStatusFlag(TMR_T* tmr, TMR_FLAG_T flag) +{ + if ((tmr->STS & flag) != RESET) + { + return SET; + } + else + { + return RESET; + } +} + +/*! + * @brief Clears the TMR's pending flags. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param interrupt: specifies the TMR interrupts sources + * The parameter can be any combination of following values: + * @arg TMR_FLAG_UPDATE: Timer update Flag + * @arg TMR_FLAG_CC1: Timer Capture Compare 1 Flag + * @arg TMR_FLAG_CC2: Timer Capture Compare 2 Flag + * @arg TMR_FLAG_CC3: Timer Capture Compare 3 Flag + * @arg TMR_FLAG_CC4: Timer Capture Compare 4 Flag + * @arg TMR_FLAG_COM: Timer Commutation Flag (Only for TMR1 and TMR8) + * @arg TMR_FLAG_TRG: Timer Trigger Flag + * @arg TMR_FLAG_BRK: Timer Break Flag (Only for TMR1 and TMR8) + * @arg TMR_FLAG_CC1RC: Timer Capture Compare 1 Repetition Flag + * @arg TMR_FLAG_CC2RC: Timer Capture Compare 2 Repetition Flag + * @arg TMR_FLAG_CC3RC: Timer Capture Compare 3 Repetition Flag + * @arg TMR_FLAG_CC4RC: Timer Capture Compare 4 Repetition Flag + * @retval None + * + * @note TMR6 and TMR7 can only generate an TMR_FLAG_UPDATE. + */ +void TMR_ClearStatusFlag(TMR_T* tmr, uint16_t flag) +{ + tmr->STS = ~flag; +} + +/*! + * @brief Check whether the ITflag is set or reset + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param interrupt: specifies the TMR interrupts sources + * The parameter can be one of following values: + * @arg TMR_INT_UPDATE: Timer update Interrupt source + * @arg TMR_INT_CC1: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC2: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC3: Timer Capture Compare 3 Interrupt source + * @arg TMR_INT_CC4: Timer Capture Compare 4 Interrupt source + * @arg TMR_INT_COM: Timer Commutation Interrupt source (Only for TMR1 and TMR8) + * @arg TMR_INT_TRG: Timer Trigger Interrupt source + * @arg TMR_INT_BRK: Timer Break Interrupt source (Only for TMR1 and TMR8) + * @retval None + * + * @note TMR6 and TMR7 can only generate an TMR_INT_UPDATE. + */ +uint16_t TMR_ReadIntFlag(TMR_T* tmr, TMR_INT_T flag) +{ + if (((tmr->STS & flag) != RESET ) && ((tmr->DIEN & flag) != RESET)) + { + return SET; + } + else + { + return RESET; + } +} + +/*! + * @brief Clears the TMR's interrupt pending bits. + * + * @param tmr: The TMRx can be 1 to 8 + * + * @param interrupt: specifies the TMR interrupts sources + * The parameter can be any combination following values: + * @arg TMR_INT_UPDATE: Timer update Interrupt source + * @arg TMR_INT_CC1: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC2: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC3: Timer Capture Compare 3 Interrupt source + * @arg TMR_INT_CC4: Timer Capture Compare 4 Interrupt source + * @arg TMR_INT_COM: Timer Commutation Interrupt source (Only for TMR1 and TMR8) + * @arg TMR_INT_TRG: Timer Trigger Interrupt source + * @arg TMR_INT_BRK: Timer Break Interrupt source (Only for TMR1 and TMR8) + * @retval None + * + * @note TMR6 and TMR7 can only generate an TMR_INT_UPDATE. + */ +void TMR_ClearIntFlag(TMR_T* tmr, uint16_t flag) +{ + tmr->STS = ~flag; +} + +/*! + * @brief Configure the TI1 as Input + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param ICpolarity: pointer to a TMR_IC_POLARITY_T + * + * @param ICselection: pointer to a TMR_IC_SELECTION_T + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F + * + * @retval None + */ +static void TI1Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +{ + uint16_t tmpchctrl = 0; + + tmr->CCEN_B.CC1EN = BIT_RESET; + + tmr->CCM1_CAPTURE_B.CC1SEL = BIT_RESET; + tmr->CCM1_CAPTURE_B.IC1F = BIT_RESET; + tmr->CCM1_CAPTURE_B.CC1SEL = ICselection; + tmr->CCM1_CAPTURE_B.IC1F = ICfilter; + + if ((tmr == TMR1) || (tmr == TMR8) || (tmr == TMR2) || (tmr == TMR3) || + (tmr == TMR4) || (tmr == TMR5)) + { + tmr->CCEN_B.CC1POL = BIT_RESET; + tmr->CCEN_B.CC1EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= ICpolarity; + tmr->CCEN = tmpchctrl; + } + else + { + tmr->CCEN_B.CC1POL = BIT_RESET; + tmr->CCEN_B.CC1NPOL = BIT_RESET; + tmr->CCEN_B.CC1EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= ICpolarity; + tmr->CCEN = tmpchctrl; + } +} + +/*! + * @brief Configure the TI2 as Input + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param ICpolarity: pointer to a TMR_IC_POLARITY_T + * + * @param ICselection: pointer to a TMR_IC_SELECTION_T + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F + * + * @retval None + */ +static void TI2Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +{ + uint16_t tmpchctrl = 0; + + tmr->CCEN_B.CC2EN = BIT_RESET; + + tmr->CCM1_CAPTURE_B.CC2SEL = BIT_RESET; + tmr->CCM1_CAPTURE_B.IC2F = BIT_RESET; + tmr->CCM1_CAPTURE_B.CC2SEL = ICselection; + tmr->CCM1_CAPTURE_B.IC2F = ICfilter; + + if ((tmr == TMR1) || (tmr == TMR8) || (tmr == TMR2) || (tmr == TMR3) || + (tmr == TMR4) || (tmr == TMR5)) + { + tmr->CCEN_B.CC2POL = BIT_RESET; + tmr->CCEN_B.CC2EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 4); + tmr->CCEN = tmpchctrl; + } + else + { + tmr->CCEN_B.CC2POL = BIT_RESET; + tmr->CCEN_B.CC2NPOL = BIT_RESET; + tmr->CCEN_B.CC2EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 4); + tmr->CCEN = tmpchctrl; + } +} + +/*! + * @brief Configure the TI3 as Input + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param ICpolarity: pointer to a TMR_IC_POLARITY_T + * + * @param ICselection: pointer to a TMR_IC_SELECTION_T + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F + * + * @retval None + */ +static void TI3Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +{ + uint16_t tmpchctrl = 0; + + tmr->CCEN_B.CC3EN = BIT_RESET; + + tmr->CCM2_CAPTURE_B.CC3SEL = BIT_RESET; + tmr->CCM2_CAPTURE_B.IC3F = BIT_RESET; + tmr->CCM2_CAPTURE_B.CC3SEL = ICselection; + tmr->CCM2_CAPTURE_B.IC3F = ICfilter; + + if ((tmr == TMR1) || (tmr == TMR8) || (tmr == TMR2) || (tmr == TMR3) || + (tmr == TMR4) || (tmr == TMR5)) + { + tmr->CCEN_B.CC3POL = BIT_RESET; + tmr->CCEN_B.CC3EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 8); + tmr->CCEN = tmpchctrl; + } + else + { + tmr->CCEN_B.CC3POL = BIT_RESET; + tmr->CCEN_B.CC3NPOL = BIT_RESET; + tmr->CCEN_B.CC3EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 8); + tmr->CCEN = tmpchctrl; + } +} + +/*! + * @brief Configure the TI4 as Input + * + * @param tmr: The TMRx can be 1 to 8 except 6 and 7 + * + * @param ICpolarity: pointer to a TMR_IC_POLARITY_T + * + * @param ICselection: pointer to a TMR_IC_SELECTION_T + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F + * + * @retval None + */ +static void TI4Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +{ + uint16_t tmpchctrl = 0; + + tmr->CCEN_B.CC4EN = BIT_RESET; + + tmr->CCM2_CAPTURE_B.CC4SEL = BIT_RESET; + tmr->CCM2_CAPTURE_B.IC4F = BIT_RESET; + tmr->CCM2_CAPTURE_B.CC4SEL = ICselection; + tmr->CCM2_CAPTURE_B.IC4F = ICfilter; + + tmr->CCEN_B.CC4POL = BIT_RESET; + tmr->CCEN_B.CC4EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 12); + tmr->CCEN = tmpchctrl; +} + +/**@} end of group TMR_Functions */ +/**@} end of group TMR_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_usart.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_usart.c new file mode 100644 index 0000000000..2ce8bfd922 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_usart.c @@ -0,0 +1,833 @@ +/*! + * @file apm32e10x_usart.c + * + * @brief This file provides all the USART firmware functions + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_usart.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup USART_Driver + * @brief USART driver modules + @{ +*/ + +/** @defgroup USART_Functions Functions + @{ +*/ + +/*! + * @brief Reset usart peripheral registers to their default reset values + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_Reset(USART_T* usart) +{ + if (USART1 == usart) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_USART1); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_USART1); + } + else if (USART2 == usart) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_USART2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_USART2); + } + else if (USART3 == usart) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_USART3); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_USART3); + } + else if (UART4 == usart) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_UART4); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_UART4); + } + else if (UART5 == usart) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_UART5); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_UART5); + } +} + +/*! + * @brief Config the USART peripheral according to the specified parameters in the usartConfig + * + * @param uart: Select the USART or the UART peripheral + * + * @param usartConfig: pointer to a USART_Config_T structure + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_Config(USART_T* uart, USART_Config_T* usartConfig) +{ + uint32_t temp, fCLK, intDiv, fractionalDiv; + + temp = uart->CTRL1; + temp &= 0xE9F3; + temp |= (uint32_t)usartConfig->mode | \ + (uint32_t)usartConfig->parity | \ + (uint32_t)usartConfig->wordLength; + uart->CTRL1 = temp; + + temp = uart->CTRL2; + temp &= 0xCFFF; + temp |= usartConfig->stopBits; + uart->CTRL2 = temp; + + temp = uart->CTRL3; + temp &= 0xFCFF; + temp |= (uint32_t)usartConfig->hardwareFlow; + uart->CTRL3 = temp; + + if (uart == USART1) + { + RCM_ReadPCLKFreq(NULL, &fCLK); + } + else + { + RCM_ReadPCLKFreq(&fCLK, NULL); + } + + intDiv = ((25 * fCLK) / (4 * (usartConfig->baudRate))); + temp = (intDiv / 100) << 4; + fractionalDiv = intDiv - (100 * (temp >> 4)); + temp |= ((((fractionalDiv * 16) + 50) / 100)) & ((uint8_t)0x0F); + + uart->BR = temp; +} + +/*! + * @brief Fills each USART_InitStruct member with its default value + * + * @param usartConfig: pointer to a USART_Config_T structure which will be initialized + * + * @retval None + */ +void USART_ConfigStructInit(USART_Config_T* usartConfig) +{ + usartConfig->baudRate = 9600; + usartConfig->wordLength = USART_WORD_LEN_8B; + usartConfig->stopBits = USART_STOP_BIT_1; + usartConfig->parity = USART_PARITY_NONE ; + usartConfig->mode = USART_MODE_TX_RX; + usartConfig->hardwareFlow = USART_HARDWARE_FLOW_NONE; +} + +/*! + * @brief Configuration communication clock + * + * @param usart: Select the USART or the UART peripheral + * + * @param clockConfig: Pointer to a USART_clockConfig_T structure + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigClock(USART_T* usart, USART_ClockConfig_T* clockConfig) +{ + usart->CTRL2_B.CLKEN = clockConfig->clock; + usart->CTRL2_B.CPHA = clockConfig->phase; + usart->CTRL2_B.CPOL = clockConfig->polarity; + usart->CTRL2_B.LBCPOEN = clockConfig->lastBit; +} + +/*! + * @brief Fills each clockConfig member with its default value + * + * @param clockConfig: Pointer to a USART_clockConfig_T structure + * + * @retval None + * + * @note + */ +void USART_ConfigClockStructInit(USART_ClockConfig_T* clockConfig) +{ + clockConfig->clock = USART_CLKEN_DISABLE; + clockConfig->phase = USART_CLKPHA_1EDGE; + clockConfig->polarity = USART_CLKPOL_LOW; + clockConfig->lastBit = USART_LBCP_DISABLE; +} + +/*! + * @brief Enables the specified USART peripheral + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_Enable(USART_T* usart) +{ + usart->CTRL1_B.UEN = BIT_SET; +} + +/*! + * @brief Disable the specified USART peripheral + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_Disable(USART_T* usart) +{ + usart->CTRL1_B.UEN = BIT_RESET; +} + +/*! + * @brief Enables the USART DMA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @param dmaReq: Specifies the DMA request + * This parameter can be one of the following values: + * @arg USART_DMA_TX: USART DMA receive request + * @arg USART_DMA_RX: USART DMA transmit request + * @arg USART_DMA_TX_RX: USART DMA transmit/receive request + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_EnableDMA(USART_T* usart, USART_DMA_T dmaReq) +{ + usart->CTRL3 |= dmaReq; +} + +/*! + * @brief Disable the USART DMA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @param dmaReq: Specifies the DMA request + * This parameter can be one of the following values: + * @arg USART_DMA_TX: USART DMA receive request + * @arg USART_DMA_RX: USART DMA transmit request + * @arg USART_DMA_TX_RX: USART DMA transmit/receive request + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_DisableDMA(USART_T* usart, USART_DMA_T dmaReq) +{ + usart->CTRL3 &= (uint32_t)~dmaReq; +} + +/*! + * @brief Configures the address of the USART node + * + * @param usart: Select the USART or the UART peripheral + * + * @param address: Indicates the address of the USART node + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_Address(USART_T* usart, uint8_t address) +{ + usart->CTRL2_B.ADDR = address; +} + +/*! + * @brief Selects the USART WakeUp method. + * + * @param usart: Select the USART or the UART peripheral + * + * @param wakeup: Specifies the selected USART auto baud rate method + * This parameter can be one of the following values: + * @arg USART_WAKEUP_IDLE_LINE: WakeUp by an idle line detection + * @arg USART_WAKEUP_ADDRESS_MARK: WakeUp by an address mark + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_ConfigWakeUp(USART_T* usart, USART_WAKEUP_T wakeup) +{ + usart->CTRL1_B.WUPMCFG = wakeup; +} + +/*! + * @brief Enable USART Receiver in mute mode + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_EnableMuteMode(USART_T* usart) +{ + usart->CTRL1_B.RXMUTEEN = BIT_SET; +} + +/*! + * @brief Disable USART Receiver in active mode + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_DisableMuteMode(USART_T* usart) +{ + usart->CTRL1_B.RXMUTEEN = BIT_RESET; +} + +/*! + * @brief Sets the USART LIN Break detection length + * + * @param usart: Select the USART or the UART peripheral + * + * @param length: Specifies the LIN break detection length + * This parameter can be one of the following values: + * @arg USART_LBDL_10B: 10-bit break detection + * @arg USART_LBDL_10B: 11-bit break detection + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_ConfigLINBreakDetectLength(USART_T* usart, USART_LBDL_T length) +{ + usart->CTRL2_B.LBDLCFG = length; +} + +/*! + * @brief Enables the USART LIN MODE + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_EnableLIN(USART_T* usart) +{ + usart->CTRL2_B.LINMEN = BIT_SET; +} + +/*! + * @brief Disable the USART LIN MODE + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_DisableLIN(USART_T* usart) +{ + usart->CTRL2_B.LINMEN = BIT_RESET; +} + +/*! + * @brief Transmitter Enable + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_EnableTx(USART_T* usart) +{ + usart->CTRL1_B.TXEN = BIT_SET; +} + +/*! + * @brief Transmitter Disable + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_DisableTx(USART_T* usart) +{ + usart->CTRL1_B.TXEN = BIT_RESET; +} + +/*! + * @brief Receiver enable + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_EnableRx(USART_T* usart) +{ + usart->CTRL1_B.RXEN = BIT_SET; +} + +/*! + * @brief Receiver disable + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_DisableRx(USART_T* usart) +{ + usart->CTRL1_B.RXEN = BIT_RESET; +} + +/*! + * @brief Transmits single data + * + * @param usart: Select the USART or the UART peripheral + * + * @param data: the data to transmit + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_TxData(USART_T* usart, uint16_t data) +{ + usart->DATA_B.DATA = data; +} + +/*! + * @brief Returns the most recent received data + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +uint16_t USART_RxData(USART_T* usart) +{ + return (uint16_t)(usart->DATA_B.DATA); +} + +/*! + * @brief Transmits break characters + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_TxBreak(USART_T* usart) +{ + usart->CTRL1_B.TXBF = BIT_SET; +} + +/*! + * @brief Sets the specified USART guard time + * + * @param usart: Select the USART or the UART peripheral + * + * @param guardTime: Specifies the guard time + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigGuardTime(USART_T* usart, uint8_t guardTime) +{ + usart->GTPSC_B.GRDT = guardTime; +} + +/*! + * @brief Sets the system clock divider number + * + * @param usart: Select the USART or the UART peripheral + * + * @param div: specifies the divider number + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigPrescaler(USART_T* usart, uint8_t div) +{ + usart->GTPSC_B.PSC = div; +} + +/*! + * @brief Enables the USART Smart Card mode + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The Smart Card mode is not available for UART4 and UART5 + */ +void USART_EnableSmartCard(USART_T* usart) +{ + usart->CTRL3_B.SCEN = BIT_SET; +} + +/*! + * @brief Disable the USART Smart Card mode + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The Smart Card mode is not available for UART4 and UART5 + */ +void USART_DisableSmartCard(USART_T* usart) +{ + usart->CTRL3_B.SCEN = BIT_RESET; +} + +/*! + * @brief Enables NACK transmission + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The Smart Card mode is not available for UART4 and UART5 + */ +void USART_EnableSmartCardNACK(USART_T* usart) +{ + usart->CTRL3_B.SCNACKEN = BIT_SET; +} + +/*! + * @brief Disable NACK transmission + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The Smart Card mode is not available for UART4 and UART5 + */ +void USART_DisableSmartCardNACK(USART_T* usart) +{ + usart->CTRL3_B.SCNACKEN = BIT_RESET; +} + +/*! + * @brief Enables USART Half Duplex communication + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_EnableHalfDuplex(USART_T* usart) +{ + usart->CTRL3_B.HDEN = BIT_SET; +} + +/*! + * @brief Disable USART Half Duplex communication + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_DisableHalfDuplex(USART_T* usart) +{ + usart->CTRL3_B.HDEN = BIT_RESET; +} + +/*! + * @brief Configures the USART's IrDA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @param IrDAMode: Specifies the IrDA mode + * This parameter can be one of the following values: + * @arg USART_IRDALP_NORMAL: Normal + * @arg USART_IRDALP_LOWPOWER: Low-Power + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_ConfigIrDA(USART_T* usart, USART_IRDALP_T IrDAMode) +{ + usart->CTRL3_B.IRLPEN = IrDAMode; +} + +/*! + * @brief Enables the USART's IrDA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_EnableIrDA(USART_T* usart) +{ + usart->CTRL3_B.IREN = BIT_SET; +} + +/*! + * @brief Disable the USART's IrDA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_DisableIrDA(USART_T* usart) +{ + usart->CTRL3_B.IREN = BIT_RESET; +} + +/*! + * @brief Enable the specified USART interrupts + * + * @param usart: Select the USART or the UART peripheral + * + * @param interrupt: Specifies the USART interrupts sources + * The parameter can be one of following values: + * @arg USART_INT_PE: Parity error interrupt + * @arg USART_INT_TXBE: Tansmit data buffer empty interrupt + * @arg USART_INT_TXC: Transmission complete interrupt + * @arg USART_INT_RXBNE: Receive data buffer not empty interrupt + * @arg USART_INT_IDLE: Idle line detection interrupt + * @arg USART_INT_LBD: LIN break detection interrupt + * @arg USART_INT_CTS: CTS change interrupt + * @arg USART_INT_ERR: Error interrupt(Frame error, noise error, overrun error) + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_EnableInterrupt(USART_T* usart, USART_INT_T interrupt) +{ + uint32_t temp; + + temp = (uint32_t)(interrupt & 0xffff); + + if (interrupt & 0X10000) + { + usart->CTRL1 |= temp; + } + + if (interrupt & 0X20000) + { + usart->CTRL2 |= temp; + } + + if (interrupt & 0X40000) + { + usart->CTRL3 |= temp; + } +} + +/*! + * @brief Disables the specified USART interrupts + * + * @param usart: Select the USART or the UART peripheral + * + * @param interrupt: Specifies the USART interrupts sources + * The parameter can be one of following values: + * @arg USART_INT_PE: Parity error interrupt + * @arg USART_INT_TXBE: Tansmit data buffer empty interrupt + * @arg USART_INT_TXC: Transmission complete interrupt + * @arg USART_INT_RXBNE: Receive data buffer not empty interrupt + * @arg USART_INT_IDLE: Idle line detection interrupt + * @arg USART_INT_LBD: LIN break detection interrupt + * @arg USART_INT_CTS: CTS change interrupt + * @arg USART_INT_ERR: Error interrupt(Frame error, noise error, overrun error) + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_DisableInterrupt(USART_T* usart, USART_INT_T interrupt) +{ + uint32_t temp; + + temp = (uint32_t)~(interrupt & 0xffff); + + if (interrupt & 0X10000) + { + usart->CTRL1 &= temp; + } + + if (interrupt & 0X20000) + { + usart->CTRL2 &= temp; + } + + if (interrupt & 0X40000) + { + usart->CTRL3 &= temp; + } +} + +/*! + * @brief Read the specified USART flag + * + * @param usart: Select the USART or the UART peripheral + * + * @param flag: Specifies the flag to check + * The parameter can be one of following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) + * @arg USART_FLAG_LBD: LIN Break detection flag + * @arg USART_FLAG_TXBE: Transmit data buffer empty flag + * @arg USART_FLAG_TXC: Transmission Complete flag + * @arg USART_FLAG_RXBNE: Receive data buffer not empty flag + * @arg USART_FLAG_IDLE: Idle Line detection flag + * @arg USART_FLAG_OVRE: OverRun Error flag + * @arg USART_FLAG_NE: Noise Error flag + * @arg USART_FLAG_FE: Framing Error flag + * @arg USART_FLAG_PE: Parity Error flag + * + * @retval The new state of flag (SET or RESET) + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +uint8_t USART_ReadStatusFlag(USART_T* usart, USART_FLAG_T flag) +{ + return (usart->STS & flag) ? SET : RESET; +} + +/*! + * @brief Clears the USARTx's pending flags + * + * @param usart: Select the USART or the UART peripheral + * + * @param flag: Specifies the flag to clear + * The parameter can be one of following values: + * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) + * @arg USART_FLAG_LBD: LIN Break detection flag + * @arg USART_FLAG_TXC: Transmission Complete flag + * @arg USART_FLAG_RXBNE: Receive data buffer not empty flag + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_ClearStatusFlag(USART_T* usart, USART_FLAG_T flag) +{ + usart->STS &= (uint32_t)~flag; +} + +/*! + * @brief Read the specified USART interrupt flag + * + * @param usart: Select the USART or the UART peripheral + * + * @param flag: Specifies the USART interrupt source to check + * The parameter can be one of following values: + * @arg USART_INT_TXBE: Tansmit data buffer empty interrupt + * @arg USART_INT_TXC: Transmission complete interrupt + * @arg USART_INT_RXBNE: Receive data buffer not empty interrupt + * @arg USART_INT_IDLE: Idle line detection interrupt + * @arg USART_INT_LBD: LIN break detection interrupt + * @arg USART_INT_CTS: CTS change interrupt + * @arg USART_INT_OVRE: OverRun Error interruptpt + * @arg USART_INT_NE: Noise Error interrupt + * @arg USART_INT_FE: Framing Error interrupt + * @arg USART_INT_PE: Parity error interrupt + * + * @retval The new state of flag (SET or RESET) + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +uint8_t USART_ReadIntFlag(USART_T* usart, USART_INT_T flag) +{ + uint32_t itFlag, srFlag; + + if (flag & 0x10000) + { + itFlag = usart->CTRL1 & flag & 0xffff; + } + else if (flag & 0x20000) + { + itFlag = usart->CTRL2 & flag & 0xffff; + } + else + { + itFlag = usart->CTRL3 & flag & 0xffff; + } + + srFlag = flag >> 24; + srFlag = (uint32_t)(1 << srFlag); + srFlag = usart->STS & srFlag; + + if (srFlag && itFlag) + { + return SET; + } + + return RESET; +} + +/*! + * @brief Clears the USART interrupt pending bits + * + * @param usart: Select the USART or the UART peripheral + * + * @param flag: Specifies the interrupt pending bit to clear + * The parameter can be one of following values: + * @arg USART_INT_RXBNE: Receive data buffer not empty interrupt + * @arg USART_INT_TXC: Transmission complete interrupt + * @arg USART_INT_LBD: LIN break detection interrupt + * @arg USART_INT_CTS: CTS change interrupt + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3, UART4 and UART5 + */ +void USART_ClearIntFlag(USART_T* usart, USART_INT_T flag) +{ + uint32_t srFlag; + + srFlag = flag >> 24; + srFlag = (uint32_t)(1 << srFlag); + + usart->STS &= (uint32_t)~srFlag; +} + +/**@} end of group USART_Functions */ +/**@} end of group USART_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_usb.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_usb.c new file mode 100644 index 0000000000..ff7b5f2620 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_usb.c @@ -0,0 +1,409 @@ +/*! + * @file apm32e10x_usb.c + * + * @brief This file contains all the functions for the USBD peripheral + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_usb.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup USBD_Driver + * @brief USBD driver modules + @{ +*/ + +/** @defgroup USBD_Functions Functions + @{ +*/ + +/*! + * @brief Set Endpoint type + * + * @param ep: Endpoint number + * + * @param type: Endpoint type + * + * @retval None + */ +void USBD_SetEPType(USBD_EP_T ep, USBD_EP_TYPE_T type) +{ + __IOM uint32_t reg; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT); + reg &= ~USBD_EP_BIT_TYPE; + reg |= type << 9; + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Set EP kind + * + * @param ep: Endpoint number + * + * @retval None + */ +void USBD_SetEPKind(USBD_EP_T ep) +{ + __IOM uint32_t reg; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT); + reg |= USBD_EP_BIT_KIND; + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Reset EP kind + * + * @param ep: Endpoint number + * + * @retval None + */ +void USBD_ResetEPKind(USBD_EP_T ep) +{ + __IOM uint32_t reg; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT); + reg &= ~USBD_EP_BIT_KIND; + + USBD->EP[ep].EP = reg; +} + + +/*! + * @brief Reset EP CTFR bit + * + * @param ep: Endpoint number + * + * @retval None + */ +void USBD_ResetEPRxFlag(USBD_EP_T ep) +{ + __IOM uint32_t reg; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT); + reg &= ~USBD_EP_BIT_CTFR; + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Reset EP CTFT bit + * + * @param ep: Endpoint number + * + * @retval None + */ +void USBD_ResetEPTxFlag(USBD_EP_T ep) +{ + __IOM uint32_t reg; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT); + reg &= ~USBD_EP_BIT_CTFT; + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Toggle Tx DTOG + * + * @param ep: Endpoint number + * + * @retval None + */ +void USBD_ToggleTx(USBD_EP_T ep) +{ + __IOM uint32_t reg; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT); + reg |= USBD_EP_BIT_TXDTOG; + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Toggle Rx DTOG + * + * @param ep: Endpoint number + * + * @retval None + */ +void USBD_ToggleRx(USBD_EP_T ep) +{ + __IOM uint32_t reg; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT); + reg |= USBD_EP_BIT_RXDTOG; + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Reset Toggle Tx DTOG + * + * @param ep: Endpoint number + * + * @retval None + */ +void USBD_ResetTxToggle(USBD_EP_T ep) +{ + if(USBD->EP[ep].EP_B.TXDTOG) + { + USBD_ToggleTx(ep); + } +} + +/*! + * @brief Reset Toggle Rx DTOG + * + * @param ep: Endpoint number + * + * @retval None + */ +void USBD_ResetRxToggle(USBD_EP_T ep) +{ + if(USBD->EP[ep].EP_B.RXDTOG) + { + USBD_ToggleRx(ep); + } +} + +/*! + * @brief Set EP address + * + * @param ep: Endpoint number + * + * @param addr: Address + * + * @retval None + */ +void USBD_SetEpAddr(USBD_EP_T ep, uint8_t addr) +{ + __IOM uint32_t reg; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT); + reg &= ~USBD_EP_BIT_ADDR; + reg |= addr; + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Set EP Tx status + * + * @param ep: Endpoint number + * + * @param status: status + * + * @retval None + */ +void USBD_SetEPTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status) +{ + __IOM uint32_t reg; + + uint32_t tmp; + tmp = status <<= 4; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT | USBD_EP_BIT_TXSTS); + reg ^= (tmp & USBD_EP_BIT_TXSTS); + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Set EP Rx status + * + * @param ep: Endpoint number + * + * @param status: status + * + * @retval None + */ +void USBD_SetEPRxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status) +{ + __IOM uint32_t reg; + uint32_t tmp; + + tmp = status << 12; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT | USBD_EP_BIT_RXSTS); + reg ^= (tmp & USBD_EP_BIT_RXSTS); + + USBD->EP[ep].EP = reg; +} + + +/*! + * @brief Set EP Rx and Txstatus + * + * @param ep: Endpoint number + * + * @param status: status + * + * @retval None + */ +void USBD_SetEPRxTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T txStatus, USBD_EP_STATUS_T rxStatus) +{ + __IOM uint32_t reg; + uint32_t tmp; + + reg = USBD->EP[ep].EP; + + reg &= (uint32_t)(USBD_EP_MASK_DEFAULT | USBD_EP_BIT_RXSTS | USBD_EP_BIT_TXSTS); + + tmp = rxStatus << 12; + reg ^= (tmp & USBD_EP_BIT_RXSTS); + + tmp = txStatus << 4; + reg ^= (tmp & USBD_EP_BIT_TXSTS); + + USBD->EP[ep].EP = reg; +} + +/*! + * @brief Set EP Rx Count + * + * @param ep: Endpoint number + * + * @param cnt: Rx count + * + * @retval None + */ +void USBD_SetEPRxCnt(USBD_EP_T ep, uint32_t cnt) +{ + __IOM uint32_t *p; + __IOM uint32_t block = 0; + + p = USBD_ReadEPRxCntPointer(ep); + + if(cnt > 62) + { + block = cnt >> 5; + + if(!(cnt & 0x1f)) + { + block -= 1; + } + + *p = (block << 10) | 0x8000; + } + else + { + block = cnt >> 1; + + if(cnt & 0x01) + { + block += 1; + } + + *p = (block << 10); + } +} + +/*! + * @brief Write a buffer of data to a selected endpoint + * + * @param ep: Endpoint number + * + * @retval wBuf: The pointer to the buffer of data to be written to the endpoint + * + * @param wLen: Number of data to be written (in bytes) + * + * @retval None + */ +void USBD_WriteDataToEP(USBD_EP_T ep, uint8_t *wBuf, uint32_t wLen) +{ + uint32_t i; + uint32_t *addrEP; + uint32_t tmp; + + wLen = (wLen + 1) >> 1; + + addrEP = (uint32_t *)((uint32_t)USBD_ReadEPTxAddr(ep)); + addrEP = (uint32_t *)(((uint32_t)addrEP << 1) + USBD_PMA_ADDR); + + for(i = 0; i < wLen; i++) + { + tmp = *wBuf++; + tmp = ((*wBuf++) << 8) | tmp; + + *addrEP++ = tmp; + } +} + +/*! + * @brief Read a buffer of data to a selected endpoint + * + * @param ep: Endpoint number + * + * @retval wBuf: The pointer to the buffer of data to be read to the endpoint + * + * @param wLen: Number of data to be read (in bytes) + * + * @retval None + */ +void USBD_ReadDataFromEP(USBD_EP_T ep, uint8_t *rBuf, uint32_t rLen) +{ + uint32_t i; + uint32_t *addrEP; + uint32_t tmp; + + rLen = (rLen + 1) >> 1; + + addrEP = (uint32_t *)((uint32_t)USBD_ReadEPRxAddr(ep)); + addrEP = (uint32_t *)(((uint32_t)addrEP << 1) + USBD_PMA_ADDR); + + for(i = 0; i < rLen; i++) + { + tmp = *addrEP++; + *rBuf++ = tmp & 0XFF; + *rBuf++ = (tmp >> 8) & 0xff; + } +} + +/**@} end of group USBD_Functions */ +/**@} end of group USBD_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_wwdt.c b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_wwdt.c new file mode 100644 index 0000000000..24f0e7abb5 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/APM32E10x_StdPeriphDriver/src/apm32e10x_wwdt.c @@ -0,0 +1,160 @@ +/*! + * @file apm32e10x_wwdt.c + * + * @brief This file contains all the functions for the WWDT peripheral + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x_wwdt.h" +#include "apm32e10x_rcm.h" + +/** @addtogroup APM32E10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup WWDT_Driver + * @brief WWDT driver modules + @{ +*/ + +/** @defgroup WWDT_Functions Functions + @{ +*/ + +/*! + * @brief Reset the WWDT peripheral registers + * + * @param None + * + * @retval None + */ +void WWDT_Reset(void) +{ + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_WWDT); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_WWDT); +} + +/*! + * @brief Config the WWDT Timebase + * + * @param timebase: WWDT Prescaler + * The parameter can be one of following values: + * @arg WWDT_TIME_BASE_1: WWDT counter clock = (PCLK1/4096)/1 + * @arg WWDT_TIME_BASE_2: WWDT counter clock = (PCLK1/4096)/2 + * @arg WWDT_TIME_BASE_4: WWDT counter clock = (PCLK1/4096)/4 + * @arg WWDT_TIME_BASE_8: WWDT counter clock = (PCLK1/4096)/8 + * + * @retval None + */ +void WWDT_ConfigTimebase(WWDT_TIME_BASE_T timeBase) +{ + __IO uint32_t reg; + + reg = WWDT->CFG & 0xFFFFFE7F; + reg |= timeBase; + WWDT->CFG = reg; +} + +/*! + * @brief Config the WWDT Window data + * + * @param windowdata: window data which compare with the downcounter + * + * @retval None + * + * @note The windowdata must be lower than 0x80 + */ +void WWDT_ConfigWindowData(uint8_t windowData) +{ + __IO uint32_t reg; + + reg = WWDT->CFG & 0xFFFFFF80; + reg |= windowData & 0x7F; + WWDT->CFG = reg; +} + +/*! + * @brief Config the WWDT counter value + * + * @param counter: Specifies the watchdog counter value + * + * @retval None + * + * @note The counter between 0x40 and 0x7F + */ +void WWDT_ConfigCounter(uint8_t counter) +{ + WWDT->CTRL = counter & 0x7F; +} + +/*! + * @brief Enable the WWDT Early Wakeup interrupt + * + * @param None + * + * @retval None + */ +void WWDT_EnableEWI(void) +{ + WWDT->CFG_B.EWIEN = SET; +} + +/*! + * @brief Enable WWDT and set the counter value + * + * @param counter: the window watchdog counter value + * + * @retval None + * + * @note The counter between 0x40 and 0x7F + */ +void WWDT_Enable(uint8_t counter) +{ + WWDT->CTRL = counter | 0x00000080; +} + +/*! + * @brief Read the Early Wakeup interrupt flag + * + * @param None + * + * @retval the state of the Early Wakeup interrupt flagte + */ +uint8_t WWDT_ReadFlag(void) +{ + return (uint8_t) (WWDT->STS); +} + +/*! + * @brief Clear the Early Wakeup interrupt flag + * + * @param None + * + * @retval None + */ +void WWDT_ClearFlag(void) +{ + WWDT->STS_B.EWIFLG = RESET; +} + +/**@} end of group WWDT_Functions */ +/**@} end of group WWDT_Driver */ +/**@} end of group APM32E10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armcc.h b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armcc.h new file mode 100644 index 0000000000..a19425d9fe --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armcc.h @@ -0,0 +1,894 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.1.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + +/* CMSIS compiler control DSP macros */ +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __ARM_FEATURE_DSP 1 +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __memory_changed() +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/**@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/**@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armclang.h b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armclang.h new file mode 100644 index 0000000000..ef919934c5 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armclang.h @@ -0,0 +1,1444 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/**@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +#define __SADD8 __builtin_arm_sadd8 +#define __QADD8 __builtin_arm_qadd8 +#define __SHADD8 __builtin_arm_shadd8 +#define __UADD8 __builtin_arm_uadd8 +#define __UQADD8 __builtin_arm_uqadd8 +#define __UHADD8 __builtin_arm_uhadd8 +#define __SSUB8 __builtin_arm_ssub8 +#define __QSUB8 __builtin_arm_qsub8 +#define __SHSUB8 __builtin_arm_shsub8 +#define __USUB8 __builtin_arm_usub8 +#define __UQSUB8 __builtin_arm_uqsub8 +#define __UHSUB8 __builtin_arm_uhsub8 +#define __SADD16 __builtin_arm_sadd16 +#define __QADD16 __builtin_arm_qadd16 +#define __SHADD16 __builtin_arm_shadd16 +#define __UADD16 __builtin_arm_uadd16 +#define __UQADD16 __builtin_arm_uqadd16 +#define __UHADD16 __builtin_arm_uhadd16 +#define __SSUB16 __builtin_arm_ssub16 +#define __QSUB16 __builtin_arm_qsub16 +#define __SHSUB16 __builtin_arm_shsub16 +#define __USUB16 __builtin_arm_usub16 +#define __UQSUB16 __builtin_arm_uqsub16 +#define __UHSUB16 __builtin_arm_uhsub16 +#define __SASX __builtin_arm_sasx +#define __QASX __builtin_arm_qasx +#define __SHASX __builtin_arm_shasx +#define __UASX __builtin_arm_uasx +#define __UQASX __builtin_arm_uqasx +#define __UHASX __builtin_arm_uhasx +#define __SSAX __builtin_arm_ssax +#define __QSAX __builtin_arm_qsax +#define __SHSAX __builtin_arm_shsax +#define __USAX __builtin_arm_usax +#define __UQSAX __builtin_arm_uqsax +#define __UHSAX __builtin_arm_uhsax +#define __USAD8 __builtin_arm_usad8 +#define __USADA8 __builtin_arm_usada8 +#define __SSAT16 __builtin_arm_ssat16 +#define __USAT16 __builtin_arm_usat16 +#define __UXTB16 __builtin_arm_uxtb16 +#define __UXTAB16 __builtin_arm_uxtab16 +#define __SXTB16 __builtin_arm_sxtb16 +#define __SXTAB16 __builtin_arm_sxtab16 +#define __SMUAD __builtin_arm_smuad +#define __SMUADX __builtin_arm_smuadx +#define __SMLAD __builtin_arm_smlad +#define __SMLADX __builtin_arm_smladx +#define __SMLALD __builtin_arm_smlald +#define __SMLALDX __builtin_arm_smlaldx +#define __SMUSD __builtin_arm_smusd +#define __SMUSDX __builtin_arm_smusdx +#define __SMLSD __builtin_arm_smlsd +#define __SMLSDX __builtin_arm_smlsdx +#define __SMLSLD __builtin_arm_smlsld +#define __SMLSLDX __builtin_arm_smlsldx +#define __SEL __builtin_arm_sel +#define __QADD __builtin_arm_qadd +#define __QSUB __builtin_arm_qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/**@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armclang_ltm.h b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armclang_ltm.h new file mode 100644 index 0000000000..356182c5f9 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_armclang_ltm.h @@ -0,0 +1,1891 @@ +/**************************************************************************//** + * @file cmsis_armclang_ltm.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V1.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2018-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/**@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/**@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_compiler.h b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_compiler.h new file mode 100644 index 0000000000..adbf296f15 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_compiler.h @@ -0,0 +1,283 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.1.0 + * @date 09. October 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6.6 LTM (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #include "cmsis_armclang_ltm.h" + + /* + * Arm Compiler above 6.10.1 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #define __RESTRICT __restrict + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_gcc.h b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 0000000000..67bda4ef3c --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,2211 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.4.1 + * @date 27. May 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START + +/** + \brief Initializes data and bss sections + \details This default implementations initialized all data and additional bss + sections relying on .copy.table and .zero.table specified properly + in the used linker script. + + */ +__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) +{ + extern void _start(void) __NO_RETURN; + + typedef struct { + uint32_t const* src; + uint32_t* dest; + uint32_t wlen; + } __copy_table_t; + + typedef struct { + uint32_t* dest; + uint32_t wlen; + } __zero_table_t; + + extern const __copy_table_t __copy_table_start__; + extern const __copy_table_t __copy_table_end__; + extern const __zero_table_t __zero_table_start__; + extern const __zero_table_t __zero_table_end__; + + for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = pTable->src[i]; + } + } + + for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = 0u; + } + } + + _start(); +} + +#define __PROGRAM_START __cmsis_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP __StackTop +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT __StackLimit +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors"))) +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +#ifndef __STACK_SEAL +#define __STACK_SEAL __StackSeal +#endif + +#ifndef __TZ_STACK_SEAL_SIZE +#define __TZ_STACK_SEAL_SIZE 8U +#endif + +#ifndef __TZ_STACK_SEAL_VALUE +#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL +#endif + + +__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { + *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; +} +#endif + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi":::"memory") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe":::"memory") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1, ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1, ARG2) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + __ISB(); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + __ISB(); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1, ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + +#define __USAT16(ARG1, ARG2) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16_RORn(uint32_t op1, uint32_t rotate) +{ + uint32_t result; + if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { + __ASM volatile ("sxtb16 %0, %1, ROR %2" : "=r" (result) : "r" (op1), "i" (rotate) ); + } else { + result = __SXTB16(__ROR(op1, rotate)) ; + } + return result; +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16_RORn(uint32_t op1, uint32_t op2, uint32_t rotate) +{ + uint32_t result; + if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { + __ASM volatile ("sxtab16 %0, %1, %2, ROR %3" : "=r" (result) : "r" (op1) , "r" (op2) , "i" (rotate)); + } else { + result = __SXTAB16(op1, __ROR(op2, rotate)); + } + return result; +} + + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +#define __PKHBT(ARG1,ARG2,ARG3) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_iccarm.h b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_iccarm.h new file mode 100644 index 0000000000..11c4af0eba --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_iccarm.h @@ -0,0 +1,935 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.7 + * @date 19. June 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_version.h b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_version.h new file mode 100644 index 0000000000..660f612aa3 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/core_cm3.h b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/core_cm3.h new file mode 100644 index 0000000000..9b59300c77 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/Include/core_cm3.h @@ -0,0 +1,1939 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 13. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/* + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M3 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) //!< deprecated [31:16] CMSIS HAL main version +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) //!< deprecated [15:0] CMSIS HAL sub version +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) //!< deprecated CMSIS HAL version number + +#define __CORTEX_M (3U) //!< Cortex-M Core + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200U + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ + + + + +/** + * @brief CMSIS_glob_defs + * to specify the access to peripheral variables. + * for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1U]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ +#endif + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/CMSIS/LICENSE.txt b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/LICENSE.txt new file mode 100644 index 0000000000..f0cd2d9ccf --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/CMSIS/LICENSE.txt @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Include/apm32e10x.h b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Include/apm32e10x.h new file mode 100644 index 0000000000..745b364104 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Include/apm32e10x.h @@ -0,0 +1,6107 @@ +/*! + * @file apm32e10x.h + * + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * + * @details This file contains all the peripheral register's definitions, bits definitions and memory mapping + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32E10x_H +#define __APM32E10x_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup CMSIS + @{ +*/ + +/** @defgroup APM32E10x + * @brief Peripheral Access Layer + @{ +*/ + +/** @defgroup HSE_Macros + @{ +*/ + +/** + * @brief Define Value of the External oscillator in Hz + */ +#ifndef HSE_VALUE + #define HSE_VALUE ((uint32_t)8000000) +#endif + +/* Time out for HSE start up */ +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x3200) + +/* Value of the Internal oscillator in Hz */ +#define HSI_VALUE ((uint32_t)8000000) + +/**@} end of group HSE_Macros */ + +/** @defgroup APM32E10x_StdPeripheral_Library_Version + @{ +*/ + +/** + * @brief APM32E10x Standard Peripheral Library version number + */ +#define __APM32E10X_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ +#define __APM32E10X_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ +#define __APM32E10X_STDPERIPH_VERSION_SUB2 (0x02) /*!< [15:8] sub2 version */ +#define __APM32E10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __APM32E10X_STDPERIPH_VERSION ( (__APM32E10X_STDPERIPH_VERSION_MAIN << 24)\ + |(__APM32E10X_STDPERIPH_VERSION_SUB1 << 16)\ + |(__APM32E10X_STDPERIPH_VERSION_SUB2 << 8)\ + |(__APM32E10X_STDPERIPH_VERSION_RC)) + +/**@} end of group APM32E10x_StdPeripheral_Library_Version */ + +/** @defgroup Configuraion_for_CMSIS + @{ +*/ + + +/* APM32 devices does not provide an MPU */ + #define __MPU_PRESENT 0 +/* APM32 uses 4 Bits for the Priority Levels */ +#define __NVIC_PRIO_BITS 4 +/* Set to 1 if different SysTick Config is used */ +#define __Vendor_SysTickConfig 0 + +/**@} end of group Configuraion_for_CMSIS */ + +/** @defgroup Peripheral_Enumerations + @{ +*/ + +/** + * @brief APM32E10x Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum IRQn +{ +/* Cortex-M3 Processor Exceptions Numbers */ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/* APM32 specific Interrupt Numbers */ + WWDT_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EINT Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCM_IRQn = 5, /*!< RCM global Interrupt */ + EINT0_IRQn = 6, /*!< EINT Line0 Interrupt */ + EINT1_IRQn = 7, /*!< EINT Line1 Interrupt */ + EINT2_IRQn = 8, /*!< EINT Line2 Interrupt */ + EINT3_IRQn = 9, /*!< EINT Line3 Interrupt */ + EINT4_IRQn = 10, /*!< EINT Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + + /* APM32E10X High-density devices specific Interrupt Numbers */ + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USBD1_HP_CAN1_TX_IRQn = 19, /*!< USB Device 1 High Priority or CAN1 TX Interrupts */ + USBD1_LP_CAN1_RX0_IRQn = 20, /*!< USB Device 1 Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EINT9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TMR1_BRK_IRQn = 24, /*!< TMR1 Break Interrupt */ + TMR1_UP_IRQn = 25, /*!< TMR1 Update Interrupt */ + TMR1_TRG_COM_IRQn = 26, /*!< TMR1 Trigger and Commutation Interrupt */ + TMR1_CC_IRQn = 27, /*!< TMR1 Capture Compare Interrupt */ + TMR2_IRQn = 28, /*!< TMR2 global Interrupt */ + TMR3_IRQn = 29, /*!< TMR3 global Interrupt */ + TMR4_IRQn = 30, /*!< TMR4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EINT15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EINT Line Interrupt */ + USBDWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EINT Line Interrupt */ + TMR8_BRK_IRQn = 43, /*!< TMR8 Break Interrupt */ + TMR8_UP_IRQn = 44, /*!< TMR8 Update Interrupt */ + TMR8_TRG_COM_IRQn = 45, /*!< TMR8 Trigger and Commutation Interrupt */ + TMR8_CC_IRQn = 46, /*!< TMR8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + EMMC_IRQn = 48, /*!< EMMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TMR5_IRQn = 50, /*!< TMR5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TMR6_IRQn = 54, /*!< TMR6 global Interrupt */ + TMR7_IRQn = 55, /*!< TMR7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ + USBD2_HP_CAN2_TX_IRQn = 61, /*!< USB Device 2 High Priority or CAN2 TX Interrupts */ + USBD2_LP_CAN2_RX0_IRQn = 62, /*!< USB Device 2 Low Priority or CAN2 RX0 Interrupts */ + CAN2_RX1_IRQn = 63, /*!< CAN2 RX1 Interrupts */ + CAN2_SCE_IRQn = 64, /*!< CAN2 SCE Interrupts */ + +} IRQn_Type; + +/**@} end of group Peripheral_Enumerations */ + +#include "core_cm3.h" +#include "system_apm32e10x.h" +#include + +/** @defgroup Exported_Types + @{ +*/ + +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef const int32_t sc32; +typedef const int16_t sc16; +typedef const int8_t sc8; + +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef __I int32_t vsc32; +typedef __I int16_t vsc16; +typedef __I int8_t vsc8; + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef const uint32_t uc32; +typedef const uint16_t uc16; +typedef const uint8_t uc8; + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef __I uint32_t vuc32; +typedef __I uint16_t vuc16; +typedef __I uint8_t vuc8; + +#ifndef __IM + #define __IM __I +#endif +#ifndef __OM + #define __OM __O +#endif +#ifndef __IOM + #define __IOM __IO +#endif + +enum {BIT_RESET, BIT_SET}; +enum {RESET, SET}; +enum {DISABLE, ENABLE}; +enum {ERROR, SUCCESS}; + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#if defined (__CC_ARM ) +#pragma anon_unions +#endif + +/**@} end of group Exported_Types */ + +/** @defgroup Peripheral_registers_structures + @{ +*/ + +/** + * @brief Reset and clock management unit (RCM) + */ +typedef struct +{ + /* Clock control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t HSIEN : 1; + __IM uint32_t HSIRDYFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t HSITRIM : 5; + __IM uint32_t HSICAL : 8; + __IOM uint32_t HSEEN : 1; + __IM uint32_t HSERDYFLG : 1; + __IOM uint32_t HSEBCFG : 1; + __IOM uint32_t CSSEN : 1; + __IM uint32_t RESERVED2 : 4; + __IOM uint32_t PLLEN : 1; + __IM uint32_t PLLRDYFLG : 1; + __IM uint32_t RESERVED3 : 6; + } CTRL_B; + }; + + /* Clock configuration register */ + union + { + __IOM uint32_t CFG; + + struct + { + __IOM uint32_t SCLKSW : 2; + __IM uint32_t SCLKSWSTS : 2; + __IOM uint32_t AHBPSC : 4; + __IOM uint32_t APB1PSC : 3; + __IOM uint32_t APB2PSC : 3; + __IOM uint32_t ADCPSC : 2; + __IOM uint32_t PLLSRCSEL : 1; + __IOM uint32_t PLLHSEPSC : 1; + __IOM uint32_t PLLMULCFG : 4; + __IOM uint32_t USBDPSC : 2; + __IOM uint32_t MCOSEL : 3; + __IOM uint32_t FPUPSC : 1; + __IOM uint32_t SDRAMPSC : 2; + __IM uint32_t RESERVED : 2; + } CFG_B; + } ; + + /* Clock interrupt control register */ + union + { + __IOM uint32_t INT; + + struct + { + __IM uint32_t LSIRDYFLG : 1; + __IM uint32_t LSERDYFLG : 1; + __IM uint32_t HSIRDYFLG : 1; + __IM uint32_t HSERDYFLG : 1; + __IM uint32_t PLLRDYFLG : 1; + __IM uint32_t RESERVED1 : 2; + __IM uint32_t CSSIF : 1; + __IOM uint32_t LSIRDYEN : 1; + __IOM uint32_t LSERDYEN : 1; + __IOM uint32_t HSIRDYEN : 1; + __IOM uint32_t HSERDYEN : 1; + __IOM uint32_t PLLRDYEN : 1; + __IM uint32_t RESERVED2 : 3; + __OM uint32_t LSIRDYCLR : 1; + __OM uint32_t LSERDYCLR : 1; + __OM uint32_t HSIRDYCLR : 1; + __OM uint32_t HSERDYCLR : 1; + __OM uint32_t PLLRDYCLR : 1; + __IM uint32_t RESERVED3 : 2; + __OM uint32_t CSSCLR : 1; + __IM uint32_t RESERVED4 : 8; + } INT_B; + } ; + + /* APB2 peripheral reset register */ + union + { + __IOM uint32_t APB2RST; + + struct + { + __IOM uint32_t AFIORST : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t PARST : 1; + __IOM uint32_t PBRST : 1; + __IOM uint32_t PCRST : 1; + __IOM uint32_t PDRST : 1; + __IOM uint32_t PERST : 1; + __IOM uint32_t PFRST : 1; + __IOM uint32_t PGRST : 1; + __IOM uint32_t ADC1RST : 1; + __IOM uint32_t ADC2RST : 1; + __IOM uint32_t TMR1RST : 1; + __IOM uint32_t SPI1RST : 1; + __IOM uint32_t TMR8RST : 1; + __IOM uint32_t USART1RST : 1; + __IOM uint32_t ADC3RST : 1; + __IM uint32_t RESERVED2 : 16; + } APB2RST_B; + } ; + + /* APB1 peripheral reset register */ + union + { + __IOM uint32_t APB1RST; + + struct + { + __IOM uint32_t TMR2RST : 1; + __IOM uint32_t TMR3RST : 1; + __IOM uint32_t TMR4RST : 1; + __IOM uint32_t TMR5RST : 1; + __IOM uint32_t TMR6RST : 1; + __IOM uint32_t TMR7RST : 1; + __IM uint32_t RESERVED1 : 5; + __IOM uint32_t WWDTRST : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t SPI2RST : 1; + __IOM uint32_t SPI3RST : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t USART2RST : 1; + __IOM uint32_t USART3RST : 1; + __IOM uint32_t UART4RST : 1; + __IOM uint32_t UART5RST : 1; + __IOM uint32_t I2C1RST : 1; + __IOM uint32_t I2C2RST : 1; + __IOM uint32_t USBDRST : 1; + __IM uint32_t RESERVED4 : 1; + __IOM uint32_t CAN1RST : 1; + __IM uint32_t CAN2RST : 1; + __IOM uint32_t BAKPRST : 1; + __IOM uint32_t PMURST : 1; + __IOM uint32_t DACRST : 1; + __IM uint32_t RESERVED5 : 2; + } APB1RST_B; + } ; + + /* AHB clock enable register */ + union + { + __IOM uint32_t AHBCLKEN; + + struct + { + __IOM uint32_t DMA1EN : 1; + __IOM uint32_t DMA2EN : 1; + __IOM uint32_t SRAMEN : 1; + __IOM uint32_t FPUEN : 1; + __IOM uint32_t FMCEN : 1; + __IOM uint32_t RESERVED1 : 1; + __IOM uint32_t CRCEN : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t EMMCEN : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t SDIOEN : 1; + __IM uint32_t RESERVED4 : 21; + } AHBCLKEN_B; + } ; + + /* APB2 clock enable register */ + union + { + __IOM uint32_t APB2CLKEN; + + struct + { + __IOM uint32_t AFIOEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t PAEN : 1; + __IOM uint32_t PBEN : 1; + __IOM uint32_t PCEN : 1; + __IOM uint32_t PDEN : 1; + __IOM uint32_t PEEN : 1; + __IOM uint32_t PFEN : 1; + __IOM uint32_t PGEN : 1; + __IOM uint32_t ADC1EN : 1; + __IOM uint32_t ADC2EN : 1; + __IOM uint32_t TMR1EN : 1; + __IOM uint32_t SPI1EN : 1; + __IOM uint32_t TMR8EN : 1; + __IOM uint32_t USART1EN : 1; + __IOM uint32_t ADC3EN : 1; + __IM uint32_t RESERVED2 : 16; + } APB2CLKEN_B; + }; + + /* APB1 clock enable register */ + union + { + __IOM uint32_t APB1CLKEN; + + struct + { + __IOM uint32_t TMR2EN : 1; + __IOM uint32_t TMR3EN : 1; + __IOM uint32_t TMR4EN : 1; + __IOM uint32_t TMR5EN : 1; + __IOM uint32_t TMR6EN : 1; + __IOM uint32_t TMR7EN : 1; + __IM uint32_t RESERVED1 : 5; + __IOM uint32_t WWDTEN : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t SPI2EN : 1; + __IOM uint32_t SPI3EN : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t USART2EN : 1; + __IOM uint32_t USART3EN : 1; + __IOM uint32_t UART4EN : 1; + __IOM uint32_t UART5EN : 1; + __IOM uint32_t I2C1EN : 1; + __IOM uint32_t I2C2EN : 1; + __IOM uint32_t USBDEN : 1; + __IM uint32_t RESERVED4 : 1; + __IOM uint32_t CAN1EN : 1; + __IM uint32_t CAN2EN : 1; + __IOM uint32_t BAKPEN : 1; + __IOM uint32_t PMUEN : 1; + __IOM uint32_t DACEN : 1; + __IM uint32_t RESERVED5 : 2; + } APB1CLKEN_B; + } ; + + /* Backup domain control register */ + union + { + __IOM uint32_t BDCTRL; + + struct + { + __IOM uint32_t LSEEN : 1; + __IM uint32_t LSERDYFLG : 1; + __IOM uint32_t LSEBCFG : 1; + __IM uint32_t RESERVED1 : 5; + __IOM uint32_t RTCSRCSEL : 2; + __IM uint32_t RESERVED2 : 5; + __IOM uint32_t RTCCLKEN : 1; + __IOM uint32_t BDRST : 1; + __IM uint32_t RESERVED3 : 15; + } BDCTRL_B; + } ; + + /* Control/status register */ + union + { + __IOM uint32_t CSTS; + + struct + { + __IOM uint32_t LSIEN : 1; + __IM uint32_t LSIRDYFLG : 1; + __IM uint32_t RESERVED1 : 22; + __IOM uint32_t RSTFLGCLR : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t NRSTFLG : 1; + __IOM uint32_t PODRSTFLG : 1; + __IOM uint32_t SWRSTFLG : 1; + __IOM uint32_t IWDTRSTFLG : 1; + __IOM uint32_t WWDTRSTFLG : 1; + __IOM uint32_t LPWRRSTFLG : 1; + } CSTS_B; + } ; +} RCM_T; + +/** + * @brief General purpose I/O (GPIO) + */ +typedef struct +{ + /* Port configure register low */ + union + { + __IOM uint32_t CFGLOW; + + struct + { + __IOM uint32_t MODE0 : 2; + __IOM uint32_t CFG0 : 2; + __IOM uint32_t MODE1 : 2; + __IOM uint32_t CFG1 : 2; + __IOM uint32_t MODE2 : 2; + __IOM uint32_t CFG2 : 2; + __IOM uint32_t MODE3 : 2; + __IOM uint32_t CFG3 : 2; + __IOM uint32_t MODE4 : 2; + __IOM uint32_t CFG4 : 2; + __IOM uint32_t MODE5 : 2; + __IOM uint32_t CFG5 : 2; + __IOM uint32_t MODE6 : 2; + __IOM uint32_t CFG6 : 2; + __IOM uint32_t MODE7 : 2; + __IOM uint32_t CFG7 : 2; + } CFGLOW_B; + } ; + + /* Port configure register high */ + union + { + __IOM uint32_t CFGHIG; + + struct + { + __IOM uint32_t MODE8 : 2; + __IOM uint32_t CFG8 : 2; + __IOM uint32_t MODE9 : 2; + __IOM uint32_t CFG9 : 2; + __IOM uint32_t MODE10 : 2; + __IOM uint32_t CFG10 : 2; + __IOM uint32_t MODE11 : 2; + __IOM uint32_t CFG11 : 2; + __IOM uint32_t MODE12 : 2; + __IOM uint32_t CFG12 : 2; + __IOM uint32_t MODE13 : 2; + __IOM uint32_t CFG13 : 2; + __IOM uint32_t MODE14 : 2; + __IOM uint32_t CFG14 : 2; + __IOM uint32_t MODE15 : 2; + __IOM uint32_t CFG15 : 2; + } CFGHIG_B; + } ; + + /* Port data in register */ + union + { + __IM uint32_t IDATA; + + struct + { + __IM uint32_t IDATA0 : 1; + __IM uint32_t IDATA1 : 1; + __IM uint32_t IDATA2 : 1; + __IM uint32_t IDATA3 : 1; + __IM uint32_t IDATA4 : 1; + __IM uint32_t IDATA5 : 1; + __IM uint32_t IDATA6 : 1; + __IM uint32_t IDATA7 : 1; + __IM uint32_t IDATA8 : 1; + __IM uint32_t IDATA9 : 1; + __IM uint32_t IDATA10 : 1; + __IM uint32_t IDATA11 : 1; + __IM uint32_t IDATA12 : 1; + __IM uint32_t IDATA13 : 1; + __IM uint32_t IDATA14 : 1; + __IM uint32_t IDATA15 : 1; + __IM uint32_t RESERVED : 16; + } IDATA_B; + } ; + + /* Port data output register */ + union + { + __IOM uint32_t ODATA; + + struct + { + __IOM uint32_t ODATA0 : 1; + __IOM uint32_t ODATA1 : 1; + __IOM uint32_t ODATA2 : 1; + __IOM uint32_t ODATA3 : 1; + __IOM uint32_t ODATA4 : 1; + __IOM uint32_t ODATA5 : 1; + __IOM uint32_t ODATA6 : 1; + __IOM uint32_t ODATA7 : 1; + __IOM uint32_t ODATA8 : 1; + __IOM uint32_t ODATA9 : 1; + __IOM uint32_t ODATA10 : 1; + __IOM uint32_t ODATA11 : 1; + __IOM uint32_t ODATA12 : 1; + __IOM uint32_t ODATA13 : 1; + __IOM uint32_t ODATA14 : 1; + __IOM uint32_t ODATA15 : 1; + __IM uint32_t RESERVED : 16; + } ODATA_B; + } ; + + /* Port bit set/clear register */ + union + { + __OM uint32_t BSC; + + struct + { + __OM uint32_t BS0 : 1; + __OM uint32_t BS1 : 1; + __OM uint32_t BS2 : 1; + __OM uint32_t BS3 : 1; + __OM uint32_t BS4 : 1; + __OM uint32_t BS5 : 1; + __OM uint32_t BS6 : 1; + __OM uint32_t BS7 : 1; + __OM uint32_t BS8 : 1; + __OM uint32_t BS9 : 1; + __OM uint32_t BS10 : 1; + __OM uint32_t BS11 : 1; + __OM uint32_t BS12 : 1; + __OM uint32_t BS13 : 1; + __OM uint32_t BS14 : 1; + __OM uint32_t BS15 : 1; + __OM uint32_t BR0 : 1; + __OM uint32_t BC1 : 1; + __OM uint32_t BC2 : 1; + __OM uint32_t BR3 : 1; + __OM uint32_t BC4 : 1; + __OM uint32_t BC5 : 1; + __OM uint32_t BC6 : 1; + __OM uint32_t BC7 : 1; + __OM uint32_t BC8 : 1; + __OM uint32_t BC9 : 1; + __OM uint32_t BC10 : 1; + __OM uint32_t BC11 : 1; + __OM uint32_t BC12 : 1; + __OM uint32_t BC13 : 1; + __OM uint32_t BC14 : 1; + __OM uint32_t BC15 : 1; + } BSC_B; + } ; + + /* Port bit clear register */ + union + { + __OM uint32_t BC; + + struct + { + __OM uint32_t BC0 : 1; + __OM uint32_t BC1 : 1; + __OM uint32_t BC2 : 1; + __OM uint32_t BC3 : 1; + __OM uint32_t BC4 : 1; + __OM uint32_t BC5 : 1; + __OM uint32_t BC6 : 1; + __OM uint32_t BC7 : 1; + __OM uint32_t BC8 : 1; + __OM uint32_t BC9 : 1; + __OM uint32_t BC10 : 1; + __OM uint32_t BC11 : 1; + __OM uint32_t BC12 : 1; + __OM uint32_t BC13 : 1; + __OM uint32_t BC14 : 1; + __OM uint32_t BC15 : 1; + __IM uint32_t RESERVED : 16; + } BC_B; + } ; + + /* Port configuration lock register */ + union + { + __IOM uint32_t LOCK; + + struct + { + __IOM uint32_t LOCK0 : 1; + __IOM uint32_t LOCK1 : 1; + __IOM uint32_t LOCK2 : 1; + __IOM uint32_t LOCK3 : 1; + __IOM uint32_t LOCK4 : 1; + __IOM uint32_t LOCK5 : 1; + __IOM uint32_t LOCK6 : 1; + __IOM uint32_t LOCK7 : 1; + __IOM uint32_t LOCK8 : 1; + __IOM uint32_t LOCK9 : 1; + __IOM uint32_t LOCK10 : 1; + __IOM uint32_t LOCK11 : 1; + __IOM uint32_t LOCK12 : 1; + __IOM uint32_t LOCK13 : 1; + __IOM uint32_t LOCK14 : 1; + __IOM uint32_t LOCK15 : 1; + __IOM uint32_t LOCKKEY : 1; + __IM uint32_t RESERVED : 15; + } LOCK_B; + } ; +} GPIO_T; + +/** + * @brief Alternate function I/O (AFIO) + */ +typedef struct +{ + /* Event control register */ + union + { + __IOM uint32_t EVCTRL; + + struct + { + __IOM uint32_t PINSEL : 4; + __IOM uint32_t PORTSEL : 3; + __IOM uint32_t EVOEN : 1; + __IM uint32_t RESERVED : 24; + } EVCTRL_B; + } ; + + /* Alternate function IO remap and Serial wire JTAG configuration register */ + union + { + __IOM uint32_t REMAP1; + + struct + { + __IOM uint32_t SPI1RMP : 1; + __IOM uint32_t I2C1RMP : 1; + __IOM uint32_t USART1RMP : 1; + __IOM uint32_t USART2RMP : 1; + __IOM uint32_t USART3RMP : 2; + __IOM uint32_t TMR1RMP : 2; + __IOM uint32_t TMR2RMP : 2; + __IOM uint32_t TMR3RMP : 2; + __IOM uint32_t TMR4RMP : 1; + __IOM uint32_t CAN1RMP : 2; + __IOM uint32_t PD01RMP : 1; + __IOM uint32_t TMR5CH4IRMP : 1; + __IOM uint32_t ADC1_ETRGINJC_RMP : 1; + __IOM uint32_t ADC1_ETRGREGC_RMP : 1; + __IOM uint32_t ADC2_ETRGINJC_RMP : 1; + __IOM uint32_t ADC2_ETRGREGC_RMP : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t CAN2RMP : 1; + __IM uint32_t RESERVED2 : 1; + __OM uint32_t SWJCFG : 3; + __IM uint32_t RESERVED3 : 5; + } REMAP1_B; + } ; + + /* External interrupt select register1 */ + union + { + __IOM uint32_t EINTSEL1; + + struct + { + __IOM uint32_t EINT0 : 4; + __IOM uint32_t EINT1 : 4; + __IOM uint32_t EINT2 : 4; + __IOM uint32_t EINT3 : 4; + __IM uint32_t RESERVED : 16; + } EINTSEL1_B; + } ; + + /* External interrupt select register2 */ + union + { + __IOM uint32_t EINTSEL2; + + struct + { + __IOM uint32_t EINT4 : 4; + __IOM uint32_t EINT5 : 4; + __IOM uint32_t EINT6 : 4; + __IOM uint32_t EINT7 : 4; + __IM uint32_t RESERVED : 16; + } EINTSEL2_B; + } ; + + /* External interrupt select register3 */ + union + { + __IOM uint32_t EINTSEL3; + + struct + { + __IOM uint32_t EINT8 : 4; + __IOM uint32_t EINT9 : 4; + __IOM uint32_t EINT10 : 4; + __IOM uint32_t EINT11 : 4; + __IM uint32_t RESERVED : 16; + } EINTSEL3_B; + } ; + + /* External interrupt select register4 */ + union + { + __IOM uint32_t EINTSEL4; + + struct + { + __IOM uint32_t EINT12 : 4; + __IOM uint32_t EINT13 : 4; + __IOM uint32_t EINT14 : 4; + __IOM uint32_t EINT15 : 4; + __IM uint32_t RESERVED : 16; + } EINTSEL4_B; + } ; + __IM uint32_t RESERVED; + + /* Alternate function IO remap register2 */ + union + { + __IOM uint32_t REMAP2; + + struct + { + __IM uint32_t RESERVED1 : 10; + __IOM uint32_t EMMCNADV : 1; + __IM uint32_t RESERVED2 : 21; + } REMAP2_B; + } ; +} AFIO_T; + +/** + * @brief Universal synchronous asynchronous receiver transmitter (USART) + */ +typedef struct +{ + /* Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IM uint32_t PEFLG : 1; + __IM uint32_t FEFLG : 1; + __IM uint32_t NEFLG : 1; + __IM uint32_t OVREFLG : 1; + __IM uint32_t IDLEFLG : 1; + __IOM uint32_t RXBNEFLG : 1; + __IOM uint32_t TXCFLG : 1; + __IM uint32_t TXBEFLG : 1; + __IOM uint32_t LBDFLG : 1; + __IOM uint32_t CTSFLG : 1; + __IM uint32_t RESERVED : 22; + } STS_B; + } ; + + /* TX Buffer Data Register */ + union + { + __IOM uint32_t DATA; + + struct + { + __IOM uint32_t DATA : 9; + __IM uint32_t RESERVED : 23; + } DATA_B; + } ; + + /* Baud rate register */ + union + { + __IOM uint32_t BR; + + struct + { + __IOM uint32_t FBR : 4; + __IOM uint32_t IBR : 12; + __IM uint32_t RESERVED : 16; + } BR_B; + } ; + + /* Control register 1 */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t TXBF : 1; + __IOM uint32_t RXMUTEEN : 1; + __IOM uint32_t RXEN : 1; + __IOM uint32_t TXEN : 1; + __IOM uint32_t IDLEIEN : 1; + __IOM uint32_t RXBNEIEN : 1; + __IOM uint32_t TXCIEN : 1; + __IOM uint32_t TXBEIEN : 1; + __IOM uint32_t PEIEN : 1; + __IOM uint32_t PCFG : 1; + __IOM uint32_t PCEN : 1; + __IOM uint32_t WUPMCFG : 1; + __IOM uint32_t DBLCFG : 1; + __IOM uint32_t UEN : 1; + __IM uint32_t RESERVED : 18; + } CTRL1_B; + } ; + + /* Control register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t ADDR : 4; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t LBDLCFG : 1; + __IOM uint32_t LBDIEN : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t LBCPOEN : 1; + __IOM uint32_t CPHA : 1; + __IOM uint32_t CPOL : 1; + __IOM uint32_t CLKEN : 1; + __IOM uint32_t STOPCFG : 2; + __IOM uint32_t LINMEN : 1; + __IM uint32_t RESERVED3 : 17; + } CTRL2_B; + } ; + + /* Control register 3 */ + union + { + __IOM uint32_t CTRL3; + + struct + { + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t IREN : 1; + __IOM uint32_t IRLPEN : 1; + __IOM uint32_t HDEN : 1; + __IOM uint32_t SCNACKEN : 1; + __IOM uint32_t SCEN : 1; + __IOM uint32_t DMARXEN : 1; + __IOM uint32_t DMATXEN : 1; + __IOM uint32_t RTSEN : 1; + __IOM uint32_t CTSEN : 1; + __IOM uint32_t CTSIEN : 1; + __IM uint32_t RESERVED : 21; + } CTRL3_B; + } ; + + /* Guard TMRe and divider number register */ + union + { + __IOM uint32_t GTPSC; + + struct + { + __IOM uint32_t PSC : 8; + __IOM uint32_t GRDT : 8; + __IM uint32_t RESERVED : 16; + } GTPSC_B; + } ; +} USART_T; + +/** + * @brief Flash memory controller(FMC) + */ +typedef struct +{ + /* FMC access control register */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t WS : 3; + __IOM uint32_t HCAEN : 1; + __IOM uint32_t PBEN : 1; + __IM uint32_t PBSF : 1; + __IM uint32_t RESERVED : 26; + } CTRL1_B; + } ; + + /* key register */ + union + { + __OM uint32_t KEY; + + struct + { + __OM uint32_t KEY : 32; + } KEY_B; + } ; + + /* option byte key register */ + union + { + __OM uint32_t OBKEY; + + struct + { + __OM uint32_t OBKEY : 32; + } OBKEY_B; + }; + + /* status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IM uint32_t BUSYF : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t PEF : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t WPEF : 1; + __IOM uint32_t OCF : 1; + __IM uint32_t RESERVED3 : 26; + } STS_B; + }; + + /* status register */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t PG : 1; + __IOM uint32_t PAGEERA : 1; + __IOM uint32_t MASSERA : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t OBP : 1; + __IOM uint32_t OBE : 1; + __IOM uint32_t STA : 1; + __IOM uint32_t LOCK : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t OBWEN : 1; + __IOM uint32_t ERRIE : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t OCIE : 1; + __IM uint32_t RESERVED4 : 19; + } CTRL2_B; + } ; + + /* address register */ + union + { + __OM uint32_t ADDR; + + struct + { + __OM uint32_t ADDR : 32; + } ADDR_B; + }; + + __IM uint32_t RESERVED; + + /* Option byte register */ + union + { + __IOM uint32_t OBCS; + + struct + { + __IM uint32_t OBE : 1; + __IM uint32_t READPROT : 1; + __IM uint32_t UOB : 8; + __IM uint32_t DATA0 : 8; + __IM uint32_t DATA1 : 8; + __IM uint32_t RESERVED : 6; + } OBCS_B; + }; + + /* Write protection register */ + union + { + __IM uint32_t WRTPROT; + + struct + { + __IM uint32_t WRTPORT : 32; + } WRTPORT_B; + }; +} FMC_T; + +/** + * @brief CRC calculation unit (CRC) + */ +typedef struct +{ + /** @brief DATA register */ + union + { + __IOM uint32_t DATA; + + struct + { + __IOM uint32_t DATA : 32; + } DATA_B; + } ; + + /** @brief independent DATA register */ + union + { + __IOM uint32_t INDATA; + + struct + { + __IOM uint32_t INDATA : 8; + __IM uint32_t RESERVED : 24; + } INDATA_B; + }; + + /** @brief Countrol register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t RST : 1; + __IM uint32_t RESERVED : 31; + } CTRL_B; + }; +} CRC_T; + +/** + * @brief Real time clock (RTC) + */ +typedef struct +{ + /** @brief Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t SECIEN : 1; + __IOM uint32_t ALRIEN : 1; + __IOM uint32_t OVRIEN : 1; + __IM uint32_t RESERVED : 29; + } CTRL_B; + }; + + /** @brief Control and State register */ + union + { + __IOM uint32_t CSTS; + + struct + { + __IOM uint32_t SECFLG : 1; + __IOM uint32_t ALRFLG : 1; + __IOM uint32_t OVRFLG : 1; + __IOM uint32_t RSYNCFLG : 1; + __IOM uint32_t CFGMFLG : 1; + __IM uint32_t OCFLG : 1; + __IM uint32_t RESERVED : 26; + } CSTS_B; + }; + + /** @brief RTC predivision loading register High Bit */ + union + { + __OM uint32_t PSCRLDH; + + struct + { + __OM uint32_t PSCRLDH : 4; + __IM uint32_t RESERVED : 28; + } PSCRLDH_B; + }; + + /** @brief RTC predivision loading register Low Bit */ + union + { + __OM uint32_t PSCRLDL; + + struct + { + __OM uint32_t PSCRLDL : 16; + __IM uint32_t RESERVED : 16; + } PSCRLDL_B; + }; + + /** @brief RTC predivider remainder register High Bit */ + union + { + __IM uint32_t PSCH; + + struct + { + __IM uint32_t PSCH : 4; + __IM uint32_t RESERVED : 28; + } PSCH_B; + }; + + /** @brief RTC predivider remainder register Low Bit */ + union + { + __IM uint32_t PSCL; + + struct + { + __IM uint32_t PSCL : 16; + __IM uint32_t RESERVED : 16; + } PSCL_B; + }; + + /** @brief RTC count register High Bit */ + union + { + __IOM uint32_t CNTH; + + struct + { + __IOM uint32_t CNTH : 16; + __IM uint32_t RESERVED : 16; + } CNTH_B; + }; + + /** @brief RTC count register Low Bit */ + union + { + __IOM uint32_t CNTL; + + struct + { + __IOM uint32_t CNTL : 16; + __IM uint32_t RESERVED : 16; + } CNTL_B; + }; + + /** @brief RTC alarm clock register High Bit */ + union + { + __OM uint32_t ALRH; + + struct + { + __OM uint32_t ALRH : 16; + __IM uint32_t RESERVED : 16; + } ALRH_B; + }; + + /** @brief RTC alarm clock register Low Bit */ + union + { + __OM uint32_t ALRL; + + struct + { + __OM uint32_t ALRL : 16; + __IM uint32_t RESERVED : 16; + } ALRL_B; + }; +} RTC_T; + +/** + * @brief Power Management Unit(PMU) + */ +typedef struct +{ + /** @brief Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t LPDSCFG : 1; + __IOM uint32_t PDDSCFG : 1; + __IOM uint32_t WUFLGCLR : 1; + __IOM uint32_t SBFLGCLR : 1; + __IOM uint32_t PVDEN : 1; + __IOM uint32_t PLSEL : 3; + __IOM uint32_t BPWEN : 1; + __IM uint32_t RESERVED : 23; + } CTRL_B; + }; + + /** @brief PMU Status register */ + union + { + __IOM uint32_t CSTS; + + struct + { + __IM uint32_t WUEFLG : 1; + __IM uint32_t SBFLG : 1; + __IM uint32_t PVDOFLG : 1; + __IM uint32_t RESERVED : 5; + __IOM uint32_t WKUPCFG : 1; + __IM uint32_t RESERVED2 : 23; + } CSTS_B; + }; +} PMU_T; + +/** + * @brief Backup register (BAKPR) + */ +typedef struct +{ + __IM uint32_t RESERVED; + + /** @brief BAKPR DATA1 register */ + union + { + __IOM uint32_t DATA1; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA1_B; + }; + + /** @brief BAKPR DATA2 register */ + union + { + __IOM uint32_t DATA2; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA2_B; + }; + + /** @brief BAKPR DATA3 register */ + union + { + __IOM uint32_t DATA3; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA3_B; + }; + + /** @brief BAKPR DATA4 register */ + union + { + __IOM uint32_t DATA4; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA4_B; + }; + + /** @brief BAKPR DATA5 register */ + union + { + __IOM uint32_t DATA5; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA5_B; + }; + + /** @brief BAKPR DATA6 register */ + union + { + __IOM uint32_t DATA6; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA6_B; + }; + + /** @brief BAKPR DATA7 register */ + union + { + __IOM uint32_t DATA7; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA7_B; + }; + + /** @brief BAKPR DATA8 register */ + union + { + __IOM uint32_t DATA8; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA8_B; + }; + + /** @brief BAKPR DATA9 register */ + union + { + __IOM uint32_t DATA9; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA9_B; + }; + + /** @brief BAKPR DATA10 register */ + union + { + __IOM uint32_t DATA10; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA10_B; + }; + + /** @brief BAKPR Clock Calibration register */ + union + { + __IOM uint32_t CLKCAL; + + struct + { + __IOM uint32_t CALVALUE : 7; + __IOM uint32_t CALCOEN : 1; + __IOM uint32_t ASPOEN : 1; + __IOM uint32_t ASPOSEL : 1; + __IM uint32_t RESERVED : 22; + } CLKCAL_B; + } ; + + /** @brief BAKPR Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t TPFCFG : 1; + __IOM uint32_t TPALCFG : 1; + __IM uint32_t RESERVED : 30; + } CTRL_B; + }; + + /** @brief BAKPR Control register */ + union + { + __IOM uint32_t CSTS; + + struct + { + __OM uint32_t TECLR : 1; + __OM uint32_t TICLR : 1; + __IOM uint32_t TPIEN : 1; + __IM uint32_t RESERVED1 : 5; + __IM uint32_t TEFLG : 1; + __IM uint32_t TIFLG : 1; + __IM uint32_t RESERVED2 : 22; + } CSTS_B; + }; + + __IM uint32_t RESERVED1[2]; + + /** @brief BAKPR DATA11 register */ + union + { + __IOM uint32_t DATA11; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA11_B; + }; + + /** @brief BAKPR DATA12 register */ + union + { + __IOM uint32_t DATA12; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA12_B; + }; + + /** @brief BAKPR DATA13 register */ + union + { + __IOM uint32_t DATA13; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA13_B; + }; + + /** @brief BAKPR DATA14 register */ + union + { + __IOM uint32_t DATA14; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA14_B; + }; + + /** @brief BAKPR DATA15 register */ + union + { + __IOM uint32_t DATA15; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA15_B; + }; + + /** @brief BAKPR DATA16 register */ + union + { + __IOM uint32_t DATA16; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA16_B; + }; + + /** @brief BAKPR DATA17 register */ + union + { + __IOM uint32_t DATA17; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA17_B; + }; + + /** @brief BAKPR DATA18 register */ + union + { + __IOM uint32_t DATA18; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA18_B; + }; + + /** @brief BAKPR DATA19 register */ + union + { + __IOM uint32_t DATA19; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA19_B; + }; + + /** @brief BAKPR DATA20 register */ + union + { + __IOM uint32_t DATA20; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA20_B; + }; + + /** @brief BAKPR DATA21 register */ + union + { + __IOM uint32_t DATA21; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA21_B; + }; + + /** @brief BAKPR DATA22 register */ + union + { + __IOM uint32_t DATA22; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA22_B; + }; + + /** @brief BAKPR DATA23 register */ + union + { + __IOM uint32_t DATA23; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA23_B; + }; + + /** @brief BAKPR DATA24 register */ + union + { + __IOM uint32_t DATA24; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA24_B; + }; + + /** @brief BAKPR DATA25 register */ + union + { + __IOM uint32_t DATA25; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA25_B; + }; + + /** @brief BAKPR DATA26 register */ + union + { + __IOM uint32_t DATA26; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA26_B; + }; + + /** @brief BAKPR DATA27 register */ + union + { + __IOM uint32_t DATA27; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA27_B; + }; + + /** @brief BAKPR DATA28 register */ + union + { + __IOM uint32_t DATA28; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA28_B; + }; + + /** @brief BAKPR DATA29 register */ + union + { + __IOM uint32_t DATA29; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA29_B; + }; + + /** @brief BAKPR DATA30 register */ + union + { + __IOM uint32_t DATA30; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA30_B; + }; + + /** @brief BAKPR DATA31 register */ + union + { + __IOM uint32_t DATA31; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA31_B; + }; + + /** @brief BAKPR DATA32 register */ + union + { + __IOM uint32_t DATA32; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA32_B; + }; + + /** @brief BAKPR DATA33 register */ + union + { + __IOM uint32_t DATA33; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA33_B; + }; + + /** @brief BAKPR DATA34 register */ + union + { + __IOM uint32_t DATA34; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA34_B; + }; + + /** @brief BAKPR DATA35 register */ + union + { + __IOM uint32_t DATA35; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA35_B; + }; + + /** @brief BAKPR DATA36 register */ + union + { + __IOM uint32_t DATA36; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA36_B; + }; + + /** @brief BAKPR DATA37 register */ + union + { + __IOM uint32_t DATA37; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA37_B; + }; + + /** @brief BAKPR DATA38 register */ + union + { + __IOM uint32_t DATA38; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA38_B; + }; + + /** @brief BAKPR DATA39 register */ + union + { + __IOM uint32_t DATA39; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA39_B; + }; + + /** @brief BAKPR DATA40 register */ + union + { + __IOM uint32_t DATA40; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA40_B; + }; + + /** @brief BAKPR DATA41 register */ + union + { + __IOM uint32_t DATA41; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA41_B; + }; + + /** @brief BAKPR DATA42 register */ + union + { + __IOM uint32_t DATA42; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA42_B; + }; +} BAKPR_T; + +/** + * @brief Timer register(TMR) + */ +typedef struct +{ + /** @brief Countrol register 1 */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t CNTEN : 1; + __IOM uint32_t UD : 1; + __IOM uint32_t URSSEL : 1; + __IOM uint32_t SPMEN : 1; + __IOM uint32_t CNTDIR : 1; + __IOM uint32_t CAMSEL : 2; + __IOM uint32_t ARPEN : 1; + __IOM uint32_t CLKDIV : 2; + __IM uint32_t RESERVED : 22; + } CTRL1_B; + }; + + /** @brief Countrol register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t CCPEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t CCUSEL : 1; + __IOM uint32_t CCDSEL : 1; + __IOM uint32_t MMSEL : 3; + __IOM uint32_t TI1SEL : 1; + __IOM uint32_t OC1OIS : 1; + __IOM uint32_t OC1NOIS : 1; + __IOM uint32_t OC2OIS : 1; + __IOM uint32_t OC2NOIS : 1; + __IOM uint32_t OC3OIS : 1; + __IOM uint32_t OC3NOIS : 1; + __IOM uint32_t OC4OIS : 1; + __IM uint32_t RESERVED2 : 17; + } CTRL2_B; + }; + + /** @brief Control register from mode */ + union + { + __IOM uint32_t SMCTRL; + + struct + { + __IOM uint32_t SMFSEL : 3; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t TRGSEL : 3; + __IOM uint32_t MSMEN : 1; + __IOM uint32_t ETFCFG : 4; + __IOM uint32_t ETPCFG : 2; + __IOM uint32_t ECEN : 1; + __IOM uint32_t ETPOL : 1; + __IM uint32_t RESERVED2 : 16; + } SMCTRL_B; + }; + + /** @brief DMA and Interrupt enable register */ + union + { + __IOM uint32_t DIEN; + + struct + { + __IOM uint32_t UIEN : 1; + __IOM uint32_t CC1IEN : 1; + __IOM uint32_t CC2IEN : 1; + __IOM uint32_t CC3IEN : 1; + __IOM uint32_t CC4IEN : 1; + __IOM uint32_t COMIEN : 1; + __IOM uint32_t TRGIEN : 1; + __IOM uint32_t BRKIEN : 1; + __IOM uint32_t UDIEN : 1; + __IOM uint32_t CC1DEN : 1; + __IOM uint32_t CC2DEN : 1; + __IOM uint32_t CC3DEN : 1; + __IOM uint32_t CC4DEN : 1; + __IOM uint32_t COMDEN : 1; + __IOM uint32_t TRGDEN : 1; + __IM uint32_t RESERVED : 17; + } DIEN_B; + }; + + /** @brief Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IOM uint32_t UIFLG : 1; + __IOM uint32_t CC1IFLG : 1; + __IOM uint32_t CC2IFLG : 1; + __IOM uint32_t CC3IFLG : 1; + __IOM uint32_t CC4IFLG : 1; + __IOM uint32_t COMIFLG : 1; + __IOM uint32_t TRGIFLG : 1; + __IOM uint32_t BRKIFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t CC1RCFLG : 1; + __IOM uint32_t CC2RCFLG : 1; + __IOM uint32_t CC3RCFLG : 1; + __IOM uint32_t CC4RCFLG : 1; + __IM uint32_t RESERVED2 : 19; + } STS_B; + }; + + /** @brief Software controls event generation registers */ + union + { + __OM uint32_t CEG; + + struct + { + __OM uint32_t UEG : 1; + __OM uint32_t CC1EG : 1; + __OM uint32_t CC2EG : 1; + __OM uint32_t CC3EG : 1; + __OM uint32_t CC4EG : 1; + __OM uint32_t COMG : 1; + __OM uint32_t TEG : 1; + __OM uint32_t BEG : 1; + __OM uint32_t RESERVED : 24; + } CEG_B; + }; + + /** @brief Capture the compare mode register 1 */ + union + { + __IOM uint32_t CCM1; + + /** @brief Compare mode */ + struct + { + __IOM uint32_t CC1SEL : 2; + __IOM uint32_t OC1FEN : 1; + __IOM uint32_t OC1PEN : 1; + __IOM uint32_t OC1MOD : 3; + __IOM uint32_t OC1CEN : 1; + __IOM uint32_t CC2SEL : 2; + __IOM uint32_t OC2FEN : 1; + __IOM uint32_t OC2PEN : 1; + __IOM uint32_t OC2MOD : 3; + __IOM uint32_t OC2CEN : 1; + __IM uint32_t RESERVED : 16; + } CCM1_COMPARE_B; + + /** @brief Capture mode */ + struct + { + __IOM uint32_t CC1SEL : 2; + __IOM uint32_t IC1PSC : 2; + __IOM uint32_t IC1F : 4; + __IOM uint32_t CC2SEL : 2; + __IOM uint32_t IC2PSC : 2; + __IOM uint32_t IC2F : 4; + __IM uint32_t RESERVED : 16; + } CCM1_CAPTURE_B; + }; + + /** @brief Capture the compare mode register 2 */ + union + { + __IOM uint32_t CCM2; + + /** @brief Compare mode */ + struct + { + __IOM uint32_t CC3SEL : 2; + __IOM uint32_t OC3FEN : 1; + __IOM uint32_t OC3PEN : 1; + __IOM uint32_t OC3MOD : 3; + __IOM uint32_t OC3CEN : 1; + __IOM uint32_t CC4SEL : 2; + __IOM uint32_t OC4FEN : 1; + __IOM uint32_t OC4PEN : 1; + __IOM uint32_t OC4MOD : 3; + __IOM uint32_t OC4CEN : 1; + __IM uint32_t RESERVED : 16; + } CCM2_COMPARE_B; + + /** @brief Capture mode */ + struct + { + __IOM uint32_t CC3SEL : 2; + __IOM uint32_t IC3PSC : 2; + __IOM uint32_t IC3F : 4; + __IOM uint32_t CC4SEL : 2; + __IOM uint32_t IC4PSC : 2; + __IOM uint32_t IC4F : 4; + __IM uint32_t RESERVED : 16; + } CCM2_CAPTURE_B; + }; + + /** @brief Channel control register */ + union + { + __IOM uint32_t CCEN; + + struct + { + __IOM uint32_t CC1EN : 1; + __IOM uint32_t CC1POL : 1; + __IOM uint32_t CC1NEN : 1; + __IOM uint32_t CC1NPOL : 1; + __IOM uint32_t CC2EN : 1; + __IOM uint32_t CC2POL : 1; + __IOM uint32_t CC2NEN : 1; + __IOM uint32_t CC2NPOL : 1; + __IOM uint32_t CC3EN : 1; + __IOM uint32_t CC3POL : 1; + __IOM uint32_t CC3NEN : 1; + __IOM uint32_t CC3NPOL : 1; + __IOM uint32_t CC4EN : 1; + __IOM uint32_t CC4POL : 1; + __IM uint32_t RESERVED : 18; + } CCEN_B; + }; + + /** @brief Counting register */ + union + { + __IOM uint32_t CNT; + + struct + { + __IOM uint32_t CNT : 16; + __IM uint32_t RESERVED : 16; + } CNT_B; + }; + + /** @brief Division register */ + union + { + __IOM uint32_t PSC; + + struct + { + __IOM uint32_t PSC : 16; + __IM uint32_t RESERVED : 16; + } PSC_B; + }; + + /** @brief Automatic reload register */ + union + { + __IOM uint32_t AUTORLD; + + struct + { + __IOM uint32_t AUTORLD : 16; + __IM uint32_t RESERVED : 16; + } AUTORLD_B; + }; + + /** @brief Repeat count register */ + union + { + __IOM uint32_t REPCNT; + + struct + { + __IOM uint32_t REPCNT : 8; + __IM uint32_t RESERVED : 24; + } REPCNT_B; + }; + + /** @brief Capture comparison register channel 1 */ + union + { + __IOM uint32_t CC1; + + struct + { + __IOM uint32_t CC1 : 16; + __IM uint32_t RESERVED : 16; + } CC1_B; + }; + + /** @brief Capture comparison register channel 2 */ + union + { + __IOM uint32_t CC2; + + struct + { + __IOM uint32_t CC2 : 16; + __IM uint32_t RESERVED : 16; + } CC2_B; + }; + + /** @brief Capture comparison register channel 3 */ + union + { + __IOM uint32_t CC3; + + struct + { + __IOM uint32_t CC3 : 16; + __IM uint32_t RESERVED : 16; + } CC3_B; + }; + + /** @brief Capture comparison register channel 4 */ + union + { + __IOM uint32_t CC4; + + struct + { + __IOM uint32_t CC4 : 16; + __IM uint32_t RESERVED : 16; + } CC4_B; + }; + + /** @brief Brake and dead zone registers */ + union + { + __IOM uint32_t BDT; + + struct + { + __IOM uint32_t DTS : 8; + __IOM uint32_t LOCKCFG : 2; + __IOM uint32_t IMOS : 1; + __IOM uint32_t RMOS : 1; + __IOM uint32_t BRKEN : 1; + __IOM uint32_t BRKPOL : 1; + __IOM uint32_t AOEN : 1; + __IOM uint32_t MOEN : 1; + __IM uint32_t RESERVED : 16; + } BDT_B; + }; + + /** @brief DMA control register */ + union + { + __IOM uint32_t DCTRL; + + struct + { + __IOM uint32_t DBADDR : 5; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t DBLEN : 5; + __IM uint32_t RESERVED2 : 19; + } DCTRL_B; + }; + + /** @brief Consecutive DMA addresses */ + union + { + __IOM uint32_t DMADDR; + struct + { + __IOM uint32_t DMADDR : 16; + __IM uint32_t RESERVED2 : 16; + } DMADDR_B; + }; +} TMR_T; + +/** + * @brief Direct Memory Access register(DMA) + */ +typedef struct +{ + /** @brief Interrupt status register */ + union + { + __IM uint32_t INTSTS; + + struct + { + __IM uint32_t GINTFLG1 : 1; + __IM uint32_t TCFLG1 : 1; + __IM uint32_t HTFLG1 : 1; + __IM uint32_t TERRFLG1 : 1; + __IM uint32_t GINTFLG2 : 1; + __IM uint32_t TCFLG2 : 1; + __IM uint32_t HTFLG2 : 1; + __IM uint32_t TERRFLG2 : 1; + __IM uint32_t GINTFLG3 : 1; + __IM uint32_t TCFLG3 : 1; + __IM uint32_t HTFLG3 : 1; + __IM uint32_t TERRFLG3 : 1; + __IM uint32_t GINTFLG4 : 1; + __IM uint32_t TCFLG4 : 1; + __IM uint32_t HTFLG4 : 1; + __IM uint32_t TERRFLG4 : 1; + __IM uint32_t GINTFLG5 : 1; + __IM uint32_t TCFLG5 : 1; + __IM uint32_t HTFLG5 : 1; + __IM uint32_t TERRFLG5 : 1; + __IM uint32_t GINTFLG6 : 1; + __IM uint32_t TCFLG6 : 1; + __IM uint32_t HTFLG6 : 1; + __IM uint32_t TERRFLG6 : 1; + __IM uint32_t GINTFLG7 : 1; + __IM uint32_t TCFLG7 : 1; + __IM uint32_t HTFLG7 : 1; + __IM uint32_t TERRFLG7 : 1; + __IM uint32_t RESERVED : 4; + } INTSTS_B; + }; + + /** @brief Interrupt reset register */ + union + { + __OM uint32_t INTFCLR; + + struct + { + __OM uint32_t GINTCLR1 : 1; + __OM uint32_t TCCLR1 : 1; + __OM uint32_t HTCLR1 : 1; + __OM uint32_t TERRCLR1 : 1; + __OM uint32_t GINTCLR2 : 1; + __OM uint32_t TCCLR2 : 1; + __OM uint32_t HTCLR2 : 1; + __OM uint32_t TERRCLR2 : 1; + __OM uint32_t GINTCLR3 : 1; + __OM uint32_t TCCLR3 : 1; + __OM uint32_t HTCLR3 : 1; + __OM uint32_t TERRCLR3 : 1; + __OM uint32_t GINTCLR4 : 1; + __OM uint32_t TCCLR4 : 1; + __OM uint32_t HTCLR4 : 1; + __OM uint32_t TERRCLR4 : 1; + __OM uint32_t GINTCLR5 : 1; + __OM uint32_t TCCLR5 : 1; + __OM uint32_t HTCLR5 : 1; + __OM uint32_t TERRCLR5 : 1; + __OM uint32_t GINTCLR6 : 1; + __OM uint32_t TCCLR6 : 1; + __OM uint32_t HTCLR6 : 1; + __OM uint32_t TERRCLR6 : 1; + __OM uint32_t GINTCLR7 : 1; + __OM uint32_t TCCLR7 : 1; + __OM uint32_t HTCLR7 : 1; + __OM uint32_t TERRCLR7 : 1; + __IM uint32_t RESERVED : 4; + } INTFCLR_B; + }; +} DMA_T; + +/** + * @brief DMA Channel register + */ +typedef struct +{ + /** @brief DMA Channel setup register */ + union + { + + __IOM uint32_t CHCFG; + + struct + { + __IOM uint32_t CHEN : 1; + __IOM uint32_t TCINTEN : 1; + __IOM uint32_t HTINTEN : 1; + __IOM uint32_t TERRINTEN : 1; + __IOM uint32_t DIRCFG : 1; + __IOM uint32_t CIRMODE : 1; + __IOM uint32_t PERIMODE : 1; + __IOM uint32_t MIMODE : 1; + __IOM uint32_t PERSIZE : 2; + __IOM uint32_t MEMSIZE : 2; + __IOM uint32_t CHPL : 2; + __IOM uint32_t M2MMODE : 1; + __IM uint32_t RESERVED : 17; + } CHCFG_B; + }; + + /** @brief DMA Channel transfer number register*/ + union + { + __IOM uint32_t CHNDATA; + + struct + { + __IOM uint32_t NDATA : 16; + __IM uint32_t RESERVED : 16; + } CHNDATA_B; + }; + + /** @brief DMA Channel peripheral address register */ + union + { + __IOM uint32_t CHPADDR; + + struct + { + __IOM uint32_t PERADDR : 32; + } CHPADDR_B; + }; + + /** @brief DMA Channel memory address register */ + union + { + __IOM uint32_t CHMADDR; + + struct + { + __IOM uint32_t MEMADDR : 32; + } CHMADDR_B; + }; +} DMA_Channel_T; + +/** + * @brief CAN sending mailbox + */ +typedef struct +{ + /** @brief CAN Each mailbox contains the sending mailbox identifier register */ + union + { + __IOM uint32_t TXMID; + + struct + { + __IOM uint32_t TXMREQ : 1; + __IOM uint32_t TXRFREQ : 1; + __IOM uint32_t IDTYPESEL : 1; + __IOM uint32_t EXTID : 18; + __IOM uint32_t STDID : 11; + } TXMID_B; + }; + + /** @brief CAN Send the mailbox data length and timestamp register */ + union + { + __IOM uint32_t TXDLEN; + + struct + { + __IOM uint32_t DLCODE : 4; + __IM uint32_t RESERVED1 : 28; + } TXDLEN_B; + }; + + /** @brief CAN Send mailbox low byte data register */ + union + { + __IOM uint32_t TXMDL; + + struct + { + __IOM uint32_t DATABYTE0 : 8; + __IOM uint32_t DATABYTE1 : 8; + __IOM uint32_t DATABYTE2 : 8; + __IOM uint32_t DATABYTE3 : 8; + } TXMDL_B; + }; + + /** @brief CAN Send mailbox High byte data register */ + union + { + __IOM uint32_t TXMDH; + + struct + { + __IOM uint32_t DATABYTE4 : 8; + __IOM uint32_t DATABYTE5 : 8; + __IOM uint32_t DATABYTE6 : 8; + __IOM uint32_t DATABYTE7 : 8; + } TXMDH_B; + }; +} CAN_TxMailBox_T; + +/** + * @brief CAN receive mailbox + */ +typedef struct +{ + /** @brief CAN Each mailbox contains the receive mailbox identifier register */ + union + { + __IM uint32_t RXMID; + + struct + { + __IM uint32_t RESERVED : 1; + __IM uint32_t RFTXREQ : 1; + __IM uint32_t IDTYPESEL : 1; + __IM uint32_t EXTID : 18; + __IM uint32_t STDID : 11; + } RXMID_B; + }; + + /** @brief CAN receive the mailbox data length and timestamp register */ + union + { + __IM uint32_t RXDLEN; + + struct + { + __IM uint32_t DLCODE : 4; + __IM uint32_t RESERVED1 : 4; + __IM uint32_t FMIDX : 8; + __IM uint32_t RESERVED2 : 16; + } RXDLEN_B; + }; + + /** @brief CAN receive mailbox low byte data register */ + union + { + __IM uint32_t RXMDL; + + struct + { + __IM uint32_t DATABYTE0 : 8; + __IM uint32_t DATABYTE1 : 8; + __IM uint32_t DATABYTE2 : 8; + __IM uint32_t DATABYTE3 : 8; + } RXMDL_B; + }; + + /** @briefCAN receive mailbox High byte data register */ + union + { + __IOM uint32_t RXMDH; + + struct + { + __IM uint32_t DATABYTE4 : 8; + __IM uint32_t DATABYTE5 : 8; + __IM uint32_t DATABYTE6 : 8; + __IM uint32_t DATABYTE7 : 8; + } RXMDH_B; + }; +} CAN_RxMailBox_T; + +/** + * @brief CAN Filter bank register + */ +typedef struct +{ + /** @brief CAN Filter bank register 1 */ + union + { + __IOM uint32_t FBANK1; + + struct + { + __IOM uint32_t FBIT0 : 1; + __IOM uint32_t FBIT1 : 1; + __IOM uint32_t FBIT2 : 1; + __IOM uint32_t FBIT3 : 1; + __IOM uint32_t FBIT4 : 1; + __IOM uint32_t FBIT5 : 1; + __IOM uint32_t FBIT6 : 1; + __IOM uint32_t FBIT7 : 1; + __IOM uint32_t FBIT8 : 1; + __IOM uint32_t FBIT9 : 1; + __IOM uint32_t FBIT10 : 1; + __IOM uint32_t FBIT11 : 1; + __IOM uint32_t FBIT12 : 1; + __IOM uint32_t FBIT13 : 1; + __IOM uint32_t FBIT14 : 1; + __IOM uint32_t FBIT15 : 1; + __IOM uint32_t FBIT16 : 1; + __IOM uint32_t FBIT17 : 1; + __IOM uint32_t FBIT18 : 1; + __IOM uint32_t FBIT19 : 1; + __IOM uint32_t FBIT20 : 1; + __IOM uint32_t FBIT21 : 1; + __IOM uint32_t FBIT22 : 1; + __IOM uint32_t FBIT23 : 1; + __IOM uint32_t FBIT24 : 1; + __IOM uint32_t FBIT25 : 1; + __IOM uint32_t FBIT26 : 1; + __IOM uint32_t FBIT27 : 1; + __IOM uint32_t FBIT28 : 1; + __IOM uint32_t FBIT29 : 1; + __IOM uint32_t FBIT30 : 1; + __IOM uint32_t FBIT31 : 1; + } FBANK1_B; + }; + + /** @brief CAN Filter bank register 1 */ + union + { + __IOM uint32_t FBANK2; + + struct + { + __IOM uint32_t FBIT0 : 1; + __IOM uint32_t FBIT1 : 1; + __IOM uint32_t FBIT2 : 1; + __IOM uint32_t FBIT3 : 1; + __IOM uint32_t FBIT4 : 1; + __IOM uint32_t FBIT5 : 1; + __IOM uint32_t FBIT6 : 1; + __IOM uint32_t FBIT7 : 1; + __IOM uint32_t FBIT8 : 1; + __IOM uint32_t FBIT9 : 1; + __IOM uint32_t FBIT10 : 1; + __IOM uint32_t FBIT11 : 1; + __IOM uint32_t FBIT12 : 1; + __IOM uint32_t FBIT13 : 1; + __IOM uint32_t FBIT14 : 1; + __IOM uint32_t FBIT15 : 1; + __IOM uint32_t FBIT16 : 1; + __IOM uint32_t FBIT17 : 1; + __IOM uint32_t FBIT18 : 1; + __IOM uint32_t FBIT19 : 1; + __IOM uint32_t FBIT20 : 1; + __IOM uint32_t FBIT21 : 1; + __IOM uint32_t FBIT22 : 1; + __IOM uint32_t FBIT23 : 1; + __IOM uint32_t FBIT24 : 1; + __IOM uint32_t FBIT25 : 1; + __IOM uint32_t FBIT26 : 1; + __IOM uint32_t FBIT27 : 1; + __IOM uint32_t FBIT28 : 1; + __IOM uint32_t FBIT29 : 1; + __IOM uint32_t FBIT30 : 1; + __IOM uint32_t FBIT31 : 1; + } FBANK2_B; + }; +} CAN_FilterRegister_T; + +/** + * @brief Controller Area Network(CAN) + */ +typedef struct +{ + /** @brief CAN Master control register */ + union + { + __IOM uint32_t MCTRL; + + struct + { + __IOM uint32_t INITREQ : 1; + __IOM uint32_t SLEEPREQ : 1; + __IOM uint32_t TXFPCFG : 1; + __IOM uint32_t RXFLOCK : 1; + __IOM uint32_t ARTXMD : 1; + __IOM uint32_t AWUPCFG : 1; + __IOM uint32_t ALBOFFM : 1; + __IM uint32_t RESERVED1 : 8; + __IOM uint32_t SWRST : 1; + __IOM uint32_t DBGFRZE : 1; + __IM uint32_t RESERVED2 : 15; + } MCTRL_B; + }; + + /** @brief CAN Master States register */ + union + { + __IOM uint32_t MSTS; + + struct + { + __IM uint32_t INITFLG : 1; + __IM uint32_t SLEEPFLG : 1; + __IOM uint32_t ERRIFLG : 1; + __IOM uint32_t WUPIFLG : 1; + __IOM uint32_t SLEEPIFLG : 1; + __IM uint32_t RESERVED1 : 3; + __IM uint32_t TXMFLG : 1; + __IM uint32_t RXMFLG : 1; + __IM uint32_t LSAMVALUE : 1; + __IM uint32_t RXSIGL : 1; + __IM uint32_t RESERVED2 : 20; + } MSTS_B; + }; + + /** @brief CAN Send States register */ + union + { + __IOM uint32_t TXSTS; + + struct + { + __IOM uint32_t REQCFLG0 : 1; + __IOM uint32_t TXSUSFLG0 : 1; + __IOM uint32_t ARBLSTFLG0 : 1; + __IOM uint32_t TXERRFLG0 : 1; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t ABREQFLG0 : 1; + __IOM uint32_t REQCFLG1 : 1; + __IOM uint32_t TXSUSFLG1 : 1; + __IOM uint32_t ARBLSTFLG1 : 1; + __IOM uint32_t TXERRFLG1 : 1; + __IM uint32_t RESERVED2 : 3; + __IOM uint32_t ABREQFLG1 : 1; + __IOM uint32_t REQCFLG2 : 1; + __IOM uint32_t TXSUSFLG2 : 1; + __IOM uint32_t ARBLSTFLG2 : 1; + __IOM uint32_t TXERRFLG2 : 1; + __IM uint32_t RESERVED3 : 3; + __IOM uint32_t ABREQFLG2 : 1; + __IM uint32_t EMNUM : 2; + __IM uint32_t TXMEFLG0 : 1; + __IM uint32_t TXMEFLG1 : 1; + __IM uint32_t TXMEFLG2 : 1; + __IM uint32_t LOWESTP0 : 1; + __IM uint32_t LOWESTP1 : 1; + __IM uint32_t LOWESTP2 : 1; + } TXSTS_B; + }; + + /** @brief CAN Receive FIFO 0 register */ + union + { + __IOM uint32_t RXF0; + + struct + { + __IM uint32_t FMNUM0 : 2; + __IM uint32_t RESERVED : 1; + __IOM uint32_t FFULLFLG0 : 1; + __IOM uint32_t FOVRFLG0 : 1; + __IOM uint32_t RFOM0 : 1; + __IM uint32_t RESERVED2 : 26; + } RXF0_B; + }; + + /** @brief CAN Receive FIFO 1 register */ + union + { + __IOM uint32_t RXF1; + + struct + { + __IM uint32_t FMNUM1 : 2; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t FFULLFLG1 : 1; + __IOM uint32_t FOVRFLG1 : 1; + __IOM uint32_t RFOM1 : 1; + __IM uint32_t RESERVED2 : 26; + } RXF1_B; + }; + + /** @brief CAN Interrupts register */ + union + { + __IOM uint32_t INTEN; + + struct + { + __IOM uint32_t TXMEIEN : 1; + __IOM uint32_t FMIEN0 : 1; + __IOM uint32_t FFULLIEN0 : 1; + __IOM uint32_t FOVRIEN0 : 1; + __IOM uint32_t FMIEN1 : 1; + __IOM uint32_t FFULLIEN1 : 1; + __IOM uint32_t FOVRIEN1 : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t ERRWIEN : 1; + __IOM uint32_t ERRPIEN : 1; + __IOM uint32_t BOFFIEN : 1; + __IOM uint32_t LECIEN : 1; + __IM uint32_t RESERVED2 : 3; + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t WUPIEN : 1; + __IOM uint32_t SLEEPIEN : 1; + __IM uint32_t RESERVED3 : 14; + } INTEN_B; + }; + + /** @brief CAN Error States register */ + union + { + __IOM uint32_t ERRSTS; + + struct + { + __IM uint32_t ERRWFLG : 1; + __IM uint32_t ERRPFLG : 1; + __IM uint32_t BOFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t LERRC : 3; + __IM uint32_t RESERVED2 : 9; + __IM uint32_t TXERRCNT : 8; + __IM uint32_t RXERRCNT : 8; + } ERRSTS_B; + }; + + /** @brief CAN Bit Time register */ + union + { + __IOM uint32_t BITTIM; + + struct + { + __IOM uint32_t BRPSC : 10; + __IM uint32_t RESERVED1 : 6; + __IOM uint32_t TIMSEG1 : 4; + __IOM uint32_t TIMSEG2 : 3; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t RSYNJW : 2; + __IM uint32_t RESERVED3 : 4; + __IOM uint32_t LBKMEN : 1; + __IOM uint32_t SILMEN : 1; + } BITTIM_B; + }; + + __IM uint32_t RESERVED0[88]; + + CAN_TxMailBox_T sTxMailBox[3]; + CAN_RxMailBox_T sRxMailBox[2]; + + __IM uint32_t RESERVED1[12]; + + /** @brief CAN Filter the master control register */ + union + { + __IOM uint32_t FCTRL; + + struct + { + __IOM uint32_t FINITEN : 1; + __IM uint32_t RESERVED1 : 7; + __IOM uint32_t CAN2SB : 6; + __IM uint32_t RESERVED2 : 18; + } FCTRL_B; + }; + + /** @brief CAN Filter register */ + union + { + __IOM uint32_t FMCFG; + + struct + { + __IOM uint32_t FMCFG0 : 1; + __IOM uint32_t FMCFG1 : 1; + __IOM uint32_t FMCFG2 : 1; + __IOM uint32_t FMCFG3 : 1; + __IOM uint32_t FMCFG4 : 1; + __IOM uint32_t FMCFG5 : 1; + __IOM uint32_t FMCFG6 : 1; + __IOM uint32_t FMCFG7 : 1; + __IOM uint32_t FMCFG8 : 1; + __IOM uint32_t FMCFG9 : 1; + __IOM uint32_t FMCFG10 : 1; + __IOM uint32_t FMCFG11 : 1; + __IOM uint32_t FMCFG12 : 1; + __IOM uint32_t FMCFG13 : 1; + __IOM uint32_t FMCFG14 : 1; + __IOM uint32_t FMCFG15 : 1; + __IOM uint32_t FMCFG16 : 1; + __IOM uint32_t FMCFG17 : 1; + __IOM uint32_t FMCFG18 : 1; + __IOM uint32_t FMCFG19 : 1; + __IOM uint32_t FMCFG20 : 1; + __IOM uint32_t FMCFG21 : 1; + __IOM uint32_t FMCFG22 : 1; + __IOM uint32_t FMCFG23 : 1; + __IOM uint32_t FMCFG24 : 1; + __IOM uint32_t FMCFG25 : 1; + __IOM uint32_t FMCFG26 : 1; + __IOM uint32_t FMCFG27 : 1; + __IM uint32_t RESERVED : 4; + } FMCFG_B; + }; + + __IM uint32_t RESERVED2; + + /** @brief CAN Filter bit scale register */ + union + { + __IOM uint32_t FSCFG; + + struct + { + __IOM uint32_t FSCFG0 : 1; + __IOM uint32_t FSCFG1 : 1; + __IOM uint32_t FSCFG2 : 1; + __IOM uint32_t FSCFG3 : 1; + __IOM uint32_t FSCFG4 : 1; + __IOM uint32_t FSCFG5 : 1; + __IOM uint32_t FSCFG6 : 1; + __IOM uint32_t FSCFG7 : 1; + __IOM uint32_t FSCFG8 : 1; + __IOM uint32_t FSCFG9 : 1; + __IOM uint32_t FSCFG10 : 1; + __IOM uint32_t FSCFG11 : 1; + __IOM uint32_t FSCFG12 : 1; + __IOM uint32_t FSCFG13 : 1; + __IOM uint32_t FSCFG14 : 1; + __IOM uint32_t FSCFG15 : 1; + __IOM uint32_t FSCFG16 : 1; + __IOM uint32_t FSCFG17 : 1; + __IOM uint32_t FSCFG18 : 1; + __IOM uint32_t FSCFG19 : 1; + __IOM uint32_t FSCFG20 : 1; + __IOM uint32_t FSCFG21 : 1; + __IOM uint32_t FSCFG22 : 1; + __IOM uint32_t FSCFG23 : 1; + __IOM uint32_t FSCFG24 : 1; + __IOM uint32_t FSCFG25 : 1; + __IOM uint32_t FSCFG26 : 1; + __IOM uint32_t FSCFG27 : 1; + __IM uint32_t RESERVED : 4; + }FSCFG_B; + }; + + __IM uint32_t RESERVED3; + + /** @brief CAN Filter FIFO associated registers */ + union + { + __IOM uint32_t FFASS; + + struct + { + __IOM uint32_t FFASS0 : 1; + __IOM uint32_t FFASS1 : 1; + __IOM uint32_t FFASS2 : 1; + __IOM uint32_t FFASS3 : 1; + __IOM uint32_t FFASS4 : 1; + __IOM uint32_t FFASS5 : 1; + __IOM uint32_t FFASS6 : 1; + __IOM uint32_t FFASS7 : 1; + __IOM uint32_t FFASS8 : 1; + __IOM uint32_t FFASS9 : 1; + __IOM uint32_t FFASS10 : 1; + __IOM uint32_t FFASS11 : 1; + __IOM uint32_t FFASS12 : 1; + __IOM uint32_t FFASS13 : 1; + __IOM uint32_t FFASS14 : 1; + __IOM uint32_t FFASS15 : 1; + __IOM uint32_t FFASS16 : 1; + __IOM uint32_t FFASS17 : 1; + __IOM uint32_t FFASS18 : 1; + __IOM uint32_t FFASS19 : 1; + __IOM uint32_t FFASS20 : 1; + __IOM uint32_t FFASS21 : 1; + __IOM uint32_t FFASS22 : 1; + __IOM uint32_t FFASS23 : 1; + __IOM uint32_t FFASS24 : 1; + __IOM uint32_t FFASS25 : 1; + __IOM uint32_t FFASS26 : 1; + __IOM uint32_t FFASS27 : 1; + __IM uint32_t RESERVED : 4; + } FFASS_B; + }; + + __IM uint32_t RESERVED4; + + /** @brief CAN Filter activation register */ + union + { + __IOM uint32_t FACT; + + struct + { + __IOM uint32_t FACT0 : 1; + __IOM uint32_t FACT1 : 1; + __IOM uint32_t FACT2 : 1; + __IOM uint32_t FACT3 : 1; + __IOM uint32_t FACT4 : 1; + __IOM uint32_t FACT5 : 1; + __IOM uint32_t FACT6 : 1; + __IOM uint32_t FACT7 : 1; + __IOM uint32_t FACT8 : 1; + __IOM uint32_t FACT9 : 1; + __IOM uint32_t FACT10 : 1; + __IOM uint32_t FACT11 : 1; + __IOM uint32_t FACT12 : 1; + __IOM uint32_t FACT13 : 1; + __IOM uint32_t FACT14 : 1; + __IOM uint32_t FACT15 : 1; + __IOM uint32_t FACT16 : 1; + __IOM uint32_t FACT17 : 1; + __IOM uint32_t FACT18 : 1; + __IOM uint32_t FACT19 : 1; + __IOM uint32_t FACT20 : 1; + __IOM uint32_t FACT21 : 1; + __IOM uint32_t FACT22 : 1; + __IOM uint32_t FACT23 : 1; + __IOM uint32_t FACT24 : 1; + __IOM uint32_t FACT25 : 1; + __IOM uint32_t FACT26 : 1; + __IOM uint32_t FACT27 : 1; + __IM uint32_t RESERVED : 4; + } FACT_B; + }; + + __IM uint32_t RESERVED5[8]; + + CAN_FilterRegister_T sFilterRegister[28]; + +} CAN_T; + +/** + * @brief I2C register (I2C) + */ +typedef struct +{ + /** @brief Control register 1 */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t I2CEN : 1; + __IOM uint32_t SMBEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t SMBTCFG : 1; + __IOM uint32_t ARPEN : 1; + __IOM uint32_t PECEN : 1; + __IOM uint32_t SRBEN : 1; + __IOM uint32_t CLKSTRETCHD : 1; + __IOM uint32_t START : 1; + __IOM uint32_t STOP : 1; + __IOM uint32_t ACKEN : 1; + __IOM uint32_t ACKPOS : 1; + __IOM uint32_t PEC : 1; + __IOM uint32_t ALERTEN : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t SWRST : 1; + __IM uint32_t RESERVED3 : 16; + } CTRL1_B; + } ; + + /** @brief Control register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t CLKFCFG : 6; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t EVIEN : 1; + __IOM uint32_t BUFIEN : 1; + __IOM uint32_t DMAEN : 1; + __IOM uint32_t LTCFG : 1; + __IM uint32_t RESERVED2 : 19; + } CTRL2_B; + } ; + + /** @brief Slave machine address register 1 */ + union + { + __IOM uint32_t SADDR1; + + struct + { + __IOM uint32_t ADDR0 : 1; + __IOM uint32_t ADDR1_7 : 7; + __IOM uint32_t ADDR8_9 : 2; + __IM uint32_t RESERVED1 : 5; + __IOM uint32_t ADDRLEN : 1; + __IM uint32_t RESERVED2 : 16; + } SADDR1_B; + }; + + /** @brief Slave machine address register 2 */ + union + { + __IOM uint32_t SADDR2; + + struct + { + __IOM uint32_t ADDRNUM : 1; + __IOM uint32_t ADDR2 : 7; + __IM uint32_t RESERVED : 24; + } SADDR2_B; + }; + + /** @brief Cache data register */ + union + { + __IOM uint32_t DATA; + + struct + { + __IOM uint32_t DATA : 8; + __IM uint32_t RESERVED : 24; + } DATA_B; + }; + + /** @brief Status register 1 */ + union + { + __IOM uint32_t STS1; + + struct + { + __IM uint32_t STARTFLG : 1; + __IM uint32_t ADDRFLG : 1; + __IM uint32_t BTCFLG : 1; + __IM uint32_t ADDR10FLG : 1; + __IM uint32_t STOPFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IM uint32_t RXBNEFLG : 1; + __IM uint32_t TXBEFLG : 1; + __IOM uint32_t BERRFLG : 1; + __IOM uint32_t ALFLG : 1; + __IOM uint32_t AEFLG : 1; + __IOM uint32_t OVRURFLG : 1; + __IOM uint32_t PECEFLG : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t TTEFLG : 1; + __IOM uint32_t SMBALTFLG : 1; + __IM uint32_t RESERVED3 : 16; + } STS1_B; + }; + + /** @brief Status register 2 */ + union + { + __IOM uint32_t STS2; + + struct + { + __IM uint32_t MSFLG : 1; + __IM uint32_t BUSBSYFLG : 1; + __IM uint32_t TRFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IM uint32_t GENCALLFLG : 1; + __IM uint32_t SMBDADDRFLG : 1; + __IM uint32_t SMMHADDR : 1; + __IM uint32_t DUALADDRFLG : 1; + __IM uint32_t PECVALUE : 8; + __IM uint32_t RESERVED2 : 16; + } STS2_B; + }; + + /** @brief Clock control register */ + union + { + __IOM uint32_t CLKCTRL; + + struct + { + __IOM uint32_t CLKS : 12; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t FDUTYCFG : 1; + __IOM uint32_t SPEEDCFG : 1; + __IM uint32_t RESERVED2 : 16; + } CLKCTRL_B; + }; + + /** @brief Maximum rise time */ + union + { + __IOM uint32_t RISETMAX; + + struct + { + __IOM uint32_t RISETMAX : 6; + __IM uint32_t RESERVED : 26; + } RISETMAX_B; + }; + + __IM uint32_t RESERVED[55]; + + /** @brief I2C Switching register */ + union + { + __IOM uint32_t I2C_SWITCH; + + struct + { + __IOM uint32_t I2C_SWITCH : 1; + __IM uint32_t RESERVED1 : 31; + } SWITCH_B; + }; +} I2C_T; + + +typedef struct +{ + __IOM uint16_t RDP; + __IOM uint16_t USER; + __IOM uint16_t Data0; + __IOM uint16_t Data1; + __IOM uint16_t WRP0; + __IOM uint16_t WRP1; + __IOM uint16_t WRP2; + __IOM uint16_t WRP3; +} OB_T; + +/** + * @brief Analog to Digital Converter(ADC) + */ +typedef struct +{ + + /* Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IOM uint32_t AWDFLG : 1; + __IOM uint32_t EOCFLG : 1; + __IOM uint32_t INJEOCFLG : 1; + __IOM uint32_t INJCSFLG : 1; + __IOM uint32_t REGCSFLG : 1; + __IM uint32_t RESERVED : 27; + } STS_B; + }; + + /* Control register1*/ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t AWDCHSEL : 5; + __IOM uint32_t EOCIEN : 1; + __IOM uint32_t AWDIEN : 1; + __IOM uint32_t INJEOCIEN : 1; + __IOM uint32_t SCANEN : 1; + __IOM uint32_t AWDSGLEN : 1; + __IOM uint32_t INJGACEN : 1; + __IOM uint32_t REGDISCEN : 1; + __IOM uint32_t INJDISCEN : 1; + __IOM uint32_t DISCNUMCFG : 3; + __IOM uint32_t DUALMCFG : 4; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t INJAWDEN : 1; + __IOM uint32_t REGAWDEN : 1; + __IM uint32_t RESERVED2 : 8; + } CTRL1_B; + }; + + /* Control register2*/ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t ADCEN : 1; + __IOM uint32_t CONTCEN : 1; + __IOM uint32_t CAL : 1; + __IOM uint32_t CALRST : 1; + __IM uint32_t RESERVED1 : 4; + __IOM uint32_t DMAEN : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t DALIGNCFG : 1; + __IOM uint32_t INJGEXTTRGSEL : 3; + __IOM uint32_t INJEXTTRGEN : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t REGEXTTRGSEL : 3; + __IOM uint32_t REGEXTTRGEN : 1; + __IOM uint32_t INJSWSC : 1; + __IOM uint32_t REGSWSC : 1; + __IOM uint32_t TSVREFEN : 1; + __IM uint32_t RESERVED4 : 8; + } CTRL2_B; + }; + + /* Sample time register1*/ + union + { + __IOM uint32_t SMPTIM1; + + struct + { + __IOM uint32_t SMPCYCCFG10 : 3; + __IOM uint32_t SMPCYCCFG11 : 3; + __IOM uint32_t SMPCYCCFG12 : 3; + __IOM uint32_t SMPCYCCFG13 : 3; + __IOM uint32_t SMPCYCCFG14 : 3; + __IOM uint32_t SMPCYCCFG15 : 3; + __IOM uint32_t SMPCYCCFG16 : 3; + __IOM uint32_t SMPCYCCFG17 : 3; + __IM uint32_t RESERVED : 8; + } SMPTIM1_B; + }; + + /* Sample time register2*/ + union + { + __IOM uint32_t SMPTIM2; + + struct + { + __IOM uint32_t SMPCYCCFG0 : 3; + __IOM uint32_t SMPCYCCFG1 : 3; + __IOM uint32_t SMPCYCCFG2 : 3; + __IOM uint32_t SMPCYCCFG3 : 3; + __IOM uint32_t SMPCYCCFG4 : 3; + __IOM uint32_t SMPCYCCFG5 : 3; + __IOM uint32_t SMPCYCCFG6 : 3; + __IOM uint32_t SMPCYCCFG7 : 3; + __IOM uint32_t SMPCYCCFG8 : 3; + __IOM uint32_t SMPCYCCFG9 : 3; + __IM uint32_t RESERVED : 2; + } SMPTIM2_B; + }; + + /* Injected channel Data offset register1*/ + union + { + __IOM uint32_t INJDOF1; + + struct + { + __IOM uint32_t INJDOF1 : 12; + __IM uint32_t RESERVED : 20; + } INJDOF1_B; + }; + + /* Injected channel Data offset register2*/ + union + { + __IOM uint32_t INJDOF2; + + struct + { + __IOM uint32_t INJDOF2 : 12; + __IM uint32_t RESERVED : 20; + } INJDOF2_B; + }; + + /* Injected channel Data offset register3*/ + union + { + __IOM uint32_t INJDOF3; + + struct + { + __IOM uint32_t INJDOF3 : 12; + __IM uint32_t RESERVED : 20; + } INJDOF3_B; + }; + + /* Injected channel Data offset register4*/ + union + { + __IOM uint32_t INJDOF4; + + struct + { + __IOM uint32_t INJDOF4 : 12; + __IM uint32_t RESERVED : 20; + } INJDOF4_B; + }; + + /* Analog watchdog high threshold register*/ + union + { + __IOM uint32_t AWDHT; + + struct + { + __IOM uint32_t AWDHT : 12; + __IM uint32_t RESERVED : 20; + } AWDHT_B; + }; + + /* Analog watchdog low threshold register*/ + union + { + __IOM uint32_t AWDLT; + + struct + { + __IOM uint32_t AWDLT : 12; + __IM uint32_t RESERVED : 20; + } AWDLT_B; + }; + + /* Regular channel sequence register1*/ + union + { + __IOM uint32_t REGSEQ1; + + struct + { + __IOM uint32_t REGSEQC13 : 5; + __IOM uint32_t REGSEQC14 : 5; + __IOM uint32_t REGSEQC15 : 5; + __IOM uint32_t REGSEQC16 : 5; + __IOM uint32_t REGSEQLEN : 4; + __IM uint32_t RESERVED : 8; + } REGSEQ1_B; + }; + + /* Regular channel sequence register2*/ + union + { + __IOM uint32_t REGSEQ2; + + struct + { + __IOM uint32_t REGSEQC7 : 5; + __IOM uint32_t REGSEQC8 : 5; + __IOM uint32_t REGSEQC9 : 5; + __IOM uint32_t REGSEQC10 : 5; + __IOM uint32_t REGSEQC11 : 5; + __IOM uint32_t REGSEQC12 : 5; + __IM uint32_t RESERVED : 2; + } REGSEQ2_B; + }; + + /* Regular channel sequence register3*/ + union + { + __IOM uint32_t REGSEQ3; + + struct + { + __IOM uint32_t REGSEQC1 : 5; + __IOM uint32_t REGSEQC2 : 5; + __IOM uint32_t REGSEQC3 : 5; + __IOM uint32_t REGSEQC4 : 5; + __IOM uint32_t REGSEQC5 : 5; + __IOM uint32_t REGSEQC6 : 5; + __IM uint32_t RESERVED : 2; + } REGSEQ3_B; + }; + + /* Injected sequence register*/ + union + { + __IOM uint32_t INJSEQ; + + struct + { + __IOM uint32_t INJSEQC1 : 5; + __IOM uint32_t INJSEQC2 : 5; + __IOM uint32_t INJSEQC3 : 5; + __IOM uint32_t INJSEQC4 : 5; + __IOM uint32_t INJSEQLEN : 2; + __IM uint32_t RESERVED : 10; + } INJSEQ_B; + }; + + /* Injected Data register1*/ + union + { + __IM uint32_t INJDATA1; + + struct + { + __IM uint32_t INJDATA : 16; + __IM uint32_t RESERVED : 16; + } INJDATA1_B; + }; + + /* Injected Data register2*/ + union + { + __IM uint32_t INJDATA2; + + struct + { + __IM uint32_t INJDATA : 16; + __IM uint32_t RESERVED : 16; + } INJDATA2_B; + }; + + /* Injected Data register3*/ + union + { + __IM uint32_t INJDATA3; + + struct + { + __IM uint32_t INJDATA : 16; + __IM uint32_t RESERVED : 16; + } INJDATA3_B; + }; + + /* Injected Data register4*/ + union + { + __IM uint32_t INJDATA4; + + struct + { + __IM uint32_t INJDATA : 16; + __IM uint32_t RESERVED : 16; + } INJDATA4_B; + }; + + /* Regular Data register*/ + union + { + __IOM uint32_t REGDATA; + + struct + { + __IM uint32_t REGDATA : 16; + __IM uint32_t ADC2DATA : 16; + } REGDATA_B; + }; +}ADC_T; + +/** + * @brief External Interrupt(EINT) + */ +typedef struct +{ + /* Interrupt mask register */ + union + { + __IOM uint32_t IMASK; + + struct + { + __IOM uint32_t IMASK0 : 1; + __IOM uint32_t IMASK1 : 1; + __IOM uint32_t IMASK2 : 1; + __IOM uint32_t IMASK3 : 1; + __IOM uint32_t IMASK4 : 1; + __IOM uint32_t IMASK5 : 1; + __IOM uint32_t IMASK6 : 1; + __IOM uint32_t IMASK7 : 1; + __IOM uint32_t IMASK8 : 1; + __IOM uint32_t IMASK9 : 1; + __IOM uint32_t IMASK10 : 1; + __IOM uint32_t IMASK11 : 1; + __IOM uint32_t IMASK12 : 1; + __IOM uint32_t IMASK13 : 1; + __IOM uint32_t IMASK14 : 1; + __IOM uint32_t IMASK15 : 1; + __IOM uint32_t IMASK16 : 1; + __IOM uint32_t IMASK17 : 1; + __IOM uint32_t IMASK18 : 1; + __IM uint32_t RESERVED : 13; + } IMASK_B; + }; + + /* Event mask register */ + union + { + __IOM uint32_t EMASK; + + struct + { + __IOM uint32_t EMASK0 : 1; + __IOM uint32_t EMASK1 : 1; + __IOM uint32_t EMASK2 : 1; + __IOM uint32_t EMASK3 : 1; + __IOM uint32_t EMASK4 : 1; + __IOM uint32_t EMASK5 : 1; + __IOM uint32_t EMASK6 : 1; + __IOM uint32_t EMASK7 : 1; + __IOM uint32_t EMASK8 : 1; + __IOM uint32_t EMASK9 : 1; + __IOM uint32_t EMASK10 : 1; + __IOM uint32_t EMASK11 : 1; + __IOM uint32_t EMASK12 : 1; + __IOM uint32_t EMASK13 : 1; + __IOM uint32_t EMASK14 : 1; + __IOM uint32_t EMASK15 : 1; + __IOM uint32_t EMASK16 : 1; + __IOM uint32_t EMASK17 : 1; + __IOM uint32_t EMASK18 : 1; + __IM uint32_t RESERVED : 13; + } EEN_B; + }; + + /* Rising Trigger Event Enable register */ + union + { + __IOM uint32_t RTEN; + + struct + { + __IOM uint32_t PTEN0 : 1; + __IOM uint32_t PTEN1 : 1; + __IOM uint32_t PTEN2 : 1; + __IOM uint32_t PTEN3 : 1; + __IOM uint32_t PTEN4 : 1; + __IOM uint32_t PTEN5 : 1; + __IOM uint32_t PTEN6 : 1; + __IOM uint32_t PTEN7 : 1; + __IOM uint32_t PTEN8 : 1; + __IOM uint32_t PTEN9 : 1; + __IOM uint32_t PTEN10 : 1; + __IOM uint32_t PTEN11 : 1; + __IOM uint32_t PTEN12 : 1; + __IOM uint32_t PTEN13 : 1; + __IOM uint32_t PTEN14 : 1; + __IOM uint32_t PTEN15 : 1; + __IOM uint32_t PTEN16 : 1; + __IOM uint32_t PTEN17 : 1; + __IOM uint32_t PTEN18 : 1; + __IM uint32_t RESERVED : 13; + } RTEN_B; + }; + + /* Falling Trigger Event Enable register */ + union + { + __IOM uint32_t FTEN; + + struct + { + __IOM uint32_t FTEN0 : 1; + __IOM uint32_t FTEN1 : 1; + __IOM uint32_t FTEN2 : 1; + __IOM uint32_t FTEN3 : 1; + __IOM uint32_t FTEN4 : 1; + __IOM uint32_t FTEN5 : 1; + __IOM uint32_t FTEN6 : 1; + __IOM uint32_t FTEN7 : 1; + __IOM uint32_t FTEN8 : 1; + __IOM uint32_t FTEN9 : 1; + __IOM uint32_t FTEN10 : 1; + __IOM uint32_t FTEN11 : 1; + __IOM uint32_t FTEN12 : 1; + __IOM uint32_t FTEN13 : 1; + __IOM uint32_t FTEN14 : 1; + __IOM uint32_t FTEN15 : 1; + __IOM uint32_t FTEN16 : 1; + __IOM uint32_t FTEN17 : 1; + __IOM uint32_t FTEN18 : 1; + __IM uint32_t RESERVED : 13; + } FTEN_B; + }; + + /* Software Interrupt Enable register */ + union + { + __IOM uint32_t SWINTE; + + struct + { + __IOM uint32_t SWINTE0 : 1; + __IOM uint32_t SWINTE1 : 1; + __IOM uint32_t SWINTE2 : 1; + __IOM uint32_t SWINTE3 : 1; + __IOM uint32_t SWINTE4 : 1; + __IOM uint32_t SWINTE5 : 1; + __IOM uint32_t SWINTE6 : 1; + __IOM uint32_t SWINTE7 : 1; + __IOM uint32_t SWINTE8 : 1; + __IOM uint32_t SWINTE9 : 1; + __IOM uint32_t SWINTE10 : 1; + __IOM uint32_t SWINTE11 : 1; + __IOM uint32_t SWINTE12 : 1; + __IOM uint32_t SWINTE13 : 1; + __IOM uint32_t SWINTE14 : 1; + __IOM uint32_t SWINTE15 : 1; + __IOM uint32_t SWINTE16 : 1; + __IOM uint32_t SWINTE17 : 1; + __IOM uint32_t SWINTE18 : 1; + __IM uint32_t RESERVED : 13; + } SWINTE_B; + }; + + /* Interrupt Flag Enable register */ + union + { + __IOM uint32_t IPEND; + + struct + { + __IOM uint32_t IPEND0 : 1; + __IOM uint32_t IPEND1 : 1; + __IOM uint32_t IPEND2 : 1; + __IOM uint32_t IPEND3 : 1; + __IOM uint32_t IPEND4 : 1; + __IOM uint32_t IPEND5 : 1; + __IOM uint32_t IPEND6 : 1; + __IOM uint32_t IPEND7 : 1; + __IOM uint32_t IPEND8 : 1; + __IOM uint32_t IPEND9 : 1; + __IOM uint32_t IPEND10 : 1; + __IOM uint32_t IPEND11 : 1; + __IOM uint32_t IPEND12 : 1; + __IOM uint32_t IPEND13 : 1; + __IOM uint32_t IPEND14 : 1; + __IOM uint32_t IPEND15 : 1; + __IOM uint32_t IPEND16 : 1; + __IOM uint32_t IPEND17 : 1; + __IOM uint32_t IPEND18 : 1; + __IM uint32_t RESERVED : 13; + } IF_B; + }; +}EINT_T; + +/** + * @brief Independent watchdog(IWDT) + */ +typedef struct +{ + + /* Keyword register */ + union + { + __OM uint32_t KEY; + + struct + { + __OM uint32_t KEY : 16; + __IM uint32_t RESERVED : 16; + } KEY_B; + }; + + /* Frequency Divider register */ + union + { + __IOM uint32_t PSC; + + struct + { + __IOM uint32_t PSC : 3; + __IM uint32_t RESERVED : 29; + } DIV_B; + }; + + /* Reload values register */ + union + { + __IOM uint32_t CNTRLD; + + struct + { + __IOM uint32_t CNTRLD : 12; + __IM uint32_t RESERVED : 20; + } CNTRLD_B; + }; + + /* Status register */ + union + { + __IM uint32_t STS; + + struct + { + __IM uint32_t PSCUFLG : 1; + __IM uint32_t CNTUFLG : 1; + __IM uint32_t RESERVED : 30; + } STS_B; + }; +}IWDT_T; + +/** + * @brief Serial peripheral interface(SPI) + */ +typedef struct +{ + /* Control register 1 */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t CPHA : 1; + __IOM uint32_t CPOL : 1; + __IOM uint32_t MSMCFG : 1; + __IOM uint32_t BRSEL : 3; + __IOM uint32_t SPIEN : 1; + __IOM uint32_t LSBSEL : 1; + __IOM uint32_t ISSEL : 1; + __IOM uint32_t SSEN : 1; + __IOM uint32_t RXOMEN : 1; + __IOM uint32_t DFLSEL : 1; + __IOM uint32_t CRCNXT : 1; + __IOM uint32_t CRCEN : 1; + __IOM uint32_t BMOEN : 1; + __IOM uint32_t BMEN : 1; + __IM uint32_t RESERVED : 16; + } CTRL1_B; + }; + + /* Control register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t RXDEN : 1; + __IOM uint32_t TXDEN : 1; + __IOM uint32_t SSOEN : 1; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t RXBNEIEN : 1; + __IOM uint32_t TXBEIEN : 1; + __IM uint32_t RESERVED2 : 24; + } CTRL2_B; + }; + + /* Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IM uint32_t RXBNEFLG : 1; + __IM uint32_t TXBEFLG : 1; + __IM uint32_t SCHDIR : 1; + __IM uint32_t UDRFLG : 1; + __IOM uint32_t CRCEFLG : 1; + __IM uint32_t MEFLG : 1; + __IM uint32_t OVRFLG : 1; + __IM uint32_t BSYFLG : 1; + __IM uint32_t RESERVED : 24; + } STS_B; + }; + + /* Data register */ + union + { + __IOM uint32_t DATA; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA_B; + }; + + /* CRC polynomial register */ + union + { + __IOM uint32_t CRCPOLY; + + struct + { + __IOM uint32_t CRCPOLY : 16; + __IM uint32_t RESERVED : 16; + } CRCPOLY_B; + }; + + /* Receive CRC register */ + union + { + __IM uint32_t RXCRC; + + struct + { + __IM uint32_t RXCRC : 16; + __IM uint32_t RESERVED : 16; + }RXCRC_B; + }; + + /* Transmit CRC register */ + union + { + __IM uint32_t TXCRC; + + struct + { + __IM uint32_t TXCRC : 16; + __IM uint32_t RESERVED : 16; + }TXCRC_B; + }; + + /* Transmit I2S CTRL register */ + union + { + __IOM uint32_t I2SCFG; + + struct + { + __IOM uint32_t CHLEN : 1; + __IOM uint32_t DATLEN : 2; + __IOM uint32_t CPOL : 1; + __IOM uint32_t I2SSSEL : 2; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t PFSSEL : 1; + __IOM uint32_t I2SMOD : 2; + __IOM uint32_t I2SEN : 1; + __IOM uint32_t MODESEL : 1; + __IM uint32_t RESERVED2 : 20; + }I2SCFG_B; + }; + + /* Transmit I2S DIV register */ + union + { + __IOM uint32_t I2SPSC; + + struct + { + __IOM uint32_t I2SPSC : 8; + __IOM uint32_t ODDPSC : 1; + __IOM uint32_t MCIEN : 1; + __IM uint32_t RESERVED1 : 22; + }I2SPSC_B; + }; +}SPI_T; + +/** + * @brief Window watchdog (WWDT) + */ +typedef struct +{ + + /* Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t CNT : 7; + __IOM uint32_t WWDTEN : 1; + __IM uint32_t RESERVED : 24; + } CTRL_B; + }; + + /* Configure register */ + union + { + __IOM uint32_t CFG; + + struct + { + __IOM uint32_t WIN : 7; + __IOM uint32_t TBPSC : 2; + __IOM uint32_t EWIEN : 1; + __IM uint32_t RESERVED : 22; + } CFG_B; + }; + + /* Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IOM uint32_t EWIFLG : 1; + __IM uint32_t RESERVED : 31; + } STS_B; + }; +}WWDT_T; + +/** + * @brief Secure digital input/output interface (SDIO) + */ +typedef struct +{ + /* Power control register */ + union + { + __IOM uint32_t PWRCTRL; + + struct + { + __IOM uint32_t PWRCTRL : 2; + __IM uint32_t RESERVED : 30; + } PWRCTRL_B; + }; + + /* Clock control register */ + union + { + __IOM uint32_t CLKCTRL; + + struct + { + __IOM uint32_t CLKDIV : 8; + __IOM uint32_t CLKEN : 1; + __IOM uint32_t PWRSAV : 1; + __IOM uint32_t BYPASSEN : 1; + __IOM uint32_t WBSEL : 2; + __IOM uint32_t DEPSEL : 1; + __IOM uint32_t HFCEN : 1; + __IM uint32_t RESERVED : 17; + } CLKCTRL_B; + }; + + /* Argument register */ + union + { + __IOM uint32_t ARG; + + struct + { + __IOM uint32_t CMDARG : 32; + } ARG_B; + }; + + /* Command register */ + union + { + __IOM uint32_t CMD; + + struct + { + __IOM uint32_t CMDINDEX : 6; + __IOM uint32_t WAITRES : 2; + __IOM uint32_t WAITINT : 1; + __IOM uint32_t WENDDATA : 1; + __IOM uint32_t CPSMEN : 1; + __IOM uint32_t SDIOSC : 1; + __IOM uint32_t CMDCPEN : 1; + __IOM uint32_t INTEN : 1; + __IOM uint32_t ATACMD : 1; + __IM uint32_t RESERVED : 17; + } CMD_B; + }; + + /* Command response register */ + union + { + __IM uint32_t CMDRES; + + struct + { + __IM uint32_t CMDRES : 6; + __IM uint32_t RESERVED : 26; + } CMDRES_B; + }; + + /* SDIO response register1 */ + union + { + __IM uint32_t RES1; + + struct + { + __IM uint32_t CARDSTS1 : 32; + } RES1_B; + }; + + /* SDIO response register2 */ + union + { + __IM uint32_t RES2; + + struct + { + __IM uint32_t CARDSTS2 : 32; + } RES2_B; + }; + + /* SDIO response register3 */ + union + { + __IM uint32_t RES3; + + struct + { + __IM uint32_t CARDSTS3 : 32; + } RES3_B; + }; + + /* SDIO response register4 */ + union + { + __IM uint32_t RES4; + + struct + { + __IM uint32_t CARDSTS4 : 32; + } RES4_B; + }; + + /* Data timer register */ + union + { + __IOM uint32_t DATATIME; + + struct + { + __IOM uint32_t DATATIME : 32; + } DTMR_B; + }; + + /* Data length register */ + union + { + __IOM uint32_t DATALEN; + + struct + { + __IOM uint32_t DATALEN : 25; + __IM uint32_t RESERVED : 7; + } DLEN_B; + }; + + /* Data control register */ + union + { + __IOM uint32_t DCTRL; + + struct + { + __IOM uint32_t DTEN : 1; + __IOM uint32_t DTDRCFG : 1; + __IOM uint32_t DTSEL : 1; + __IOM uint32_t DMAEN : 1; + __IOM uint32_t DBSIZE : 4; + __IOM uint32_t RWSTR : 1; + __IOM uint32_t PWSTOP : 1; + __IOM uint32_t RDWAIT : 1; + __IOM uint32_t SDIOF : 1; + __IM uint32_t RESERVED : 20; + } DCTRL_B; + }; + + /* Data count register */ + union + { + __IM uint32_t DCNT; + + struct + { + __IM uint32_t DATACNT : 25; + __IM uint32_t RESERVED : 7; + } DCNT_B; + }; + + /* SDIO status register */ + union + { + __IM uint32_t STS; + + struct + { + __IM uint32_t COMRESP : 1; + __IM uint32_t DBDR : 1; + __IM uint32_t CMDRESTO : 1; + __IM uint32_t DATATO : 1; + __IM uint32_t TXUDRER : 1; + __IM uint32_t RXOVRER : 1; + __IM uint32_t CMDRES : 1; + __IM uint32_t CMDSENT : 1; + __IM uint32_t DATAEND : 1; + __IM uint32_t SBE : 1; + __IM uint32_t DBCP : 1; + __IM uint32_t CMDACT : 1; + __IM uint32_t TXACT : 1; + __IM uint32_t RXACT : 1; + __IM uint32_t TXFHF : 1; + __IM uint32_t RXFHF : 1; + __IM uint32_t TXFF : 1; + __IM uint32_t RXFF : 1; + __IM uint32_t TXFE : 1; + __IM uint32_t RXFE : 1; + __IM uint32_t TXDA : 1; + __IM uint32_t RXDA : 1; + __IM uint32_t SDIOINT : 1; + __IM uint32_t ATAEND : 1; + __IM uint32_t RESERVED : 8; + } STS_B; + }; + + /* SDIO interrupt clear register */ + union + { + __IOM uint32_t ICF; + + struct + { + __IOM uint32_t DBCE : 1; + __IOM uint32_t CRCE : 1; + __IOM uint32_t CRTO : 1; + __IOM uint32_t DTO : 1; + __IOM uint32_t TXFUE : 1; + __IOM uint32_t RXFOE : 1; + __IOM uint32_t CMDRES : 1; + __IOM uint32_t CMDSENT : 1; + __IOM uint32_t DATAEND : 1; + __IOM uint32_t SBE : 1; + __IOM uint32_t DBCP : 1; + __IM uint32_t RESERVED1 : 11; + __IOM uint32_t SDIOIT : 1; + __IOM uint32_t ATAEND : 1; + __IM uint32_t RESERVED2 : 8; + } ICF_B; + }; + + /* SDIO interrupt mask register */ + union + { + __IOM uint32_t MASK; + + struct + { + __IOM uint32_t CCRCFAIL : 1; + __IOM uint32_t DCRCFAIL : 1; + __IOM uint32_t CMDTO : 1; + __IOM uint32_t DATATO : 1; + __IOM uint32_t TXURER : 1; + __IOM uint32_t RXORER : 1; + __IOM uint32_t CMDRESRC : 1; + __IOM uint32_t CMDSENT : 1; + __IOM uint32_t DATAEND : 1; + __IOM uint32_t STRTER : 1; + __IOM uint32_t DBEND : 1; + __IOM uint32_t CMDACT : 1; + __IOM uint32_t TXACT : 1; + __IOM uint32_t RXACT : 1; + __IOM uint32_t TXHFERT : 1; + __IOM uint32_t RXHFFUL : 1; + __IOM uint32_t TXFUL : 1; + __IOM uint32_t RXFUL : 1; + __IOM uint32_t TXEPT : 1; + __IOM uint32_t RXFEIE : 1; + __IOM uint32_t TXDAVB : 1; + __IOM uint32_t RXDAVB : 1; + __IOM uint32_t SDIOINTREC : 1; + __IOM uint32_t ATACLPREC : 1; + __IM uint32_t RESERVEDIE : 8; + } MASK_B; + }; + + __IM uint32_t RESERVED[2]; + + /* SDIO FIFO count register */ + union + { + __IM uint32_t FIFOCNT; + + struct + { + __IM uint32_t FIFOCNT : 24; + __IM uint32_t RESERVED : 8; + } FIFOCNT_B; + }; + + __IM uint32_t RESERVED1[13]; + + /* SDIO data FIFO register */ + union + { + __IOM uint32_t FIFODATA; + + struct + { + __IOM uint32_t FIFODATA : 32; + } FIFODATA_B; + }; +}SDIO_T; + +/** + * @brief Digital to Analog Converter(DAC) + */ +typedef struct +{ + /* Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t ENCH1 : 1; + __IOM uint32_t BUFFDCH1 : 1; + __IOM uint32_t TRGENCH1 : 1; + __IOM uint32_t TRGSELCH1 : 3; + __IOM uint32_t WAVENCH1 : 2; + __IOM uint32_t MAMPSELCH1 : 4; + __IOM uint32_t DMAENCH1 : 1; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t ENCH2 : 1; + __IOM uint32_t BUFFDCH2 : 1; + __IOM uint32_t TRGENCH2 : 1; + __IOM uint32_t TRGSELCH2 : 3; + __IOM uint32_t WAVENCH2 : 2; + __IOM uint32_t MAMPSELCH2 : 4; + __IOM uint32_t DMAENCH2 : 1; + __IM uint32_t RESERVED2 : 3; + } CTRL_B; + }; + + /* Software trigger register */ + union + { + __IOM uint32_t SWTRG; + + struct + { + __IOM uint32_t SWTRG1 : 1; + __IOM uint32_t SWTRG2 : 1; + __IM uint32_t RESERVED : 30; + } SWTRG_B; + }; + + /* Channel1 12-bit right-aligned register */ + union + { + __IOM uint32_t DH12R1; + + struct + { + __IOM uint32_t DATA : 12; + __IM uint32_t RESERVED : 20; + } DH12R1_B; + }; + + /* Channel1 12-bit left-aligned register */ + union + { + __IOM uint32_t DH12L1; + + struct + { + __IM uint32_t RESERVED1 : 4; + __IOM uint32_t DATA : 12; + __IM uint32_t RESERVED2 : 16; + } DH12L1_B; + }; + + /* Channel1 8-bit right-aligned register */ + union + { + __IOM uint32_t DH8R1; + + struct + { + __IOM uint32_t DATA : 8; + __IM uint32_t RESERVED : 24; + } DH8R1_B; + }; + + /* Channel2 12-bit right-aligned register */ + union + { + __IOM uint32_t DH12R2; + + struct + { + __IOM uint32_t DATA : 12; + __IM uint32_t RESERVED : 20; + } DH12R2_B; + }; + + /* Channel2 12-bit left-aligned register */ + union + { + __IOM uint32_t DH12L2; + + struct + { + __IM uint32_t RESERVED1 : 4; + __IOM uint32_t DATA : 12; + __IM uint32_t RESERVED2 : 16; + }DH12L2_B; + }; + + /* Channel2 8-bit right-aligned register */ + union + { + __IOM uint32_t DH8R2; + + struct + { + __IOM uint32_t DATA : 8; + __IM uint32_t RESERVED : 24; + } DH8R2_B; + }; + + /* Channel1,Channel2 12-bit right-aligned register */ + union + { + __IOM uint32_t DH12RDUAL; + + struct + { + __IOM uint32_t DATACH1 : 12; + __IM uint32_t RESERVED1 : 4; + __IOM uint32_t DATACH2 : 12; + __IM uint32_t RESERVED2 : 4; + } DH12RDUAL_B; + }; + + /* Channel1,Channel2 12-bit left-aligned register */ + union + { + __IOM uint32_t DH12LDUAL; + + struct + { + __IM uint32_t RESERVED1 : 4; + __IOM uint32_t DATACH1 : 12; + __IM uint32_t RESERVED2 : 4; + __IOM uint32_t DATACH2 : 12; + } DH12LDUAL_B; + }; + + /* Channel1,Channel2 8-bit right-aligned register */ + union + { + __IOM uint32_t DH8RDUAL; + + struct + { + __IOM uint32_t CH1DH : 8; + __IOM uint32_t CH2DH : 8; + __IM uint32_t RESERVED : 16; + } DH8RDUAL_B; + }; + + /* Channel1 data output register */ + union + { + __IOM uint32_t DATAOCH1; + + struct + { + __IOM uint32_t DATA : 12; + __IM uint32_t RESERVED : 20; + } DATAOCH1_B; + }; + + /* Channel2 data output register */ + union + { + __IOM uint32_t DATAOCH2; + + struct + { + __IOM uint32_t DATA : 12; + __IM uint32_t RESERVED : 20; + } DATAOCH2_B; + }; +}DAC_T; + +/** + * @brief Static Memory Controller (SMC) Bank1 + */ +typedef struct +{ + /* SRAM/NOR-Flash chip-select control register 1 */ + union + { + __IOM uint32_t CSCTRL1; + + struct + { + __IOM uint32_t MBKEN : 1; + __IOM uint32_t ADMUXEN : 1; + __IOM uint32_t MTYPECFG : 2; + __IOM uint32_t MDBWIDCFG : 2; + __IOM uint32_t NORFMACCEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t BURSTEN : 1; + __IOM uint32_t WSPOLCFG : 1; + __IOM uint32_t WRAPBEN : 1; + __IOM uint32_t WTIMCFG : 1; + __IOM uint32_t WREN : 1; + __IOM uint32_t WAITEN : 1; + __IOM uint32_t EXTMODEEN : 1; + __IOM uint32_t WSASYNCEN : 1; + __IOM uint32_t CRAMPSIZECFG : 3; + __IOM uint32_t WRBURSTEN : 1; + __IM uint32_t RESERVED2 : 12; + } CSCTRL1_B; + }; + + /* SRAM/NOR-Flash chip-select timing register 1 */ + union + { + __IOM uint32_t CSTIM1; + + struct + { + __IOM uint32_t ADDRSETCFG : 4; + __IOM uint32_t ADDRHLDCFG : 4; + __IOM uint32_t DATASETCFG : 8; + __IOM uint32_t BUSTURNCFG : 4; + __IOM uint32_t CLKDIVCFG : 4; + __IOM uint32_t DATALATCFG : 4; + __IOM uint32_t ASYNCACCCFG : 2; + __IM uint32_t RESERVED : 2; + } CSTIM1_B; + }; + + /* SRAM/NOR-Flash chip-select control register 2 */ + union + { + __IOM uint32_t CSCTRL2; + + struct + { + __IOM uint32_t MBKEN : 1; + __IOM uint32_t ADMUXEN : 1; + __IOM uint32_t MTYPECFG : 2; + __IOM uint32_t MDBWIDCFG : 2; + __IOM uint32_t NORFMACCEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t BURSTEN : 1; + __IOM uint32_t WSPOLCFG : 1; + __IOM uint32_t WRAPBEN : 1; + __IOM uint32_t WTIMCFG : 1; + __IOM uint32_t WREN : 1; + __IOM uint32_t WAITEN : 1; + __IOM uint32_t EXTMODEEN : 1; + __IOM uint32_t WSASYNCEN : 1; + __IOM uint32_t CRAMPSIZECFG : 3; + __IOM uint32_t WRBURSTEN : 1; + __IM uint32_t RESERVED2 : 12; + } CSCTRL2_B; + }; + + /* SRAM/NOR-Flash chip-select timing register 2 */ + union + { + __IOM uint32_t CSTIM2; + + struct + { + __IOM uint32_t ADDRSETCFG : 4; + __IOM uint32_t ADDRHLDCFG : 4; + __IOM uint32_t DATASETCFG : 8; + __IOM uint32_t BUSTURNCFG : 4; + __IOM uint32_t CLKDIVCFG : 4; + __IOM uint32_t DATALATCFG : 4; + __IOM uint32_t ASYNCACCCFG : 2; + __IM uint32_t RESERVED : 2; + } CSTIM2_B; + }; + + /* SRAM/NOR-Flash chip-select control register 3 */ + union + { + __IOM uint32_t CSCTRL3; + + struct + { + __IOM uint32_t MBKEN : 1; + __IOM uint32_t ADMUXEN : 1; + __IOM uint32_t MTYPECFG : 2; + __IOM uint32_t MDBWIDCFG : 2; + __IOM uint32_t NORFMACCEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t BURSTEN : 1; + __IOM uint32_t WSPOLCFG : 1; + __IOM uint32_t WRAPBEN : 1; + __IOM uint32_t WTIMCFG : 1; + __IOM uint32_t WREN : 1; + __IOM uint32_t WAITEN : 1; + __IOM uint32_t EXTMODEEN : 1; + __IOM uint32_t WSASYNCEN : 1; + __IOM uint32_t CRAMPSIZECFG : 3; + __IOM uint32_t WRBURSTEN : 1; + __IM uint32_t RESERVED2 : 12; + } CSCTRL3_B; + }; + + /* SRAM/NOR-Flash chip-select timing register 3 */ + union + { + __IOM uint32_t CSTIM3; + + struct + { + __IOM uint32_t ADDRSETCFG : 4; + __IOM uint32_t ADDRHLDCFG : 4; + __IOM uint32_t DATASETCFG : 8; + __IOM uint32_t BUSTURNCFG : 4; + __IOM uint32_t CLKDIVCFG : 4; + __IOM uint32_t DATALATCFG : 4; + __IOM uint32_t ASYNCACCCFG : 2; + __IM uint32_t RESERVED : 2; + } CSTIM3_B; + }; + + /* SRAM/NOR-Flash chip-select control register 4 */ + union + { + __IOM uint32_t CSCTRL4; + + struct + { + __IOM uint32_t MBKEN : 1; + __IOM uint32_t ADMUXEN : 1; + __IOM uint32_t MTYPECFG : 2; + __IOM uint32_t MDBWIDCFG : 2; + __IOM uint32_t NORFMACCEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t BURSTEN : 1; + __IOM uint32_t WSPOLCFG : 1; + __IOM uint32_t WRAPBEN : 1; + __IOM uint32_t WTIMCFG : 1; + __IOM uint32_t WREN : 1; + __IOM uint32_t WAITEN : 1; + __IOM uint32_t EXTMODEEN : 1; + __IOM uint32_t WSASYNCEN : 1; + __IOM uint32_t CRAMPSIZECFG : 3; + __IOM uint32_t WRBURSTEN : 1; + __IM uint32_t RESERVED2 : 12; + } CSCTRL4_B; + }; + + /* SRAM/NOR-Flash chip-select timing register 4 */ + union + { + __IOM uint32_t CSTIM4; + + struct + { + __IOM uint32_t ADDRSETCFG : 4; + __IOM uint32_t ADDRHLDCFG : 4; + __IOM uint32_t DATASETCFG : 8; + __IOM uint32_t BUSTURNCFG : 4; + __IOM uint32_t CLKDIVCFG : 4; + __IOM uint32_t DATALATCFG : 4; + __IOM uint32_t ASYNCACCCFG : 2; + __IM uint32_t RESERVED : 2; + } CSTIM4_B; + }; +} SMC_Bank1_T; + +/** + * @brief Static Memory Controller (SMC) Bank1E + */ +typedef struct +{ + /* SRAM/NOR-Flash write timing registers 1 */ + union + { + __IOM uint32_t WRTTIM1; + + struct + { + __IOM uint32_t ADDRSETCFG : 4; + __IOM uint32_t ADDRHLDCFG : 4; + __IOM uint32_t DATASETCFG : 8; + __IOM uint32_t BUSTURNCFG : 4; + __IOM uint32_t CLKDIVCFG : 4; + __IOM uint32_t DATALATCFG : 4; + __IOM uint32_t ASYNCACCCFG : 2; + __IM uint32_t RESERVED : 2; + } WRTTIM1_B; + }; + + __IM uint32_t RESERVED; + + /* SRAM/NOR-Flash write timing registers 2 */ + union + { + __IOM uint32_t WRTTIM2; + + struct + { + __IOM uint32_t ADDRSETCFG : 4; + __IOM uint32_t ADDRHLDCFG : 4; + __IOM uint32_t DATASETCFG : 8; + __IOM uint32_t BUSTURNCFG : 4; + __IOM uint32_t CLKDIVCFG : 4; + __IOM uint32_t DATALATCFG : 4; + __IOM uint32_t ASYNCACCCFG : 2; + __IM uint32_t RESERVED : 2; + } WRTTIM2_B; + }; + + __IM uint32_t RESERVED1; + + /* SRAM/NOR-Flash write timing registers 3 */ + union + { + __IOM uint32_t WRTTIM3; + + struct + { + __IOM uint32_t ADDRSETCFG : 4; + __IOM uint32_t ADDRHLDCFG : 4; + __IOM uint32_t DATASETCFG : 8; + __IOM uint32_t BUSTURNCFG : 4; + __IOM uint32_t CLKDIVCFG : 4; + __IOM uint32_t DATALATCFG : 4; + __IOM uint32_t ASYNCACCCFG : 2; + __IM uint32_t RESERVED : 2; + } WRTTIM3_B; + }; + + __IOM uint32_t RESERVED2; + + /* SRAM/NOR-Flash write timing registers 4 */ + union + { + __IOM uint32_t WRTTIM4; + + struct + { + __IOM uint32_t ADDRSETCFG : 4; + __IOM uint32_t ADDRHLDCFG : 4; + __IOM uint32_t DATASETCFG : 8; + __IOM uint32_t BUSTURNCFG : 4; + __IOM uint32_t CLKDIVCFG : 4; + __IOM uint32_t DATALATCFG : 4; + __IOM uint32_t ASYNCACCCFG : 2; + __IM uint32_t RESERVED : 2; + } WRTTIM4_B; + }; +} SMC_Bank1E_T; + +/** + * @brief Static Memory Controller (SMC) Bank 2 + */ +typedef struct +{ + /* PC Card/NAND Flash control register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t WAITFEN : 1; + __IOM uint32_t MBKEN : 1; + __IOM uint32_t MTYPECFG : 1; + __IOM uint32_t DBWIDCFG : 2; + __IOM uint32_t ECCEN : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t C2RDCFG : 4; + __IOM uint32_t A2RDCFG : 4; + __IOM uint32_t ECCPSCFG : 3; + __IM uint32_t RESERVED3 : 12; + } CTRL2_B; + }; + + /* FIFO status and interrupt register 2 */ + union + { + __IOM uint32_t STSINT2; + + struct + { + __IOM uint32_t IREFLG : 1; + __IOM uint32_t IHLFLG : 1; + __IOM uint32_t IFEFLG : 1; + __IOM uint32_t IREDEN : 1; + __IOM uint32_t IHLDEN : 1; + __IOM uint32_t IFEDEN : 1; + __IM uint32_t FEFLG : 1; + __IM uint32_t RESERVED : 16; + } STSINT2_B; + }; + /* Common memory space timing register 2 */ + union + { + __IOM uint32_t CMSTIM2; + + struct + { + __IOM uint32_t SET2 : 8; + __IOM uint32_t WAIT2 : 8; + __IOM uint32_t HLD2 : 8; + __IOM uint32_t HIZ2 : 8; + } CMSTIM2_B; + }; + + /* Attribute memory space timing register 2 */ + union + { + __IOM uint32_t AMSTIM2; + + struct + { + __IOM uint32_t SET2 : 8; + __IOM uint32_t WAIT2 : 8; + __IOM uint32_t HLD2 : 8; + __IOM uint32_t HIZ2 : 8; + } AMSTIM2_B; + }; + + __IM uint32_t RESERVED; + + /* ECC result register 2 */ + union + { + __IM uint32_t ECCRS2; + + struct + { + __IM uint32_t ECCRS2 : 32; + } ECCRS2_B; + }; +} SMC_Bank2_T; + +/** + * @brief Flexible Static Memory Controller (SMC) Bank 3 + */ +typedef struct +{ + /* PC Card/NAND Flash control register 3 */ + union + { + __IOM uint32_t CTRL3; + + struct + { + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t WAITFEN : 1; + __IOM uint32_t MBKEN : 1; + __IOM uint32_t MTYPECFG : 1; + __IOM uint32_t DBWIDCFG : 2; + __IOM uint32_t ECCEN : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t C2RDCFG : 4; + __IOM uint32_t A2RDCFG : 4; + __IOM uint32_t ECCPSCFG : 3; + __IM uint32_t RESERVED3 : 12; + } CTRL3_B; + }; + + /* FIFO status and interrupt register 3 */ + union + { + __IOM uint32_t STSINT3; + + struct + { + __IOM uint32_t IREFLG : 1; + __IOM uint32_t IHLFLG : 1; + __IOM uint32_t IFEFLG : 1; + __IOM uint32_t IREDEN : 1; + __IOM uint32_t IHLDEN : 1; + __IOM uint32_t IFEDEN : 1; + __IM uint32_t FEFLG : 1; + __IM uint32_t RESERVED : 16; + } STSINT3_B; + }; + + /* Common memory space timing register 3 */ + union + { + __IOM uint32_t CMSTIM3; + + struct + { + __IOM uint32_t SET3 : 8; + __IOM uint32_t WAIT3 : 8; + __IOM uint32_t HLD3 : 8; + __IOM uint32_t HIZ3 : 8; + } CMSTIM3_B; + }; + + /* Attribute memory space timing register 3 */ + union + { + __IOM uint32_t AMSTIM3; + + struct + { + __IOM uint32_t SET3 : 8; + __IOM uint32_t WAIT3 : 8; + __IOM uint32_t HLD3 : 8; + __IOM uint32_t HIZ3 : 8; + } AMSTIM3_B; + }; + + __IM uint32_t RESERVED; + + /* ECC result register 3 */ + union + { + __IM uint32_t ECCRS3; + + struct + { + __IM uint32_t ECCRS3 : 32; + } ECCRS3_B; + }; +} SMC_Bank3_T; + +/** + * @brief Flexible Static Memory Controller (SMC) Bank 4 + */ +typedef struct +{ + /* PC Card/NAND Flash control register 4 */ + union + { + __IOM uint32_t CTRL4; + + struct + { + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t WAITFEN : 1; + __IOM uint32_t MBKEN : 1; + __IOM uint32_t MTYPECFG : 1; + __IOM uint32_t DBWIDCFG : 2; + __IOM uint32_t ECCEN : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t C2RDCFG : 4; + __IOM uint32_t A2RDCFG : 4; + __IOM uint32_t ECCPSCFG : 3; + __IM uint32_t RESERVED3 : 12; + } CTRL4_B; + }; + + /* FIFO status and interrupt register 4 */ + union + { + __IOM uint32_t STSINT4; + + struct + { + __IOM uint32_t IREFLG : 1; + __IOM uint32_t IHLFLG : 1; + __IOM uint32_t IFEFLG : 1; + __IOM uint32_t IREDEN : 1; + __IOM uint32_t IHLDEN : 1; + __IOM uint32_t IFEDEN : 1; + __IM uint32_t FEFLG : 1; + __IM uint32_t RESERVED : 16; + } STSINT4_B; + }; + + /* Common memory space timing register 4 */ + union + { + __IOM uint32_t CMSTIM4; + + struct + { + __IOM uint32_t SET4 : 8; + __IOM uint32_t WAIT4 : 8; + __IOM uint32_t HLD4 : 8; + __IOM uint32_t HIZ4 : 8; + } CMSTIM4_B; + }; + + /* Attribute memory space timing register 4 */ + union + { + __IOM uint32_t AMSTIM4; + + struct + { + __IOM uint32_t SET4 : 8; + __IOM uint32_t WAIT4 : 8; + __IOM uint32_t HLD4 : 8; + __IOM uint32_t HIZ4 : 8; + } AMSTIM4_B; + }; + + /* I/O space timing register 4 */ + union + { + __IOM uint32_t IOSTIM4; + + struct + { + __IOM uint32_t SET : 8; + __IOM uint32_t WAIT : 8; + __IOM uint32_t HLD : 8; + __IOM uint32_t HIZ : 8; + } IOSTIM4_B; + }; +} SMC_Bank4_T; + +/** + * @brief SEC Inter-integrated circuit (SCI2C) + */ +typedef struct +{ + /** @brief Control register 1 */ + union + { + __IOM uint32_t CTRL1; + struct + { + __IOM uint32_t MST : 1; + __IOM uint32_t SPD : 2; + __IOM uint32_t SAM : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t RSTAEN : 1; + __IOM uint32_t SLADIS : 1; + __IOM uint32_t DSA : 1; + __IOM uint32_t TFEIC : 1; + __IOM uint32_t RFFIE : 1; + __IOM uint32_t DSMA : 1; + __IM uint32_t RESERVED2 : 21; + }CTRL1_B; + }; + + /** @brief Master address register */ + union + { + __IOM uint32_t TARADDR; + struct + { + __IOM uint32_t ADDR : 10; + __IOM uint32_t STA : 1; + __IOM uint32_t GCEN : 1; + __IOM uint32_t MAM : 1; + __IM uint32_t RESERVED : 19; + }TARADDR_B; + }; + + /** @brief Slave address register */ + union + { + __IOM uint32_t SLAADDR; + struct + { + __IOM uint32_t ADDR : 10; + __IM uint32_t RESERVED : 22; + }SLAADDR_B; + }; + + /** @brief High speed master code register */ + union + { + __IOM uint32_t HSMC; + struct + { + __IOM uint32_t HSMC : 3; + __IM uint32_t RESERVED : 29; + }HSMC_B; + }; + + /** @brief Data register */ + union + { + __IOM uint32_t DATA; + struct + { + __IOM uint32_t DATA : 8; + __IOM uint32_t CMD : 1; + __IOM uint32_t STOP : 1; + __IM uint32_t RESERVED : 22; + }DATA_B; + }; + + /** @brief Standard speed clock high counter register */ + union + { + __IOM uint32_t SSCHC; + struct + { + __IOM uint32_t CNT : 16; + __IM uint32_t RESERVED : 16; + }SSCHC_B; + }; + + /** @brief Standard speed clock low counter register */ + union + { + __IOM uint32_t SSCLC; + struct + { + __IOM uint32_t CNT : 16; + __IM uint32_t RESERVED : 16; + }SSCLC_B; + }; + + /** @brief Fast speed clock high counter register */ + union + { + __IOM uint32_t FSCHC; + struct + { + __IOM uint32_t CNT : 16; + __IM uint32_t RESERVED : 16; + }FSCHC_B; + }; + + /** @brief Fast speed clock low counter register */ + union + { + __IOM uint32_t FSCLC; + struct + { + __IOM uint32_t CNT : 16; + __IM uint32_t RESERVED : 16; + }FSCLC_B; + }; + + /** @brief High speed clock high counter */ + union + { + __IOM uint32_t HSCHC; + struct + { + __IOM uint32_t CNT : 16; + __IM uint32_t RESERVED : 16; + }HSCHC_B; + }; + + /** @brief High speed clock low counter register */ + union + { + __IOM uint32_t HSCLC; + struct + { + __IOM uint32_t CNT : 16; + __IM uint32_t RESERVED : 16; + }HSCLC_B; + }; + + /** @brief Interrupt status register */ + union + { + __IM uint32_t INTSTS; + struct + { + __IM uint32_t RFUIF : 1; + __IM uint32_t RFOIF : 1; + __IM uint32_t RFFIF : 1; + __IM uint32_t TFOIF : 1; + __IM uint32_t TFEIF : 1; + __IM uint32_t RRIF : 1; + __IM uint32_t TAIF : 1; + __IM uint32_t RDIF : 1; + __IM uint32_t ACTIF : 1; + __IM uint32_t STPDIF : 1; + __IM uint32_t STADIF : 1; + __IM uint32_t GCIF : 1; + __IM uint32_t RSTADIF : 1; + __IM uint32_t MOHIF : 1; + __IM uint32_t RESERVED : 18; + }INTSTS_B; + }; + + /** @brief Interrupt enable register */ + union + { + __IOM uint32_t INTEN; + struct + { + __IOM uint32_t RFUIE : 1; + __IOM uint32_t RFOIE : 1; + __IOM uint32_t RFFIE : 1; + __IOM uint32_t TFOIE : 1; + __IOM uint32_t TFEIE : 1; + __IOM uint32_t RRIE : 1; + __IOM uint32_t TAIE : 1; + __IOM uint32_t RDIE : 1; + __IOM uint32_t ACTIE : 1; + __IOM uint32_t STPDIE : 1; + __IOM uint32_t STADIE : 1; + __IOM uint32_t GCIE : 1; + __IOM uint32_t RSTADIE : 1; + __IOM uint32_t MOHIE : 1; + __IM uint32_t RESERVED : 18; + }INTEN_B; + }; + + /** @brief Raw interrupt status register */ + union + { + __IM uint32_t RIS; + struct + { + __IM uint32_t RFUIF : 1; + __IM uint32_t RFOIF : 1; + __IM uint32_t RFFIF : 1; + __IM uint32_t TFOIF : 1; + __IM uint32_t TFEIF : 1; + __IM uint32_t RRIF : 1; + __IM uint32_t TAIF : 1; + __IM uint32_t RDIF : 1; + __IM uint32_t ACTIF : 1; + __IM uint32_t STPDIF : 1; + __IM uint32_t STADIF : 1; + __IM uint32_t GCIF : 1; + __IM uint32_t RSTADIF : 1; + __IM uint32_t RESERVED : 18; + }RIS_B; + }; + + /** @brief Reception FIFO threshold register */ + union + { + __IOM uint32_t RFT; + struct + { + __IOM uint32_t RFT : 8; + __IM uint32_t RESERVED : 24; + }RFT_B; + }; + + /** @brief Transmission FIFO threshold register */ + union + { + __IOM uint32_t TFT; + struct + { + __IOM uint32_t TFT : 8; + __IM uint32_t RESERVED : 24; + }TFT_B; + }; + + /** @brief Interruption clear register */ + union + { + __IM uint32_t INTCLR; + struct + { + __IM uint32_t INTCLR : 1; + __IM uint32_t RESERVED : 31; + }INTCLR_B; + }; + + /** @brief Reception FIFO underflow interruption clear register */ + union + { + __IM uint32_t RFUIC; + struct + { + __IM uint32_t RFUIC : 1; + __IM uint32_t RESERVED : 31; + }RFUIC_B; + }; + + /** @brief Reception FIFO overflow interruption clear register */ + union + { + __IM uint32_t RFOIC; + struct + { + __IM uint32_t RFOIC : 1; + __IM uint32_t RESERVED : 31; + }RFOIC_B; + }; + + /** @brief Transmission FIFO overflow interruption clear register */ + union + { + __IM uint32_t TFOIC; + struct + { + __IM uint32_t TFOIC : 1; + __IM uint32_t RESERVED : 31; + }TFOIC_B; + }; + + /** @brief Reception request interruption clear register */ + union + { + __IM uint32_t RRIC; + struct + { + __IM uint32_t RRIC : 1; + __IM uint32_t RESERVED : 31; + }RRIC_B; + }; + + /** @brief Transmission abort interruption clear register */ + union + { + __IM uint32_t TAIC; + struct + { + __IM uint32_t TAIC : 1; + __IM uint32_t RESERVED : 31; + }TAIC_B; + }; + + /** @brief Receive done interruption clear register */ + union + { + __IM uint32_t RDIC; + struct + { + __IM uint32_t RDIC : 1; + __IM uint32_t RESERVED : 31; + }RDIC_B; + }; + + /** @brief Activity interruption clear register */ + union + { + __IM uint32_t AIC; + struct + { + __IM uint32_t AIC : 1; + __IM uint32_t RESERVED : 31; + }AIC_B; + }; + + /** @brief Stop detection interruption clear register */ + union + { + __IM uint32_t STPDIC; + struct + { + __IM uint32_t STPDIC : 1; + __IM uint32_t RESERVED : 31; + }STPDIC_B; + }; + + /** @brief Start detection interruption clear register */ + union + { + __IM uint32_t STADIC; + struct + { + __IM uint32_t STADIC : 1; + __IM uint32_t RESERVED : 31; + }STADIC_B; + }; + + /** @brief General call interruption clear register */ + union + { + __IM uint32_t GCIC; + struct + { + __IM uint32_t GCIC : 1; + __IM uint32_t RESERVED : 31; + }GCIC_B; + }; + + /** @brief Control register 2 */ + union + { + __IOM uint32_t CTRL2; + struct + { + __IOM uint32_t I2CEN : 1; + __IOM uint32_t ABR : 1; + __IOM uint32_t TCB : 1; + __IM uint32_t RESERVED : 29; + }CTRL2_B; + }; + + /** @brief Status register 1 */ + union + { + __IM uint32_t STS1; + struct + { + __IM uint32_t ACTF : 1; + __IM uint32_t TFNFF : 1; + __IM uint32_t TFEF : 1; + __IM uint32_t RFNEF : 1; + __IM uint32_t RFFF : 1; + __IM uint32_t MAF : 1; + __IM uint32_t SAF : 1; + __IM uint32_t RESERVED : 24; + }STS1_B; + }; + + /** @brief Transmission FIFO level */ + union + { + __IOM uint32_t TFL; + struct + { + __IOM uint32_t TFL : 4; + __IM uint32_t RESERVED : 28; + }TFL_B; + }; + + /** @brief Reception FIFO level */ + union + { + __IOM uint32_t RFL; + struct + { + __IOM uint32_t RFL : 4; + __IM uint32_t RESERVED : 28; + }RFL_B; + }; + + /** @brief SDA hold time length register */ + union + { + __IOM uint32_t SDAHOLD; + struct + { + __IOM uint32_t TXHOLD : 16; + __IOM uint32_t RXHOLD : 8; + __IM uint32_t RESERVED : 8; + }SDAHOLD_B; + }; + + /** @brief Transmission abort source register */ + union + { + __IM uint32_t TAS; + struct + { + __IM uint32_t AD7NA : 1; + __IM uint32_t AD10NA1 : 1; + __IM uint32_t AD10NA2 : 1; + __IM uint32_t TDNA : 1; + __IM uint32_t GCNA : 1; + __IM uint32_t GCR : 1; + __IM uint32_t HSAD : 1; + __IM uint32_t SNR : 1; + __IM uint32_t RNR10B : 1; + __IM uint32_t MSTDIS : 1; + __IM uint32_t ARBLOST : 1; + __IM uint32_t LFTF : 1; + __IM uint32_t SAL : 1; + __IM uint32_t SRI : 1; + __IM uint32_t USRARB : 1; + __IM uint32_t FLUCNT : 1; + __IM uint32_t RESERVED : 16; + }TAS_B; + }; + + /** @brief Slave data NACK only register */ + union + { + __IOM uint32_t SDNO; + struct + { + __IOM uint32_t NACK : 1; + __IM uint32_t RESERVED : 31; + }SDNO_B; + }; + + /** @brief DMA control register */ + union + { + __IOM uint32_t DMACTRL; + struct + { + __IOM uint32_t RXEN : 1; + __IOM uint32_t TXEN : 1; + __IM uint32_t RESERVED : 30; + }DMACTRL_B; + }; + + /** @brief DMA transmission data level register */ + union + { + __IOM uint32_t DTDL; + struct + { + __IOM uint32_t DTDL : 4; + __IM uint32_t RESERVED : 28; + }DTDL_B; + }; + + /** @brief DMA teception data level register */ + union + { + __IOM uint32_t DRDL; + struct + { + __IOM uint32_t DRDL : 4; + __IM uint32_t RESERVED : 28; + }DRDL_B; + }; + + /** @brief SDA delay register */ + union + { + __IOM uint32_t SDADLY; + struct + { + __IOM uint32_t SDADLY : 8; + __IM uint32_t RESERVED : 24; + }SDADLY_B; + }; + + /** @brief Genernal call ACK register */ + union + { + __IOM uint32_t GCA; + struct + { + __IOM uint32_t GCA : 1; + __IM uint32_t RESERVED : 31; + }GCA_B; + }; + + /** @brief Status register 2 */ + union + { + __IM uint32_t STS2; + struct + { + __IM uint32_t I2CEN : 1; + __IM uint32_t SDWB : 1; + __IM uint32_t SRDL : 1; + __IM uint32_t RESERVED : 29; + }STS2_B; + }; + + /** @brief Low speed spike suppression limit */ + union + { + __IOM uint32_t LSSSL; + struct + { + __IOM uint32_t LSSSL : 8; + __IM uint32_t RESERVED : 24; + }LSSSL_B; + }; + + /** @brief High speed spike suppression limit */ + union + { + __IOM uint32_t HSSSL; + struct + { + __IOM uint32_t HSSSL : 8; + __IM uint32_t RESERVED : 24; + }HSSSL_B; + }; + + uint32_t RESERVED[22]; + + /** @brief Switch register */ + union + { + __IOM uint32_t SW; + struct + { + __IOM uint32_t SW : 1; + __IM uint32_t RESERVED : 31; + }SW_B; + }; +}SCI2C_T; + +/** + * @brief Dynamic memory controler (DMC) + */ +typedef struct +{ + /** @brief Configuraion register */ + union + { + __IOM uint32_t CFG; + struct + { + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t BAWCFG : 2; + __IOM uint32_t RAWCFG : 4; + __IOM uint32_t CAWCFG : 4; + __IOM uint32_t DWCFG : 2; + __IM uint32_t RESERVED2 : 16; + }CFG_B; + }; + + /** @brief Timing register 0 */ + union + { + __IOM uint32_t TIM0; + struct + { + __IOM uint32_t CASLSEL0 : 2; + __IOM uint32_t RASMINTSEL : 4; + __IOM uint32_t DTIMSEL : 3; + __IOM uint32_t PCPSEL : 3; + __IOM uint32_t WRTIMSEL : 2; + __IOM uint32_t ARPSEL : 4; + __IOM uint32_t XSR0 : 4; + __IOM uint32_t ATACP : 4; + __IOM uint32_t ECASLSEL1 : 1; + __IOM uint32_t EXSR1 : 5; + }TIM0_B; + }; + + /** @brief Timing register 1 */ + union + { + __IOM uint32_t TIM1; + struct + { + __IOM uint32_t STBTIM : 16; + __IOM uint32_t ARNUMCFG : 4; + __IM uint32_t RESERVED : 12; + }TIM1_B; + }; + + /** @brief Control register 1 */ + union + { + __IOM uint32_t CTRL1; + struct + { + __IOM uint32_t INIT : 1; + __IOM uint32_t SRMEN : 1; + __IOM uint32_t PDMEN : 1; + __IOM uint32_t PCACFG : 1; + __IOM uint32_t FRBSREN : 1; + __IOM uint32_t FRASREN : 1; + __IOM uint32_t RDNUMMCFG : 3; + __IOM uint32_t MODESET : 1; + __IM uint32_t RESERVED1 : 1; + __IM uint32_t SRMFLG : 1; + __IOM uint32_t BANKNUMCFG : 4; + __IM uint32_t RESERVED2 : 16; + }CTRL1_B; + }; + + /** @brief Refresh register */ + union + { + __IOM uint32_t REF; + struct + { + __IOM uint32_t RCYCCFG : 16; + __IM uint32_t RESERVED : 16; + }REF_B; + }; + + /** @brief Chip select register */ + union + { + __IOM uint32_t CHIPSEL; + struct + { + __IM uint32_t RESERVED : 16; + __IOM uint32_t BACHIPSEL : 16; + + }CHIPSEL_B; + }; + + __IM uint32_t RESERVED[15]; + + /** @brief Mask register */ + union + { + __IOM uint32_t MASK; + struct + { + __IOM uint32_t MSIZESEL : 5; + __IOM uint32_t MTYPESEL : 3; + __IM uint32_t RESERVED : 24; + }MASK_B; + }; + + __IM uint32_t RESERVED1[234]; + + /** @brief Switch register */ + union + { + __IOM uint32_t SW; + struct + { + __IOM uint32_t MCSW : 1; + __IM uint32_t RESERVED : 31; + }SW_B; + }; + + /** @brief Control register 2 */ + union + { + __IOM uint32_t CTRL2; + struct + { + __IOM uint32_t CPHACFG : 1; + __IOM uint32_t RDDEN : 1; + __IOM uint32_t RDDCFG : 3; + __IOM uint32_t WPEN : 1; + __IOM uint32_t BUFFEN : 1; + __IOM uint32_t WRPBSEL : 1; + __IM uint32_t RESERVED : 24; + }CTRL2_B; + }; +}DMC_T; + +/** + * @brief Debug MCU(DBGMCU) + */ +typedef struct +{ + /** @brief ID register */ + union + { + __IOM uint32_t IDCODE; + struct + { + __IOM uint32_t EQR : 12; + __IM uint32_t RESERVED : 4; + __IOM uint32_t WVR : 16; + }IDCODE_B; + }; + + /** @brief Control register */ + union + { + __IOM uint32_t CFG; + struct + { + __IOM uint32_t SLEEP_CLK_STS : 1; + __IOM uint32_t STOP_CLK_STS : 1; + __IOM uint32_t STANDBY_CLK_STS : 1; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t IOEN : 1; + __IOM uint32_t MODE : 2; + __IOM uint32_t IWDT_STS : 1; + __IOM uint32_t WWDT_STS : 1; + __IOM uint32_t TMR1_STS : 1; + __IOM uint32_t TMR2_STS : 1; + __IOM uint32_t TMR3_STS : 1; + __IOM uint32_t TMR4_STS : 1; + __IOM uint32_t CAN1_STS : 1; + __IOM uint32_t I2C1_SMBUS_TIMEOUT_STS : 1; + __IOM uint32_t I2C2_SMBUS_TIMEOUT_STS : 1; + __IOM uint32_t TMR8_STS : 1; + __IOM uint32_t TMR5_STS : 1; + __IOM uint32_t TMR6_STS : 1; + __IOM uint32_t TMR7_STS : 1; + __IOM uint32_t CAN2_STS : 1; + __IM uint32_t RESERVED2 : 10; + }CFG_B; + }; +}DBGMCU_T; + +/** + * @brief USB Device controler(USBD) + */ +typedef union +{ + __IOM uint32_t EP; + + struct + { + __IOM uint32_t ADDR : 4; + __IOM uint32_t TXSTS : 2; + __IOM uint32_t TXDTOG : 1; + __IOM uint32_t CTFT : 1; + __IOM uint32_t KIND : 1; + __IOM uint32_t TYPE : 2; + __IOM uint32_t SETUP : 1; + __IOM uint32_t RXSTS : 2; + __IOM uint32_t RXDTOG : 1; + __IOM uint32_t CTFR : 1; + __IM uint32_t RESERVED : 16; + }EP_B; +}USB_EP_REG_T; + +typedef struct +{ + /** Endpoint */ + USB_EP_REG_T EP[8]; + + __IM uint32_t RESERVED[8]; + + /** @brief Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t FORRST : 1; + __IOM uint32_t PWRDOWN : 1; + __IOM uint32_t LPWREN : 1; + __IOM uint32_t FORSUS : 1; + __IOM uint32_t WUPREQ : 1; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t ESOFIEN : 1; + __IOM uint32_t SOFIEN : 1; + __IOM uint32_t RSTIEN : 1; + __IOM uint32_t SUSIEN : 1; + __IOM uint32_t WUPIEN : 1; + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t PMAOUIEN : 1; + __IOM uint32_t CTRIEN : 1; + __IM uint32_t RESERVED2 : 16; + }CTRL_B; + }; + + /** @brief Interrupt status register */ + union + { + __IOM uint32_t INTSTS; + + struct + { + __IOM uint32_t EPID : 4; + __IOM uint32_t DOT : 1; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t ESOFFLG : 1; + __IOM uint32_t SOFFLG : 1; + __IOM uint32_t RSTREQ : 1; + __IOM uint32_t SUSREQ : 1; + __IOM uint32_t WUPREQ : 1; + __IOM uint32_t ERRFLG : 1; + __IOM uint32_t PMOFLG : 1; + __IOM uint32_t CTFLG : 1; + __IM uint32_t RESERVED2 : 16; + }INTSTS_B; + }; + + /** @brief Frame number register */ + union + { + __IM uint32_t FRANUM; + + struct + { + __IM uint32_t FRANUM : 11; + __IM uint32_t LSOFNUM : 2; + __IM uint32_t LOCK : 1; + __IM uint32_t RXDMSTS : 1; + __IM uint32_t RXDPSTS : 1; + __IM uint32_t RESERVED : 16; + }FRANUM_B; + }; + + /** @brief Device address register */ + union + { + __IOM uint32_t ADDR; + + struct + { + __IOM uint32_t ADDR : 7; + __IOM uint32_t USBDEN : 1; + __IM uint32_t RESERVED : 24; + }ADDR_B; + }; + + /** @brief Buffer table address register */ + union + { + __IOM uint32_t BUFFTB; + + struct + { + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t BUFFTB : 13; + __IM uint32_t RESERVED2 : 16; + }BUFFTB_B; + }; + + __IM uint32_t RESERVED1[43]; + + /** @brief Buffer table address register */ + union + { + __IOM uint32_t USB_SWITCH; + + struct + { + __IOM uint32_t USB_SWITCH : 1; + __IM uint32_t RESERVED : 31; + }SWITCH_B; + }; +}USBD_T; + +/**@} end of group Peripheral_registers_structures */ + +/** @defgroup Peripheral_memory_map + @{ +*/ + +/* FMC base address in the alias region */ +#define FMC_BASE ((uint32_t)0x08000000) +/* SRAM base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) +/* Peripheral base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) + +/* SRAM base address in the bit-band region */ +#define SRAM_BB_BASE ((uint32_t)0x22000000) +/* Peripheral base address in the bit-band region */ +#define PERIPH_BB_BASE ((uint32_t)0x42000000) + +/* SMC registers base address */ +#define SMC_R_BASE ((uint32_t)0xA0000000) +/* DMC registers base address */ +#define DMC_BASE ((uint32_t)0xA0000000) + +/* Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TMR2_BASE (APB1PERIPH_BASE + 0x0000) +#define TMR3_BASE (APB1PERIPH_BASE + 0x0400) +#define TMR4_BASE (APB1PERIPH_BASE + 0x0800) +#define TMR5_BASE (APB1PERIPH_BASE + 0x0C00) +#define TMR6_BASE (APB1PERIPH_BASE + 0x1000) +#define TMR7_BASE (APB1PERIPH_BASE + 0x1400) +#define TMR12_BASE (APB1PERIPH_BASE + 0x1800) +#define TMR13_BASE (APB1PERIPH_BASE + 0x1C00) +#define TMR14_BASE (APB1PERIPH_BASE + 0x2000) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDT_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDT_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define USBD_BASE (APB1PERIPH_BASE + 0X5C00) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) +#define BAKPR_BASE (APB1PERIPH_BASE + 0x6C00) +#define PMU_BASE (APB1PERIPH_BASE + 0x7000) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400) +#define CEC_BASE (APB1PERIPH_BASE + 0x7800) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EINT_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) +#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TMR1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define TMR8_BASE (APB2PERIPH_BASE + 0x3400) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) +#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) +#define TMR15_BASE (APB2PERIPH_BASE + 0x4000) +#define TMR16_BASE (APB2PERIPH_BASE + 0x4400) +#define TMR17_BASE (APB2PERIPH_BASE + 0x4800) +#define TMR9_BASE (APB2PERIPH_BASE + 0x4C00) +#define TMR10_BASE (APB2PERIPH_BASE + 0x5000) +#define TMR11_BASE (APB2PERIPH_BASE + 0x5400) + +#define SDIO_BASE (PERIPH_BASE + 0x18000) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) +#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) +#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) +#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) +#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) +#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) +#define RCM_BASE (AHBPERIPH_BASE + 0x1000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) + +/* FMC registers base address */ +#define FMC_R_BASE (AHBPERIPH_BASE + 0x2000) +/* FMC Option Bytes base address */ +#define OB_BASE ((uint32_t)0x1FFFF800) + +/* SMC Bank1 registers base address */ +#define SMC_Bank1_R_BASE (SMC_R_BASE + 0x0000) +/* SMC Bank1E registers base address */ +#define SMC_Bank1E_R_BASE (SMC_R_BASE + 0x0104) +/* SMC Bank2 registers base address */ +#define SMC_Bank2_R_BASE (SMC_R_BASE + 0x0060) +/* SMC Bank3 registers base address */ +#define SMC_Bank3_R_BASE (SMC_R_BASE + 0x0080) +/* SMC Bank4 registers base address */ +#define SMC_Bank4_R_BASE (SMC_R_BASE + 0x00A0) + +/* Debug MCU registers base address */ +#define DBGMCU_BASE ((uint32_t)0xE0042000) + +/**@} end of group Peripheral_memory_map */ + +/** @defgroup Peripheral_declaration + @{ +*/ + + +#define CRC ((CRC_T *) CRC_BASE) +#define RTC ((RTC_T *) RTC_BASE) +#define PMU ((PMU_T *) PMU_BASE) +#define BAKPR ((BAKPR_T *) BAKPR_BASE) +#define TMR1 ((TMR_T *) TMR1_BASE) +#define TMR2 ((TMR_T *) TMR2_BASE) +#define TMR3 ((TMR_T *) TMR3_BASE) +#define TMR4 ((TMR_T *) TMR4_BASE) +#define TMR5 ((TMR_T *) TMR5_BASE) +#define TMR6 ((TMR_T *) TMR6_BASE) +#define TMR7 ((TMR_T *) TMR7_BASE) +#define TMR8 ((TMR_T *) TMR8_BASE) +#define TMR9 ((TMR_T *) TMR9_BASE) +#define TMR10 ((TMR_T *) TMR10_BASE) +#define TMR11 ((TMR_T *) TMR11_BASE) +#define TMR12 ((TMR_T *) TMR12_BASE) +#define TMR13 ((TMR_T *) TMR13_BASE) +#define TMR14 ((TMR_T *) TMR14_BASE) +#define TMR15 ((TMR_T *) TMR15_BASE) +#define TMR16 ((TMR_T *) TMR16_BASE) +#define TMR17 ((TMR_T *) TMR17_BASE) + +#define DMA1 ((DMA_T *) DMA1_BASE) +#define DMA2 ((DMA_T *) DMA2_BASE) + +#define DMA1_Channel1 ((DMA_Channel_T *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_T *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_T *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_T *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_T *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_T *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_T *) DMA1_Channel7_BASE) + +#define DMA2_Channel1 ((DMA_Channel_T *) DMA2_Channel1_BASE) +#define DMA2_Channel2 ((DMA_Channel_T *) DMA2_Channel2_BASE) +#define DMA2_Channel3 ((DMA_Channel_T *) DMA2_Channel3_BASE) +#define DMA2_Channel4 ((DMA_Channel_T *) DMA2_Channel4_BASE) +#define DMA2_Channel5 ((DMA_Channel_T *) DMA2_Channel5_BASE) + +#define CAN1 ((CAN_T *) CAN1_BASE) +#define CAN2 ((CAN_T *) CAN2_BASE) + +#define I2C1 ((I2C_T *) I2C1_BASE) +#define I2C2 ((I2C_T *) I2C2_BASE) + +#define OB ((OB_T *) OB_BASE) + +#define ADC1 ((ADC_T *) ADC1_BASE) +#define ADC2 ((ADC_T *) ADC2_BASE) +#define ADC3 ((ADC_T *) ADC3_BASE) + +#define EINT ((EINT_T *) EINT_BASE) + +#define IWDT ((IWDT_T *) IWDT_BASE) +#define SDIO ((SDIO_T *) SDIO_BASE) +#define DAC ((DAC_T *) DAC_BASE) + +#define SPI1 ((SPI_T *) SPI1_BASE) +#define SPI2 ((SPI_T *) SPI2_BASE) +#define SPI3 ((SPI_T *) SPI3_BASE) + +#define WWDT ((WWDT_T *) WWDT_BASE) +#define USART2 ((USART_T *) USART2_BASE) +#define USART3 ((USART_T *) USART3_BASE) +#define UART4 ((USART_T *) UART4_BASE) +#define UART5 ((USART_T *) UART5_BASE) +#define AFIO ((AFIO_T *) AFIO_BASE) +#define GPIOA ((GPIO_T *) GPIOA_BASE) +#define GPIOB ((GPIO_T *) GPIOB_BASE) +#define GPIOC ((GPIO_T *) GPIOC_BASE) +#define GPIOD ((GPIO_T *) GPIOD_BASE) +#define GPIOE ((GPIO_T *) GPIOE_BASE) +#define GPIOF ((GPIO_T *) GPIOF_BASE) +#define GPIOG ((GPIO_T *) GPIOG_BASE) +#define USART1 ((USART_T *) USART1_BASE) +#define RCM ((RCM_T *) RCM_BASE) +#define FMC ((FMC_T *) FMC_R_BASE) +#define USBD ((USBD_T *)USBD_BASE) + +#define SMC_Bank1 ((SMC_Bank1_T *) SMC_Bank1_R_BASE) +#define SMC_Bank1E ((SMC_Bank1E_T *)SMC_Bank1E_R_BASE) +#define SMC_Bank2 ((SMC_Bank2_T *) SMC_Bank2_R_BASE) +#define SMC_Bank3 ((SMC_Bank3_T *) SMC_Bank3_R_BASE) +#define SMC_Bank4 ((SMC_Bank4_T *) SMC_Bank4_R_BASE) + +#define DBGMCU ((DBGMCU_T *) DBGMCU_BASE) + +#define I2C3 ((SCI2C_T *)(I2C1_BASE)) +#define I2C4 ((SCI2C_T *)(I2C2_BASE)) + +#define DMC ((DMC_T *)DMC_BASE) + +/**@} end of group Peripheral_declaration */ + +/** @defgroup Exported_Macros + @{ +*/ + +/* Define one bit mask */ +#define BIT0 ((uint32_t)0x00000001) +#define BIT1 ((uint32_t)0x00000002) +#define BIT2 ((uint32_t)0x00000004) +#define BIT3 ((uint32_t)0x00000008) +#define BIT4 ((uint32_t)0x00000010) +#define BIT5 ((uint32_t)0x00000020) +#define BIT6 ((uint32_t)0x00000040) +#define BIT7 ((uint32_t)0x00000080) +#define BIT8 ((uint32_t)0x00000100) +#define BIT9 ((uint32_t)0x00000200) +#define BIT10 ((uint32_t)0x00000400) +#define BIT11 ((uint32_t)0x00000800) +#define BIT12 ((uint32_t)0x00001000) +#define BIT13 ((uint32_t)0x00002000) +#define BIT14 ((uint32_t)0x00004000) +#define BIT15 ((uint32_t)0x00008000) +#define BIT16 ((uint32_t)0x00010000) +#define BIT17 ((uint32_t)0x00020000) +#define BIT18 ((uint32_t)0x00040000) +#define BIT19 ((uint32_t)0x00080000) +#define BIT20 ((uint32_t)0x00100000) +#define BIT21 ((uint32_t)0x00200000) +#define BIT22 ((uint32_t)0x00400000) +#define BIT23 ((uint32_t)0x00800000) +#define BIT24 ((uint32_t)0x01000000) +#define BIT25 ((uint32_t)0x02000000) +#define BIT26 ((uint32_t)0x04000000) +#define BIT27 ((uint32_t)0x08000000) +#define BIT28 ((uint32_t)0x10000000) +#define BIT29 ((uint32_t)0x20000000) +#define BIT30 ((uint32_t)0x40000000) +#define BIT31 ((uint32_t)0x80000000) + +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) + +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) + +#define READ_BIT(REG, BIT) ((REG) & (BIT)) + +#define CLEAR_REG(REG) ((REG) = (0x0)) + +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) + +#define READ_REG(REG) ((REG)) + +#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) + +/**@} end of group Exported_Macros */ +/**@} end of group APM32E10x */ +/**@} end of group CMSIS */ +#ifdef __cplusplus +} +#endif + +#endif /* __APM32E10x_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Include/system_apm32e10x.h b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Include/system_apm32e10x.h new file mode 100644 index 0000000000..76d3d49cab --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Include/system_apm32e10x.h @@ -0,0 +1,59 @@ +/*! + * @file system_apm32e10x.h + * + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __SYSTEM_APM32E10X_H +#define __SYSTEM_APM32E10X_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup CMSIS + @{ +*/ + +/** @addtogroup APM32E10x_System + @{ +*/ + +/** @defgroup System_Functions + @{ +*/ + +extern uint32_t SystemCoreClock; + +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); + +/**@} end of group System_Functions */ +/**@} end of group APM32E10x_System */ +/**@} end of group CMSIS */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_APM32E10X_H */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/arm/startup_apm32e10x_hd.s b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/arm/startup_apm32e10x_hd.s new file mode 100644 index 0000000000..61c4c5ac88 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/arm/startup_apm32e10x_hd.s @@ -0,0 +1,368 @@ +;/*! +; * @file startup_apm32e10x_hd.s +; * +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device apm32e10x +; * +; * @version V1.0.1 +; * +; * @date 2022-07-29 +; * +; * @attention +; * +; * Copyright (C) 2021-2023 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be useful and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. +; */ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDT_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EINT Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCM_IRQHandler ; RCM + DCD EINT0_IRQHandler ; EINT Line 0 + DCD EINT1_IRQHandler ; EINT Line 1 + DCD EINT2_IRQHandler ; EINT Line 2 + DCD EINT3_IRQHandler ; EINT Line 3 + DCD EINT4_IRQHandler ; EINT Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USBD1_HP_CAN1_TX_IRQHandler ; USBD1 High Priority or CAN1 TX + DCD USBD1_LP_CAN1_RX0_IRQHandler ; USBD1 Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EINT9_5_IRQHandler ; EINT Line 9..5 + DCD TMR1_BRK_IRQHandler ; TMR1 Break + DCD TMR1_UP_IRQHandler ; TMR1 Update + DCD TMR1_TRG_COM_IRQHandler ; TMR1 Trigger and Commutation + DCD TMR1_CC_IRQHandler ; TMR1 Capture Compare + DCD TMR2_IRQHandler ; TMR2 + DCD TMR3_IRQHandler ; TMR3 + DCD TMR4_IRQHandler ; TMR4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EINT15_10_IRQHandler ; EINT Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EINT Line + DCD USBDWakeUp_IRQHandler ; USBD Wakeup from suspend + DCD TMR8_BRK_IRQHandler ; TMR8 Break + DCD TMR8_UP_IRQHandler ; TMR8 Update + DCD TMR8_TRG_COM_IRQHandler ; TMR8 Trigger and Commutation + DCD TMR8_CC_IRQHandler ; TMR8 Capture Compare + DCD ADC3_IRQHandler ; ADC3 + DCD EMMC_IRQHandler ; EMMC + DCD SDIO_IRQHandler ; SDIO + DCD TMR5_IRQHandler ; TMR5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TMR6_IRQHandler ; TMR6 + DCD TMR7_IRQHandler ; TMR7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 + DCD 0 ; Reserved + DCD USBD2_HP_CAN2_TX_IRQHandler ; USBD2 High Priority or CAN2 TX + DCD USBD2_LP_CAN2_RX0_IRQHandler ; USBD2 Low Priority or CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_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 WWDT_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCM_IRQHandler [WEAK] + EXPORT EINT0_IRQHandler [WEAK] + EXPORT EINT1_IRQHandler [WEAK] + EXPORT EINT2_IRQHandler [WEAK] + EXPORT EINT3_IRQHandler [WEAK] + EXPORT EINT4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USBD1_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USBD1_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EINT9_5_IRQHandler [WEAK] + EXPORT TMR1_BRK_IRQHandler [WEAK] + EXPORT TMR1_UP_IRQHandler [WEAK] + EXPORT TMR1_TRG_COM_IRQHandler [WEAK] + EXPORT TMR1_CC_IRQHandler [WEAK] + EXPORT TMR2_IRQHandler [WEAK] + EXPORT TMR3_IRQHandler [WEAK] + EXPORT TMR4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EINT15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBDWakeUp_IRQHandler [WEAK] + EXPORT TMR8_BRK_IRQHandler [WEAK] + EXPORT TMR8_UP_IRQHandler [WEAK] + EXPORT TMR8_TRG_COM_IRQHandler [WEAK] + EXPORT TMR8_CC_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT EMMC_IRQHandler [WEAK] + EXPORT SDIO_IRQHandler [WEAK] + EXPORT TMR5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT TMR6_IRQHandler [WEAK] + EXPORT TMR7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_5_IRQHandler [WEAK] + EXPORT USBD2_HP_CAN2_TX_IRQHandler [WEAK] + EXPORT USBD2_LP_CAN2_RX0_IRQHandler [WEAK] + EXPORT CAN2_RX1_IRQHandler [WEAK] + EXPORT CAN2_SCE_IRQHandler [WEAK] + +WWDT_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCM_IRQHandler +EINT0_IRQHandler +EINT1_IRQHandler +EINT2_IRQHandler +EINT3_IRQHandler +EINT4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USBD1_HP_CAN1_TX_IRQHandler +USBD1_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EINT9_5_IRQHandler +TMR1_BRK_IRQHandler +TMR1_UP_IRQHandler +TMR1_TRG_COM_IRQHandler +TMR1_CC_IRQHandler +TMR2_IRQHandler +TMR3_IRQHandler +TMR4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EINT15_10_IRQHandler +RTCAlarm_IRQHandler +USBDWakeUp_IRQHandler +TMR8_BRK_IRQHandler +TMR8_UP_IRQHandler +TMR8_TRG_COM_IRQHandler +TMR8_CC_IRQHandler +ADC3_IRQHandler +EMMC_IRQHandler +SDIO_IRQHandler +TMR5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +TMR6_IRQHandler +TMR7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_5_IRQHandler +USBD2_HP_CAN2_TX_IRQHandler +USBD2_LP_CAN2_RX0_IRQHandler +CAN2_RX1_IRQHandler +CAN2_SCE_IRQHandler + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + 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 + + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;*******************************END OF FILE************************************ + diff --git a/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/gcc_APM32E10xxC.ld b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/gcc_APM32E10xxC.ld new file mode 100644 index 0000000000..af6e28e6a7 --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/gcc_APM32E10xxC.ld @@ -0,0 +1,164 @@ +/*! + * @file gcc_APM32E10xxC.ld + * + * @brief Linker script for APM32E10xxC Device with + * 256KByte FLASH, 64KByte RAM + * + * @version V1.0.0 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Flash Configuration*/ +/* Flash Base Address */ +_rom_base = 0x8000000; +/*Flash Size (in Bytes) */ +_rom_size = 0x0040000; + +/* Embedded RAM Configuration */ +/* RAM Base Address */ +_ram_base = 0x20000000; +/* RAM Size (in Bytes) */ +_ram_size = 0x00010000; + +/* Stack / Heap Configuration */ +_end_stack = 0x20010000; +/* Heap Size (in Bytes) */ +_heap_size = 0x200; +/* Stack Size (in Bytes) */ +_stack_size = 0x400; + +MEMORY +{ +FLASH (rx) : ORIGIN = _rom_base, LENGTH = _rom_size +RAM (xrw) : ORIGIN = _ram_base, LENGTH = _ram_size +} + +SECTIONS +{ + .apm32_isr_vector : + { + . = ALIGN(4); + KEEP(*(.apm32_isr_vector)) + . = ALIGN(4); + } >FLASH + + .text : + { + . = ALIGN(4); + *(.text) + *(.text*) + *(.glue_7) + *(.glue_7t) + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; + } >FLASH + + .rodata : + { + . = ALIGN(4); + *(.rodata) + *(.rodata*) + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + _start_address_init_data = LOADADDR(.data); + + .data : + { + . = ALIGN(4); + _start_address_data = .; + *(.data) + *(.data*) + + . = ALIGN(4); + _end_address_data = .; + } >RAM AT> FLASH + + + . = ALIGN(4); + .bss : + { + + _start_address_bss = .; + __bss_start__ = _start_address_bss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _end_address_bss = .; + __bss_end__ = _end_address_bss; + } >RAM + + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _heap_size; + . = . + _stack_size; + . = ALIGN(8); + } >RAM + + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + diff --git a/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/gcc_APM32E10xxE.ld b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/gcc_APM32E10xxE.ld new file mode 100644 index 0000000000..2092520cbf --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/gcc_APM32E10xxE.ld @@ -0,0 +1,164 @@ +/*! + * @file gcc_APM32E10xxE.ld + * + * @brief Linker script for APM32E10xxE Device with + * 512KByte FLASH, 128KByte RAM + * + * @version V1.0.0 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Flash Configuration*/ +/* Flash Base Address */ +_rom_base = 0x8000000; +/*Flash Size (in Bytes) */ +_rom_size = 0x0080000; + +/* Embedded RAM Configuration */ +/* RAM Base Address */ +_ram_base = 0x20000000; +/* RAM Size (in Bytes) */ +_ram_size = 0x00020000; + +/* Stack / Heap Configuration */ +_end_stack = 0x20020000; +/* Heap Size (in Bytes) */ +_heap_size = 0x200; +/* Stack Size (in Bytes) */ +_stack_size = 0x400; + +MEMORY +{ +FLASH (rx) : ORIGIN = _rom_base, LENGTH = _rom_size +RAM (xrw) : ORIGIN = _ram_base, LENGTH = _ram_size +} + +SECTIONS +{ + .apm32_isr_vector : + { + . = ALIGN(4); + KEEP(*(.apm32_isr_vector)) + . = ALIGN(4); + } >FLASH + + .text : + { + . = ALIGN(4); + *(.text) + *(.text*) + *(.glue_7) + *(.glue_7t) + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; + } >FLASH + + .rodata : + { + . = ALIGN(4); + *(.rodata) + *(.rodata*) + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + _start_address_init_data = LOADADDR(.data); + + .data : + { + . = ALIGN(4); + _start_address_data = .; + *(.data) + *(.data*) + + . = ALIGN(4); + _end_address_data = .; + } >RAM AT> FLASH + + + . = ALIGN(4); + .bss : + { + + _start_address_bss = .; + __bss_start__ = _start_address_bss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _end_address_bss = .; + __bss_end__ = _end_address_bss; + } >RAM + + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _heap_size; + . = . + _stack_size; + . = ALIGN(8); + } >RAM + + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + diff --git a/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/startup_apm32e10x_hd.S b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/startup_apm32e10x_hd.S new file mode 100644 index 0000000000..a8e097ac9b --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/gcc/startup_apm32e10x_hd.S @@ -0,0 +1,398 @@ +/*! + * @file startup_apm32e103_hd.S + * + * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32e103_hd + * + * @version V1.0.0 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_apm32_Vectors +.global Default_Handler + +.word _start_address_init_data +.word _start_address_data +.word _end_address_data +.word _start_address_bss +.word _end_address_bss + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +// Reset handler routine +Reset_Handler: + + ldr r0, =_start_address_data + ldr r1, =_end_address_data + ldr r2, =_start_address_init_data + movs r3, #0 + b L_loop0_0 + +L_loop0: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +L_loop0_0: + adds r4, r0, r3 + cmp r4, r1 + bcc L_loop0 + + ldr r2, =_start_address_bss + ldr r4, =_end_address_bss + movs r3, #0 + b L_loop1 + +L_loop2: + str r3, [r2] + adds r2, r2, #4 + +L_loop1: + cmp r2, r4 + bcc L_loop2 + + bl SystemInit + bl __libc_init_array + bl entry + bx lr +.size Reset_Handler, .-Reset_Handler + +// This is the code that gets called when the processor receives an unexpected interrupt. + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +L_Loop_infinite: + b L_Loop_infinite + .size Default_Handler, .-Default_Handler + +// The minimal vector table for a Cortex M3. + .section .isr_vector,"a",%progbits + .type g_apm32_Vectors, %object + .size g_apm32_Vectors, .-g_apm32_Vectors + +// Vector Table Mapped to Address 0 at Reset +g_apm32_Vectors: + + .word _end_stack // Top of Stack + .word Reset_Handler // Reset Handler + .word NMI_Handler // NMI Handler + .word HardFault_Handler // Hard Fault Handler + .word MemManage_Handler // MPU Fault Handler + .word BusFault_Handler // Bus Fault Handler + .word UsageFault_Handler // Usage Fault Handler + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word SVC_Handler // SVCall Handler + .word DebugMon_Handler // Debug Monitor Handler + .word 0 // Reserved + .word PendSV_Handler // PendSV Handler + .word SysTick_Handler // SysTick Handler + .word WWDT_IRQHandler // Window Watchdog + .word PVD_IRQHandler // PVD through EINT Line detect + .word TAMPER_IRQHandler // Tamper + .word RTC_IRQHandler // RTC + .word FLASH_IRQHandler // Flash + .word RCM_IRQHandler // RCM + .word EINT0_IRQHandler // EINT Line 0 + .word EINT1_IRQHandler // EINT Line 1 + .word EINT2_IRQHandler // EINT Line 2 + .word EINT3_IRQHandler // EINT Line 3 + .word EINT4_IRQHandler // EINT Line 4 + .word DMA1_Channel1_IRQHandler // DMA1 Channel 1 + .word DMA1_Channel2_IRQHandler // DMA1 Channel 2 + .word DMA1_Channel3_IRQHandler // DMA1 Channel 3 + .word DMA1_Channel4_IRQHandler // DMA1 Channel 4 + .word DMA1_Channel5_IRQHandler // DMA1 Channel 5 + .word DMA1_Channel6_IRQHandler // DMA1 Channel 6 + .word DMA1_Channel7_IRQHandler // DMA1 Channel 7 + .word ADC1_2_IRQHandler // ADC1 & ADC2 + .word USBD1_HP_CAN1_TX_IRQHandler // USBD1 High Priority or CAN1 TX + .word USBD1_LP_CAN1_RX0_IRQHandler // USBD1 Low Priority or CAN1 RX0 + .word CAN1_RX1_IRQHandler // CAN1 RX1 + .word CAN1_SCE_IRQHandler // CAN1 SCE + .word EINT9_5_IRQHandler // EINT Line 9..5 + .word TMR1_BRK_IRQHandler // TMR1 Break + .word TMR1_UP_IRQHandler // TMR1 Update + .word TMR1_TRG_COM_IRQHandler // TMR1 Trigger and Commutation + .word TMR1_CC_IRQHandler // TMR1 Capture Compare + .word TMR2_IRQHandler // TMR2 + .word TMR3_IRQHandler // TMR3 + .word TMR4_IRQHandler // TMR4 + .word I2C1_EV_IRQHandler // I2C1 Event + .word I2C1_ER_IRQHandler // I2C1 Error + .word I2C2_EV_IRQHandler // I2C2 Event + .word I2C2_ER_IRQHandler // I2C2 Error + .word SPI1_IRQHandler // SPI1 + .word SPI2_IRQHandler // SPI2 + .word USART1_IRQHandler // USART1 + .word USART2_IRQHandler // USART2 + .word USART3_IRQHandler // USART3 + .word EINT15_10_IRQHandler // EINT Line 15..10 + .word RTCAlarm_IRQHandler // RTC Alarm through EINT Line + .word USBDWakeUp_IRQHandler // USBD Wakeup from suspend + .word TMR8_BRK_IRQHandler // TMR8 Break + .word TMR8_UP_IRQHandler // TMR8 Update + .word TMR8_TRG_COM_IRQHandler // TMR8 Trigger and Commutation + .word TMR8_CC_IRQHandler // TMR8 Capture Compare + .word ADC3_IRQHandler // ADC3 + .word EMMC_IRQHandler // EMMC + .word SDIO_IRQHandler // SDIO + .word TMR5_IRQHandler // TMR5 + .word SPI3_IRQHandler // SPI3 + .word UART4_IRQHandler // UART4 + .word UART5_IRQHandler // UART5 + .word TMR6_IRQHandler // TMR6 + .word TMR7_IRQHandler // TMR7 + .word DMA2_Channel1_IRQHandler // DMA2 Channel1 + .word DMA2_Channel2_IRQHandler // DMA2 Channel2 + .word DMA2_Channel3_IRQHandler // DMA2 Channel3 + .word DMA2_Channel4_5_IRQHandler // DMA2 Channel4 & Channel5 + .word 0 // Reserved + .word USBD2_HP_CAN2_TX_IRQHandler // USBD2 High Priority or CAN2 TX + .word USBD2_LP_CAN2_RX0_IRQHandler // USBD2 Low Priority or CAN2 RX0 + .word CAN2_RX1_IRQHandler // CAN2 RX1 + .word CAN2_SCE_IRQHandler // CAN2 SCE + +// Default exception/interrupt handler + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDT_IRQHandler + .thumb_set WWDT_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCM_IRQHandler + .thumb_set RCM_IRQHandler,Default_Handler + + .weak EINT0_IRQHandler + .thumb_set EINT0_IRQHandler,Default_Handler + + .weak EINT1_IRQHandler + .thumb_set EINT1_IRQHandler,Default_Handler + + .weak EINT2_IRQHandler + .thumb_set EINT2_IRQHandler,Default_Handler + + .weak EINT3_IRQHandler + .thumb_set EINT3_IRQHandler,Default_Handler + + .weak EINT4_IRQHandler + .thumb_set EINT4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USBD1_HP_CAN1_TX_IRQHandler + .thumb_set USBD1_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USBD1_LP_CAN1_RX0_IRQHandler + .thumb_set USBD1_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EINT9_5_IRQHandler + .thumb_set EINT9_5_IRQHandler,Default_Handler + + .weak TMR1_BRK_IRQHandler + .thumb_set TMR1_BRK_IRQHandler,Default_Handler + + .weak TMR1_UP_IRQHandler + .thumb_set TMR1_UP_IRQHandler,Default_Handler + + .weak TMR1_TRG_COM_IRQHandler + .thumb_set TMR1_TRG_COM_IRQHandler,Default_Handler + + .weak TMR1_CC_IRQHandler + .thumb_set TMR1_CC_IRQHandler,Default_Handler + + .weak TMR2_IRQHandler + .thumb_set TMR2_IRQHandler,Default_Handler + + .weak TMR3_IRQHandler + .thumb_set TMR3_IRQHandler,Default_Handler + + .weak TMR4_IRQHandler + .thumb_set TMR4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EINT15_10_IRQHandler + .thumb_set EINT15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBDWakeUp_IRQHandler + .thumb_set USBDWakeUp_IRQHandler,Default_Handler + + .weak TMR8_BRK_IRQHandler + .thumb_set TMR8_BRK_IRQHandler,Default_Handler + + .weak TMR8_UP_IRQHandler + .thumb_set TMR8_UP_IRQHandler,Default_Handler + + .weak TMR8_TRG_COM_IRQHandler + .thumb_set TMR8_TRG_COM_IRQHandler,Default_Handler + + .weak TMR8_CC_IRQHandler + .thumb_set TMR8_CC_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak EMMC_IRQHandler + .thumb_set EMMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TMR5_IRQHandler + .thumb_set TMR5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TMR6_IRQHandler + .thumb_set TMR6_IRQHandler,Default_Handler + + .weak TMR7_IRQHandler + .thumb_set TMR7_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_5_IRQHandler + .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler + + .weak USBD2_HP_CAN2_TX_IRQHandler + .thumb_set USBD2_HP_CAN2_TX_IRQHandler,Default_Handler + + .weak USBD2_LP_CAN2_RX0_IRQHandler + .thumb_set USBD2_LP_CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + diff --git a/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/iar/startup_apm32e10x_hd.s b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/iar/startup_apm32e10x_hd.s new file mode 100644 index 0000000000..3139c2719b --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/iar/startup_apm32e10x_hd.s @@ -0,0 +1,504 @@ +;/*! +; * @file startup_apm32e10x_hd.s +; * +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device APM32E103 +; * +; * @version V1.0.1 +; * +; * @date 2022-07-29 +; * +; * @attention +; * +; * Copyright (C) 2021-2023 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be useful and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. +; */ + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDT_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EINT Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCM_IRQHandler ; RCM + DCD EINT0_IRQHandler ; EINT Line 0 + DCD EINT1_IRQHandler ; EINT Line 1 + DCD EINT2_IRQHandler ; EINT Line 2 + DCD EINT3_IRQHandler ; EINT Line 3 + DCD EINT4_IRQHandler ; EINT Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USBD1_HP_CAN1_TX_IRQHandler ; USBD1 High Priority or CAN1 TX + DCD USBD1_LP_CAN1_RX0_IRQHandler ; USBD1 Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EINT9_5_IRQHandler ; EINT Line 9..5 + DCD TMR1_BRK_IRQHandler ; TMR1 Break + DCD TMR1_UP_IRQHandler ; TMR1 Update + DCD TMR1_TRG_COM_IRQHandler ; TMR1 Trigger and Commutation + DCD TMR1_CC_IRQHandler ; TMR1 Capture Compare + DCD TMR2_IRQHandler ; TMR2 + DCD TMR3_IRQHandler ; TMR3 + DCD TMR4_IRQHandler ; TMR4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EINT15_10_IRQHandler ; EINT Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EINT Line + DCD USBDWakeUp_IRQHandler ; USBD Wakeup from suspend + DCD TMR8_BRK_IRQHandler ; TMR8 Break + DCD TMR8_UP_IRQHandler ; TMR8 Update + DCD TMR8_TRG_COM_IRQHandler ; TMR8 Trigger and Commutation + DCD TMR8_CC_IRQHandler ; TMR8 Capture Compare + DCD ADC3_IRQHandler ; ADC3 + DCD EMMC_IRQHandler ; EMMC + DCD SDIO_IRQHandler ; SDIO + DCD TMR5_IRQHandler ; TMR5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TMR6_IRQHandler ; TMR6 + DCD TMR7_IRQHandler ; TMR7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 + DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 + DCD 0 ; Reserved + DCD USBD2_HP_CAN2_TX_IRQHandler ; USBD2 High Priority or CAN2 TX + DCD USBD2_LP_CAN2_RX0_IRQHandler ; USBD2 Low Priority or CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDT_IRQHandler + B WWDT_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RCM_IRQHandler + B RCM_IRQHandler + + PUBWEAK EINT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT0_IRQHandler + B EINT0_IRQHandler + + PUBWEAK EINT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT1_IRQHandler + B EINT1_IRQHandler + + PUBWEAK EINT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT2_IRQHandler + B EINT2_IRQHandler + + PUBWEAK EINT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT3_IRQHandler + B EINT3_IRQHandler + + PUBWEAK EINT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT4_IRQHandler + B EINT4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USBD1_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBD1_HP_CAN1_TX_IRQHandler + B USBD1_HP_CAN1_TX_IRQHandler + + PUBWEAK USBD1_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBD1_LP_CAN1_RX0_IRQHandler + B USBD1_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EINT9_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT9_5_IRQHandler + B EINT9_5_IRQHandler + + PUBWEAK TMR1_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR1_BRK_IRQHandler + B TMR1_BRK_IRQHandler + + PUBWEAK TMR1_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR1_UP_IRQHandler + B TMR1_UP_IRQHandler + + PUBWEAK TMR1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR1_TRG_COM_IRQHandler + B TMR1_TRG_COM_IRQHandler + + PUBWEAK TMR1_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR1_CC_IRQHandler + B TMR1_CC_IRQHandler + + PUBWEAK TMR2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR2_IRQHandler + B TMR2_IRQHandler + + PUBWEAK TMR3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR3_IRQHandler + B TMR3_IRQHandler + + PUBWEAK TMR4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR4_IRQHandler + B TMR4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EINT15_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT15_10_IRQHandler + B EINT15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBDWakeUp_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBDWakeUp_IRQHandler + B USBDWakeUp_IRQHandler + + PUBWEAK TMR8_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR8_BRK_IRQHandler + B TMR8_BRK_IRQHandler + + PUBWEAK TMR8_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR8_UP_IRQHandler + B TMR8_UP_IRQHandler + + PUBWEAK TMR8_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR8_TRG_COM_IRQHandler + B TMR8_TRG_COM_IRQHandler + + PUBWEAK TMR8_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR8_CC_IRQHandler + B TMR8_CC_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK EMMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EMMC_IRQHandler + B EMMC_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDIO_IRQHandler + B SDIO_IRQHandler + + PUBWEAK TMR5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR5_IRQHandler + B TMR5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK TMR6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR6_IRQHandler + B TMR6_IRQHandler + + PUBWEAK TMR7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR7_IRQHandler + B TMR7_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel4_5_IRQHandler + B DMA2_Channel4_5_IRQHandler + + PUBWEAK USBD2_HP_CAN2_TX_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBD2_HP_CAN2_TX_IRQHandler + B USBD2_HP_CAN2_TX_IRQHandler + + PUBWEAK USBD2_LP_CAN2_RX0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBD2_LP_CAN2_RX0_IRQHandler + B USBD2_LP_CAN2_RX0_IRQHandler + + PUBWEAK CAN2_RX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CAN2_RX1_IRQHandler + B CAN2_RX1_IRQHandler + + PUBWEAK CAN2_SCE_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CAN2_SCE_IRQHandler + B CAN2_SCE_IRQHandler + + END + diff --git a/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/system_apm32e10x.c b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/system_apm32e10x.c new file mode 100644 index 0000000000..10c767084d --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/Device/Geehy/APM32E10x/Source/system_apm32e10x.c @@ -0,0 +1,659 @@ +/*! + * @file system_apm32e10x.c + * + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File + * + * @version V1.0.2 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2021-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "apm32e10x.h" + +/** @addtogroup CMSIS + @{ +*/ + +/** @addtogroup APM32E10x_System + * @brief APM32E10x system configuration + @{ +*/ + +/** @defgroup System_Macros + @{ +*/ + + +//#define SYSTEM_CLOCK_HSE HSE_VALUE +//#define SYSTEM_CLOCK_24MHz (24000000) +//#define SYSTEM_CLOCK_36MHz (36000000) +//#define SYSTEM_CLOCK_48MHz (48000000) +//#define SYSTEM_CLOCK_56MHz (56000000) +#define SYSTEM_CLOCK_72MHz (72000000) +//#define SYSTEM_CLOCK_96MHz (96000000) +//#define SYSTEM_CLOCK_120MHz (120000000) + +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 + +/**@} end of group System_Macros */ + +/** @defgroup System_Variables + @{ +*/ + +#ifdef SYSTEM_CLOCK_HSE +uint32_t SystemCoreClock = SYSTEM_CLOCK_HSE; +#elif defined SYSTEM_CLOCK_24MHz +uint32_t SystemCoreClock = SYSTEM_CLOCK_24MHz; +#elif defined SYSTEM_CLOCK_36MHz +uint32_t SystemCoreClock = SYSTEM_CLOCK_36MHz; +#elif defined SYSTEM_CLOCK_48MHz +uint32_t SystemCoreClock = SYSTEM_CLOCK_48MHz; +#elif defined SYSTEM_CLOCK_56MHz +uint32_t SystemCoreClock = SYSTEM_CLOCK_56MHz; +#elif defined SYSTEM_CLOCK_72MHz +uint32_t SystemCoreClock = SYSTEM_CLOCK_72MHz; +#elif defined SYSTEM_CLOCK_96MHz +uint32_t SystemCoreClock = SYSTEM_CLOCK_96MHz; +#else +uint32_t SystemCoreClock = SYSTEM_CLOCK_120MHz; +#endif + +/**@} end of group System_Variables */ + +/** @defgroup System_Functions + @{ +*/ + +static void SystemClockConfig(void); + +#ifdef SYSTEM_CLOCK_HSE +static void SystemClockHSE(void); +#elif defined SYSTEM_CLOCK_24MHz +static void SystemClock24M(void); +#elif defined SYSTEM_CLOCK_36MHz +static void SystemClock36M(void); +#elif defined SYSTEM_CLOCK_48MHz +static void SystemClock48M(void); +#elif defined SYSTEM_CLOCK_56MHz +static void SystemClock56M(void); +#elif defined SYSTEM_CLOCK_72MHz +static void SystemClock72M(void); +#elif defined SYSTEM_CLOCK_96MHz +static void SystemClock96M(void); +#elif defined SYSTEM_CLOCK_120MHz +static void SystemClock120M(void); +#endif + +/*! + * @brief Setup the microcontroller system + * + * @param None + * + * @retval None + * + * @note + */ +void SystemInit (void) +{ + /** Set HSIEN bit */ + RCM->CTRL_B.HSIEN = BIT_SET; + /** Reset SCLKSW, AHBPSC, APB1PSC, APB2PSC, ADCPSC and MCOSEL bits */ + RCM->CFG &= (uint32_t)0xF8FF0000; + /** Reset HSEEN, CSSEN and PLLEN bits */ + RCM->CTRL &= (uint32_t)0xFEF6FFFF; + /** Reset HSEBCFG bit */ + RCM->CTRL_B.HSEBCFG = BIT_RESET; + /** Reset PLLSRCSEL, PLLHSEPSC, PLLMULCFG and USBDIV bits */ + RCM->CFG &= (uint32_t)0xFF80FFFF; + /** Disable all interrupts and clear pending bits */ + RCM->INT = 0x009F0000; + + SystemClockConfig(); + +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; +#else + SCB->VTOR = FMC_BASE | VECT_TAB_OFFSET; +#endif +} + +/*! + * @brief Update SystemCoreClock variable according to Clock Register Values + * The SystemCoreClock variable contains the core clock (HCLK) + * + * @param None + * + * @retval None + * + * @note + */ +void SystemCoreClockUpdate (void) +{ + uint32_t sysClock, pllMull, pllSource, Prescaler; + uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + + sysClock = RCM->CFG_B.SCLKSWSTS; + + switch(sysClock) + { + /** sys clock is HSI */ + case 0: + SystemCoreClock = HSI_VALUE; + break; + + /** sys clock is HSE */ + case 1: + SystemCoreClock = HSE_VALUE; + break; + + /** sys clock is PLL */ + case 2: + pllMull = RCM->CFG_B.PLLMULCFG + 2; + pllSource = RCM->CFG_B.PLLSRCSEL; + + /** PLL entry clock source is HSE */ + if(pllSource == BIT_SET) + { + SystemCoreClock = HSE_VALUE * pllMull; + + /** HSE clock divided by 2 */ + if(pllSource == RCM->CFG_B.PLLHSEPSC) + { + SystemCoreClock >>= 1; + } + } + /** PLL entry clock source is HSI/2 */ + else + { + SystemCoreClock = (HSI_VALUE >> 1) * pllMull; + } + break; + + default: + SystemCoreClock = HSI_VALUE; + break; + } + + Prescaler = AHBPrescTable[RCM->CFG_B.AHBPSC]; + SystemCoreClock >>= Prescaler; +} + +/*! + * @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClockConfig(void) +{ +#ifdef SYSTEM_CLOCK_HSE + SystemClockHSE(); +#elif defined SYSTEM_CLOCK_24MHz + SystemClock24M(); +#elif defined SYSTEM_CLOCK_36MHz + SystemClock36M(); +#elif defined SYSTEM_CLOCK_48MHz + SystemClock48M(); +#elif defined SYSTEM_CLOCK_56MHz + SystemClock56M(); +#elif defined SYSTEM_CLOCK_72MHz + SystemClock72M(); +#elif defined SYSTEM_CLOCK_96MHz + SystemClock96M(); +#elif defined SYSTEM_CLOCK_120MHz + SystemClock120M(); +#endif +} + +#if defined SYSTEM_CLOCK_HSE +/*! + * @brief Selects HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClockHSE(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN= BIT_SET; + + for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if(RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if(RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 0 wait state */ + FMC->CTRL1_B.WS = 0; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC= 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC= 0; + /* PCLK1 = HCLK */ + RCM->CFG_B.APB1PSC = 0; + + /* Select HSE as system clock source */ + RCM->CFG_B.SCLKSW = 1; + + /** Wait till HSE is used as system clock source */ + while(RCM->CFG_B.SCLKSWSTS!= 0x01); + } +} + + +#elif defined SYSTEM_CLOCK_24MHz +/*! + * @brief Sets System clock frequency to 24MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClock24M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN= BIT_SET; + + for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if(RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if(RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 0 wait state */ + FMC->CTRL1_B.WS = 0; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC= 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC= 0; + /* PCLK1 = HCLK */ + RCM->CFG_B.APB1PSC = 0; + + /** PLL: (HSE / 2) * 6 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLHSEPSC = 1; + RCM->CFG_B.PLLMULCFG = 4; + + /** Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /** Wait PLL Ready */ + while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSW = 2; + /* Wait till PLL is used as system clock source */ + while(RCM->CFG_B.SCLKSWSTS!= 0x02); + } +} + +#elif defined SYSTEM_CLOCK_36MHz +/*! + * @brief Sets System clock frequency to 36MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClock36M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN= BIT_SET; + + for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if(RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if(RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 1 wait state */ + FMC->CTRL1_B.WS = 1; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC= 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC= 0; + /* PCLK1 = HCLK */ + RCM->CFG_B.APB1PSC = 0; + + /** PLL: (HSE / 2) * 9 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLHSEPSC = 1; + RCM->CFG_B.PLLMULCFG = 7; + + /** Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /** Wait PLL Ready */ + while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSW = 2; + /* Wait till PLL is used as system clock source */ + while(RCM->CFG_B.SCLKSWSTS != 0x02); + } +} + +#elif defined SYSTEM_CLOCK_48MHz +/*! + * @brief Sets System clock frequency to 46MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClock48M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN= BIT_SET; + + for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if(RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if(RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 1 wait state */ + FMC->CTRL1_B.WS = 1; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC= 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC= 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /** PLL: HSE * 6 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 4; + + /** Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /** Wait PLL Ready */ + while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSW = 2; + /* Wait till PLL is used as system clock source */ + while(RCM->CFG_B.SCLKSWSTS!= 0x02); + } +} + +#elif defined SYSTEM_CLOCK_56MHz +/*! + * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClock56M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN= BIT_SET; + + for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if(RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if(RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 2 wait state */ + FMC->CTRL1_B.WS = 2; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC= 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC= 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /** PLL: HSE * 7 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 5; + + /** Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /** Wait PLL Ready */ + while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSW = 2; + /* Wait till PLL is used as system clock source */ + while(RCM->CFG_B.SCLKSWSTS!= 0x02); + } +} + +#elif defined SYSTEM_CLOCK_72MHz +/*! + * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClock72M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN= BIT_SET; + + for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if(RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if(RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 2 wait state */ + FMC->CTRL1_B.WS = 2; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC= 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC= 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /** PLL: HSE * 9 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 7; + + /** Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /** Wait PLL Ready */ + while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSW = 2; + /* Wait till PLL is used as system clock source */ + while(RCM->CFG_B.SCLKSWSTS!= 0x02); + } + +} + +#elif defined SYSTEM_CLOCK_96MHz +/*! + * @brief Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClock96M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN= BIT_SET; + + for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if(RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if(RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 3 wait state */ + FMC->CTRL1_B.WS = 3; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC= 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC= 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /** PLL: HSE * 12 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 10; + + /** Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /** Wait PLL Ready */ + while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSW = 2; + /* Wait till PLL is used as system clock source */ + while(RCM->CFG_B.SCLKSWSTS!= 0x02); + } +} + +#elif defined SYSTEM_CLOCK_120MHz +/*! + * @brief Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + * @note + */ +static void SystemClock120M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN= BIT_SET; + + for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if(RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if(RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 3 wait state */ + FMC->CTRL1_B.WS = 3; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC= 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC= 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /** PLL: HSE * 15 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 13; + + /** Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /** Wait PLL Ready */ + while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSW = 2; + /* Wait till PLL is used as system clock source */ + while(RCM->CFG_B.SCLKSWSTS!= 0x02); + } +} +#endif + +/**@} end of group System_Functions */ +/**@} end of group APM32E10x_System */ +/**@} end of group CMSIS */ diff --git a/bsp/apm32/libraries/APM32E10x_Library/SConscript b/bsp/apm32/libraries/APM32E10x_Library/SConscript new file mode 100644 index 0000000000..c8c453079e --- /dev/null +++ b/bsp/apm32/libraries/APM32E10x_Library/SConscript @@ -0,0 +1,58 @@ +import rtconfig +Import('RTT_ROOT') +from building import * + +# get current directory +cwd = GetCurrentDir() + +# The set of source files associated with this SConscript file. +src = Split(""" +Device/Geehy/APM32E10x/Source/system_apm32e10x.c +APM32E10x_StdPeriphDriver/src/apm32e10x_gpio.c +APM32E10x_StdPeriphDriver/src/apm32e10x_misc.c +APM32E10x_StdPeriphDriver/src/apm32e10x_rcm.c +APM32E10x_StdPeriphDriver/src/apm32e10x_usart.c +APM32E10x_StdPeriphDriver/src/apm32e10x_eint.c +APM32E10x_StdPeriphDriver/src/apm32e10x_dma.c +""") + +if GetDepend(['RT_USING_ADC']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_adc.c'] + +if GetDepend(['RT_USING_DAC']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_dac.c'] + +if GetDepend(['RT_USING_RTC']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_rtc.c'] + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_pmu.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_spi.c'] + +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_tmr.c'] + +if GetDepend(['RT_USING_WDT']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_wwdt.c'] + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_iwdt.c'] + +if GetDepend(['RT_USING_CAN']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_can.c'] + +if GetDepend(['RT_USING_SDIO']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_sdio.c'] + +if GetDepend(['BSP_USING_SDRAM']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_dmc.c'] + +if GetDepend(['BSP_USING_ON_CHIP_FLASH']): + src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_fmc.c'] + +path = [cwd + '/Device/Geehy/APM32E10x/Include', + cwd + '/APM32E10x_StdPeriphDriver/inc', + cwd + '/CMSIS/Include'] + +CPPDEFINES = ['USE_STDPERIPH_DRIVER'] +group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_adc.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_adc.h new file mode 100644 index 0000000000..79f61f2d04 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_adc.h @@ -0,0 +1,327 @@ +/*! + * @file apm32s10x_adc.h + * + * @brief This file contains all the functions prototypes for the ADC firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_ADC_H +#define __APM32S10X_ADC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup ADC_Driver ADC Driver + @{ +*/ + +/** @defgroup ADC_Macros Macros + @{ +*/ + +/* ADC_IJD Offset */ +#define INJDATA_OFFSET ((uint8_t)0x28) + +/* ADC_RDG register address */ +#define RDG_ADDRESS ((uint32_t)0x4001244C) + +/* INJSEQ register config */ +#define INJSEQ_SET_INJSEQC ((uint32_t)0x0000001F) +#define INJSEQ_SET_INJSEQLEN ((uint32_t)0x00300000) + +/* SMPTIM register SET */ +#define SMPCYCCFG_SET_SMPTIM1 ((uint32_t)0x00000007) +#define SMPCYCCFG_SET_SMPTIM2 ((uint32_t)0x00000007) + +/* REGSEQ register SET */ +#define REGSEQC_SET_REGSEQ3 ((uint32_t)0x0000001F) +#define REGSEQC_SET_REGSEQ2 ((uint32_t)0x0000001F) +#define REGSEQC_SET_REGSEQ1 ((uint32_t)0x0000001F) + +/**@} end of group ADC_Macros */ + +/** @defgroup ADC_Enumerations Enumerations + @{ +*/ + +/** + * @brief ADC configuration Mode + */ +typedef enum +{ + ADC_MODE_INDEPENDENT = ((uint32_t)0x00000000), /*!< Independent mode */ + ADC_MODE_REG_INJEC_SIMULT = ((uint32_t)0x00010000), /*!< Combined regular simultaneous and injected simultaneous mode */ + ADC_MODE_REG_SIMULT_ALTER_TRIG = ((uint32_t)0x00020000), /*!< Combined regular simultaneous and alternate trigger mode */ + ADC_MODE_INJEC_SIMULT_FAST_TNTERL = ((uint32_t)0x00030000), /*!< Combined injected simultaneous and fast interleaved mode */ + ADC_MODE_INJEC_SIMULT_SLOW_INTERL = ((uint32_t)0x00040000), /*!< Combined injected simultaneous and slow interleaved mode */ + ADC_MODE_INJEC_SIMULT = ((uint32_t)0x00050000), /*!< Injected simultaneous mode */ + ADC_MODE_REG_SIMULT = ((uint32_t)0x00060000), /*!< Regular simultaneous mode */ + ADC_MODE_FAST_INTERL = ((uint32_t)0x00070000), /*!< Fast interleaved mode */ + ADC_MODE_SLOW_INTERL = ((uint32_t)0x00080000), /*!< Slow interleaved mode */ + ADC_MODE_ALTER_TRIG = ((uint32_t)0x00090000) /*!< Alternate trigger mode */ +} ADC_MODE_T; + +/** + * @brief ADC external trigger sources for regular channels conversion enumeration + */ +typedef enum +{ + ADC_EXT_TRIG_CONV_TMR1_CC1 = ((uint32_t)0x00000000), + ADC_EXT_TRIG_CONV_TMR1_CC2 = ((uint32_t)0x00020000), + ADC_EXT_TRIG_CONV_TMR1_CC3 = ((uint32_t)0x00040000), + ADC_EXT_TRIG_CONV_TMR2_CC2 = ((uint32_t)0x00060000), + ADC_EXT_TRIG_CONV_TMR3_TRGO = ((uint32_t)0x00080000), + ADC_EXT_TRIG_CONV_TMR4_CC4 = ((uint32_t)0x000A0000), + ADC_EXT_TRIG_CONV_EINT11 = ((uint32_t)0x000C0000), + ADC_EXT_TRIG_CONV_None = ((uint32_t)0x000E0000), +} ADC_EXT_TRIG_CONV_T; + +/** + * @brief ADC Data Align + */ +typedef enum +{ + ADC_DATA_ALIGN_RIGHT = 0x00000000, + ADC_DATA_ALIGN_LEFT = 0x00000800 +} ADC_DATA_ALIGN_T; + +/** + * @brief ADC Channels + */ +typedef enum +{ + ADC_CHANNEL_0 = ((uint8_t)0x00), + ADC_CHANNEL_1 = ((uint8_t)0x01), + ADC_CHANNEL_2 = ((uint8_t)0x02), + ADC_CHANNEL_3 = ((uint8_t)0x03), + ADC_CHANNEL_4 = ((uint8_t)0x04), + ADC_CHANNEL_5 = ((uint8_t)0x05), + ADC_CHANNEL_6 = ((uint8_t)0x06), + ADC_CHANNEL_7 = ((uint8_t)0x07), + ADC_CHANNEL_8 = ((uint8_t)0x08), + ADC_CHANNEL_9 = ((uint8_t)0x09), + ADC_CHANNEL_10 = ((uint8_t)0x0A), + ADC_CHANNEL_11 = ((uint8_t)0x0B), + ADC_CHANNEL_12 = ((uint8_t)0x0C), + ADC_CHANNEL_13 = ((uint8_t)0x0D), + ADC_CHANNEL_14 = ((uint8_t)0x0E), + ADC_CHANNEL_15 = ((uint8_t)0x0F), + ADC_CHANNEL_16 = ((uint8_t)0x10), + ADC_CHANNEL_TEMP_SENSOR = ((uint8_t)0x10), + ADC_CHANNEL_17 = ((uint8_t)0x11), + ADC_CHANNEL_V_REFINT = ((uint8_t)0x11) +} ADC_CHANNEL_T; + +/** + * @brief ADC Sampling Time + */ +typedef enum +{ + ADC_SAMPLETIME_1CYCLES5 = ((uint8_t)0x00), + ADC_SAMPLETIME_7CYCLES5 = ((uint8_t)0x01), + ADC_SAMPLETIME_13CYCLES5 = ((uint8_t)0x02), + ADC_SAMPLETIME_28CYCLES5 = ((uint8_t)0x03), + ADC_SAMPLETIME_41CYCLES5 = ((uint8_t)0x04), + ADC_SAMPLETIME_55CYCLES5 = ((uint8_t)0x05), + ADC_SAMPLETIME_71CYCLES5 = ((uint8_t)0x06), + ADC_SAMPLETIME_239CYCLES5 = ((uint8_t)0x07) +} ADC_SAMPLETIME_T; + +/** + * @brief ADC external trigger sources for injected channels conversion + */ +typedef enum +{ + ADC_EXT_TRIG_INJEC_CONV_TMR1_TRGO = ((uint8_t)0x00), + ADC_EXT_TRIG_INJEC_CONV_TMR1_CC4 = ((uint8_t)0x01), + ADC_EXT_TRIG_INJEC_CONV_TMR2_TRGO = ((uint8_t)0x02), + ADC_EXT_TRIG_INJEC_CONV_TMR2_CC1 = ((uint8_t)0x03), + ADC_EXT_TRIG_INJEC_CONV_TMR3_CC4 = ((uint8_t)0x04), + ADC_EXT_TRIG_INJEC_CONV_TMR4_TRGO = ((uint8_t)0x05), + ADC_EXT_TRIG_INJEC_CONV_EINT15 = ((uint8_t)0x06), + ADC_EXT_TRIG_INJEC_CONV_NONE = ((uint8_t)0x07), +} ADC_EXT_TRIG_INJEC_CONV_T; + +/** + * @brief ADC Injected channels + */ +typedef enum +{ + ADC_INJEC_CHANNEL_1 = ((uint8_t)0x14), + ADC_INJEC_CHANNEL_2 = ((uint8_t)0x18), + ADC_INJEC_CHANNEL_3 = ((uint8_t)0x1C), + ADC_INJEC_CHANNEL_4 = ((uint8_t)0x20) +} ADC_INJEC_CHANNEL_T; + +/** + * @brief ADC Analog Watchdog Selection + */ +typedef enum +{ + ADC_ANALOG_WATCHDOG_SINGLE_REG = ((uint32_t)0x00800200), + ADC_ANALOG_WATCHDOG_SINGLE_INJEC = ((uint32_t)0x00400200), + ADC_ANALOG_WATCHDOG_SINGLE_REG_INJEC = ((uint32_t)0x00C00200), + ADC_ANALOG_WATCHDOG_ALL_REG = ((uint32_t)0x00800000), + ADC_ANALOG_WATCHDOG_ALL_INJEC = ((uint32_t)0x00400000), + ADC_ANALOG_WATCHDOG_ALL_REG_ALL_INJEC = ((uint32_t)0x00C00000), + ADC_ANALOG_WATCHDOG_NONE = ((uint32_t)0x00000000) +} ADC_ANALOG_WATCHDOG_T; + +/** + * @brief ADC Interrupt definition + */ +typedef enum +{ + ADC_INT_AWD = ((uint16_t)0x0140), /*!< Analog Watchdog interrupt */ + ADC_INT_EOC = ((uint16_t)0x0220), /*!< End Of Conversion interrupt */ + ADC_INT_INJEOC = ((uint16_t)0x0480) /*!< Injected Channel End Of Conversion interrupt */ +} ADC_INT_T; + +/** + * @brief ADC Flag + */ +typedef enum +{ + ADC_FLAG_AWD = ((uint8_t)0x01), /*!< Analog Watchdog event occur flag */ + ADC_FLAG_EOC = ((uint8_t)0x02), /*!< End Of Conversion flag */ + ADC_FLAG_INJEOC = ((uint8_t)0x04), /*!< Injected Channel End Of Conversion flag */ + ADC_FLAG_INJCS = ((uint8_t)0x08), /*!< Injected Channel Conversion Start flag */ + ADC_FLAG_REGCS = ((uint8_t)0x10) /*!< Regular Channel Conversion Start flag */ +} ADC_FLAG_T; + +/**@} end of group ADC_Enumerations */ + +/** @defgroup ADC_Structures Structures + @{ +*/ + +/** + * @brief ADC Configure structure definition + */ +typedef struct +{ + ADC_MODE_T mode; + uint8_t scanConvMode; /*!< This parameter can be ENABLE or DISABLE */ + uint8_t continuosConvMode; /*!< This parameter can be ENABLE or DISABLE */ + ADC_EXT_TRIG_CONV_T externalTrigConv; + ADC_DATA_ALIGN_T dataAlign; + uint8_t nbrOfChannel; /*!< This parameter must range from 1 to 16 */ +} ADC_Config_T; + +/**@} end of group ADC_Structures */ + +/** @defgroup ADC_Functions Functions + @{ +*/ + +/* ADC reset and common configuration */ +void ADC_Reset(ADC_T* adc); +void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig); +void ADC_ConfigStructInit(ADC_Config_T* adcConfig); +void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime); +void ADC_Enable(ADC_T* adc); +void ADC_Disable(ADC_T* adc); + +/* ADC for DMA */ +void ADC_EnableDMA(ADC_T* adc); +void ADC_DisableDMA(ADC_T* adc); + +/* ADC Calibration */ +void ADC_ResetCalibration(ADC_T* adc); +uint8_t ADC_ReadResetCalibrationStatus(ADC_T* adc); +void ADC_StartCalibration(ADC_T* adc); +uint8_t ADC_ReadCalibrationStartFlag(ADC_T* adc); + +/* ADC software start conversion */ +void ADC_EnableSoftwareStartConv(ADC_T* adc); +void ADC_DisableSoftwareStartConv(ADC_T* adc); +uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T* adc); + +/* ADC Discontinuous mode */ +void ADC_ConfigDiscMode(ADC_T* adc, uint8_t number); +void ADC_EnableDiscMode(ADC_T* adc); +void ADC_DisableDiscMode(ADC_T* adc); + +/* ADC External trigger conversion */ +void ADC_EnableExternalTrigConv(ADC_T* adc); +void ADC_DisableExternalTrigConv(ADC_T* adc); + +/* ADC Conversion result */ +uint16_t ADC_ReadConversionValue(ADC_T* adc); +uint32_t ADC_ReadDualModeConversionValue(ADC_T* adc); + +/* ADC Automatic injected group */ +void ADC_EnableAutoInjectedConv(ADC_T* adc); +void ADC_DisableAutoInjectedConv(ADC_T* adc); +void ADC_EnableInjectedDiscMode(ADC_T* adc); +void ADC_DisableInjectedDiscMode(ADC_T* adc); + +/* ADC External trigger for injected channels conversion */ +void ADC_ConfigExternalTrigInjectedConv(ADC_T* adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv); +void ADC_EnableExternalTrigInjectedConv(ADC_T* adc); +void ADC_DisableExternalTrigInjectedConv(ADC_T* adc); + +/* ADC Start of the injected channels conversion */ +void ADC_EnableSoftwareStartInjectedConv(ADC_T* adc); +void ADC_DisableSoftwareStartInjectedConv(ADC_T* adc); +uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T* adc); + +/* ADC injected channel */ +void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime); +void ADC_ConfigInjectedSequencerLength(ADC_T* adc, uint8_t length); +void ADC_ConfigInjectedOffset(ADC_T* adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet); +uint16_t ADC_ReadInjectedConversionValue(ADC_T* adc, ADC_INJEC_CHANNEL_T channel); + +/* ADC analog watchdog */ +void ADC_EnableAnalogWatchdog(ADC_T* adc, uint32_t analogWatchdog); +void ADC_DisableAnalogWatchdog(ADC_T* adc); +void ADC_ConfigAnalogWatchdogThresholds(ADC_T* adc, uint16_t highThreshold, uint16_t lowThreshold); +void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T* adc, uint8_t channel); + +/* ADC temperature sensor */ +void ADC_EnableTempSensorVrefint(ADC_T* adc); +void ADC_DisableTempSensorVrefint(ADC_T* adc); + +/* Interrupt and flag */ +void ADC_EnableInterrupt(ADC_T* adc, uint16_t interrupt); +void ADC_DisableInterrupt(ADC_T* adc, uint16_t interrupt); +uint8_t ADC_ReadStatusFlag(ADC_T* adc, ADC_FLAG_T flag); +void ADC_ClearStatusFlag(ADC_T* adc, uint8_t flag); +uint8_t ADC_ReadIntFlag(ADC_T* adc, ADC_INT_T flag); +void ADC_ClearIntFlag(ADC_T* adc, uint16_t flag); + +/**@} end of group ADC_Functions */ +/**@} end of group ADC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_ADC_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_bakpr.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_bakpr.h new file mode 100644 index 0000000000..317f1f3a09 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_bakpr.h @@ -0,0 +1,118 @@ +/*! + * @file apm32s10x_bakr.h + * + * @brief This file contains all the functions prototypes for the BAKPR firmware library. + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_BAKPR_H +#define __APM32S10X_BAKPR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup BAKPR_Driver BAKPR Driver + @{ +*/ + +/** @defgroup BAKPR_Enumerations Enumerations + @{ +*/ + +/** + * @brief BAKPR TAMPER Pin Active Level + */ +typedef enum +{ + BAKPR_TAMPER_PIN_LEVEL_HIGH, + BAKPR_TAMPER_PIN_LEVEL_LOW +} BAKPR_TAMPER_PIN_LEVEL_T; + +/** + * @brief BAKPR RTC output source + */ +typedef enum +{ + BAKPR_RTC_OUTPUT_SOURCE_NONE, + BAKPR_RTC_OUTPUT_SOURCE_CALIBRATION_CLOCK, + BAKPR_RTC_OUTPUT_SOURCE_ALARM, + BAKPR_RTC_OUTPUT_SOURCE_SECOND +} BAKPR_RTC_OUTPUT_SOURCE_T; + +/** + * @brief BAKPR DATA register Addr + */ +typedef enum +{ + BAKPR_DATA1 = ((uint16_t)0x0004), + BAKPR_DATA2 = ((uint16_t)0x0008), + BAKPR_DATA3 = ((uint16_t)0x000C), + BAKPR_DATA4 = ((uint16_t)0x0010), + BAKPR_DATA5 = ((uint16_t)0x0014), + BAKPR_DATA6 = ((uint16_t)0x0018), + BAKPR_DATA7 = ((uint16_t)0x001C), + BAKPR_DATA8 = ((uint16_t)0x0020), + BAKPR_DATA9 = ((uint16_t)0x0024), + BAKPR_DATA10 = ((uint16_t)0x0028) +} BAKPR_DATA_T; + +/**@} end of group BAKPR_Enumerations */ + +/** @defgroup BAKPR_Functions Functions + @{ +*/ + +/* BAKPR reset and configuration */ +void BAKPR_Reset(void); +void BAKPR_ConfigTamperPinLevel(BAKPR_TAMPER_PIN_LEVEL_T value); +void BAKPR_EnableTamperPin(void); +void BAKPR_DisableTamperPin(void); +void BAKPR_ConfigRTCOutput(BAKPR_RTC_OUTPUT_SOURCE_T soure); +void BAKPR_ConfigRTCCalibrationValue(uint8_t calibrationValue); +void BAKPR_ConfigBackupRegister(BAKPR_DATA_T bakrData, uint16_t data); +uint16_t BAKPR_ReadBackupRegister(BAKPR_DATA_T bakrData); + +/* Interrupts and flags */ +void BAKPR_EnableInterrupt(void); +void BAKPR_DisableInterrupt(void); +uint8_t BAKPR_ReadStatusFlag(void); +void BAKPR_ClearStatusFlag(void); +uint8_t BAKPR_ReadIntFlag(void); +void BAKPR_ClearIntFlag(void); + +/**@} end of group BAKPR_Functions */ +/**@} end of group BAKPR_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_BAKPR_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_can.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_can.h new file mode 100644 index 0000000000..24292325c9 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_can.h @@ -0,0 +1,349 @@ +/*! + * @file apm32s10x_can.h + * + * @brief This file contains all the functions prototypes for the CAN firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_CAN_H +#define __APM32S10X_CAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup CAN_Driver CAN Driver + @{ +*/ + +/** @defgroup CAN_Enumerations Enumerations + @{ +*/ + +/** + * @brief CAN mode + */ +typedef enum +{ + CAN_MODE_NORMAL = ((uint8_t)0x00), /*!< normal mode */ + CAN_MODE_LOOPBACK = ((uint8_t)0x01), /*!< loopback mode */ + CAN_MODE_SILENT = ((uint8_t)0x02), /*!< silent mode */ + CAN_MODE_SILENT_LOOPBACK = ((uint8_t)0x03) /*!< loopback combined with silent mode */ +} CAN_MODE_T; + +/** + * @brief CAN synchronisation jump width + */ +typedef enum +{ + CAN_SJW_1 = ((uint8_t)0x00), /*!< 1 time quantum */ + CAN_SJW_2 = ((uint8_t)0x01), /*!< 2 time quantum */ + CAN_SJW_3 = ((uint8_t)0x02), /*!< 3 time quantum */ + CAN_SJW_4 = ((uint8_t)0x03) /*!< 4 time quantum */ +} CAN_SJW_T; + +/** + * @brief CAN time quantum in bit segment 1 + */ +typedef enum +{ + CAN_TIME_SEGMENT1_1 = ((uint8_t)0x00), /*!< 1 time quanta */ + CAN_TIME_SEGMENT1_2 = ((uint8_t)0x01), /*!< 2 time quanta */ + CAN_TIME_SEGMENT1_3 = ((uint8_t)0x02), /*!< 3 time quanta */ + CAN_TIME_SEGMENT1_4 = ((uint8_t)0x03), /*!< 4 time quanta */ + CAN_TIME_SEGMENT1_5 = ((uint8_t)0x04), /*!< 5 time quanta */ + CAN_TIME_SEGMENT1_6 = ((uint8_t)0x05), /*!< 6 time quanta */ + CAN_TIME_SEGMENT1_7 = ((uint8_t)0x06), /*!< 7 time quanta */ + CAN_TIME_SEGMENT1_8 = ((uint8_t)0x07), /*!< 8 time quanta */ + CAN_TIME_SEGMENT1_9 = ((uint8_t)0x08), /*!< 9 time quanta */ + CAN_TIME_SEGMENT1_10 = ((uint8_t)0x09), /*!< 10 time quanta */ + CAN_TIME_SEGMENT1_11 = ((uint8_t)0x0A), /*!< 11 time quanta */ + CAN_TIME_SEGMENT1_12 = ((uint8_t)0x0B), /*!< 12 time quanta */ + CAN_TIME_SEGMENT1_13 = ((uint8_t)0x0C), /*!< 13 time quanta */ + CAN_TIME_SEGMENT1_14 = ((uint8_t)0x0D), /*!< 14 time quanta */ + CAN_TIME_SEGMENT1_15 = ((uint8_t)0x0E), /*!< 15 time quanta */ + CAN_TIME_SEGMENT1_16 = ((uint8_t)0x0F) /*!< 16 time quanta */ +} CAN_TIME_SEGMENT1_T; + +/** + * @brief CAN time quantum in bit segment 2 + */ +typedef enum +{ + CAN_TIME_SEGMENT2_1 = (uint8_t)0x00, /*!< 1 time quanta */ + CAN_TIME_SEGMENT2_2 = (uint8_t)0x01, /*!< 2 time quanta */ + CAN_TIME_SEGMENT2_3 = (uint8_t)0x02, /*!< 3 time quanta */ + CAN_TIME_SEGMENT2_4 = (uint8_t)0x03, /*!< 4 time quanta */ + CAN_TIME_SEGMENT2_5 = (uint8_t)0x04, /*!< 5 time quanta */ + CAN_TIME_SEGMENT2_6 = (uint8_t)0x05, /*!< 6 time quanta */ + CAN_TIME_SEGMENT2_7 = (uint8_t)0x06, /*!< 7 time quanta */ + CAN_TIME_SEGMENT2_8 = (uint8_t)0x07 /*!< 8 time quanta */ +} CAN_TIME_SEGMENT2_T; + +/** + * @brief CAN filter FIFO + */ +typedef enum +{ + CAN_FILTER_FIFO_0 = ((uint8_t)0x00), /*!< filter FIFO 0 */ + CAN_FILTER_FIFO_1 = ((uint8_t)0x01) /*!< filter FIFO 1 */ +} CAN_FILTER_FIFO_T; + +/** + * @brief CAN filter mode + */ +typedef enum +{ + CAN_FILTER_MODE_IDMASK = ((uint8_t)0x00),/*!< identifier/mask mode */ + CAN_FILTER_MODE_IDLIST = ((uint8_t)0x01) /*!< identifier list mode */ +} CAN_FILTER_MODE_T; + +/** + * @brief CAN filter scale + */ +typedef enum +{ + CAN_FILTER_SCALE_16BIT = ((uint8_t)0x00), /*!< Two 16-bit filters */ + CAN_FILTER_SCALE_32BIT = ((uint8_t)0x01) /*!< One 32-bit filter */ +} CAN_FILTER_SCALE_T; + +/** + * @brief CAN identifier type + */ +typedef enum +{ + CAN_TYPEID_STD = ((uint32_t)0x00000000), /*!< Standard Id */ + CAN_TYPEID_EXT = ((uint32_t)0x00000004) /*!< Extended Id */ +} CAN_TYPEID_T; + +/** + * @brief CAN_remote_transmission_request + */ +typedef enum +{ + CAN_RTXR_DATA = ((uint32_t)0x00000000), /*!< Data frame */ + CAN_RTXR_REMOTE = ((uint32_t)0x00000002) /*!< Remote frame */ +} CAN_RTXR_T; + +/** + * @brief Mailboxes definition + */ +typedef enum +{ + CAN_TX_MAILBIX_0 = ((uint8_t)0x00), /*!< Tx mailbox0 */ + CAN_TX_MAILBIX_1 = ((uint8_t)0x01), /*!< Tx mailbox1 */ + CAN_TX_MAILBIX_2 = ((uint8_t)0x02) /*!< Tx mailbox2 */ +} CAN_TX_MAILBIX_T; + +/** + * @brief CAN receive FIFO number constants + */ +typedef enum +{ + CAN_RX_FIFO_0 = ((uint8_t)0x00), /*!< receive FIFO 0 */ + CAN_RX_FIFO_1 = ((uint8_t)0x01) /*!< receive FIFO 1 */ +} CAN_RX_FIFO_T; + +/** + * @brief CAN Operating Mode + */ +typedef enum +{ + CAN_OPERATING_MODE_INIT = ((uint8_t)0x00), /*!< Initialization mode */ + CAN_OPERATING_MODE_NORMAL = ((uint8_t)0x01), /*!< Normal mode */ + CAN_OPERATING_MODE_SLEEP = ((uint8_t)0x02) /*!< sleep mode */ +} CAN_OPERATING_MODE_T; + +/** + * @brief CAN Interrupts + */ +typedef enum +{ + CAN_INT_TXME = ((uint32_t)0x00000001), /*!< Transmit mailbox empty Interrupt */ + CAN_INT_F0MP = ((uint32_t)0x00000002), /*!< FIFO 0 message pending Interrupt */ + CAN_INT_F0FULL = ((uint32_t)0x00000004), /*!< FIFO 0 full Interrupt */ + CAN_INT_F0OVR = ((uint32_t)0x00000008), /*!< FIFO 0 overrun Interrupt */ + CAN_INT_F1MP = ((uint32_t)0x00000010), /*!< FIFO 1 message pending Interrupt */ + CAN_INT_F1FULL = ((uint32_t)0x00000020), /*!< FIFO 1 full Interrupt */ + CAN_INT_F1OVR = ((uint32_t)0x00000040), /*!< FIFO 1 overrun Interrupt */ + CAN_INT_ERRW = ((uint32_t)0x00000100), /*!< Error warning Interrupt */ + CAN_INT_ERRP = ((uint32_t)0x00000200), /*!< Error passive Interrupt */ + CAN_INT_BOF = ((uint32_t)0x00000400), /*!< Bus-off Interrupt */ + CAN_INT_LEC = ((uint32_t)0x00000800), /*!< Last error record code Interrupt */ + CAN_INT_ERR = ((uint32_t)0x00008000), /*!< Error Interrupt */ + CAN_INT_WUP = ((uint32_t)0x00010000), /*!< Wake-up Interrupt */ + CAN_INT_SLEEP = ((uint32_t)0x00020000) /*!< Sleep acknowledge Interrupt */ +} CAN_INT_T; + +/** + * @brief CAN Flags + */ +typedef enum +{ + /* Error flag */ + CAN_FLAG_ERRW = ((uint32_t)0x10F00001), /*!< Error Warning Flag */ + CAN_FLAG_ERRP = ((uint32_t)0x10F00002), /*!< Error Passive Flag */ + CAN_FLAG_BOF = ((uint32_t)0x10F00004), /*!< Bus-Off Flag */ + CAN_FLAG_LERRC = ((uint32_t)0x30F00070), /*!< Last error record code Flag */ + /* Operating Mode Flags */ + CAN_FLAG_WUPI = ((uint32_t)0x31000008), /*!< Wake up Flag */ + CAN_FLAG_SLEEP = ((uint32_t)0x31000012), /*!< Sleep acknowledge Flag */ + /* Receive Flags */ + CAN_FLAG_F0MP = ((uint32_t)0x12000003), /*!< FIFO 0 Message Pending Flag */ + CAN_FLAG_F0FULL = ((uint32_t)0x32000008), /*!< FIFO 0 Full Flag */ + CAN_FLAG_F0OVR = ((uint32_t)0x32000010), /*!< FIFO 0 Overrun Flag */ + CAN_FLAG_F1MP = ((uint32_t)0x14000003), /*!< FIFO 1 Message Pending Flag */ + CAN_FLAG_F1FULL = ((uint32_t)0x34000008), /*!< FIFO 1 Full Flag */ + CAN_FLAG_F1OVR = ((uint32_t)0x34000010), /*!< FIFO 1 Overrun Flag */ + /* Transmit Flags */ + CAN_FLAG_REQC0 = ((uint32_t)0x38000001), /*!< Request MailBox0 Flag */ + CAN_FLAG_REQC1 = ((uint32_t)0x38000100), /*!< Request MailBox1 Flag */ + CAN_FLAG_REQC2 = ((uint32_t)0x38010000) /*!< Request MailBox2 Flag */ +} CAN_FLAG_T; + +/**@} end of group CAN_Enumerations */ + +/** @defgroup CAN_Structures Structures + @{ +*/ + +/** + * @brief CAN configure structure definition + */ +typedef struct +{ + uint8_t autoBusOffManage; /*!< Enable or disable the automatic bus-off management. */ + uint8_t autoWakeUpMode; /*!< Enable or disable the automatic wake-up mode. */ + uint8_t nonAutoRetran; /*!< Enable or disable the non-automatic retransmission mode. */ + uint8_t rxFIFOLockMode; /*!< Enable or disable the Receive FIFO Locked mode. */ + uint8_t txFIFOPriority; /*!< Enable or disable the transmit FIFO priority. */ + CAN_MODE_T mode; /*!< Specifies the CAN operating mode. */ + CAN_SJW_T syncJumpWidth; /*!< Specifies the maximum number of time quanta the CAN hardware + * is allowed to lengthen or shorten a bit to perform resynchronization. + */ + CAN_TIME_SEGMENT1_T timeSegment1; /*!< Specifies the number of time quanta in Bit Segment 1. */ + CAN_TIME_SEGMENT2_T timeSegment2; /*!< Specifies the number of time quanta in Bit Segment 2. */ + uint16_t prescaler; /*!< Specifies the length of a time quantum. It can be 1 to 1024. */ +} CAN_Config_T; + +/** + * @brief CAN Tx message structure definition + */ +typedef struct +{ + uint32_t stdID; /*!< Specifies the standard identifier. It can be 0 to 0x7FF. */ + uint32_t extID; /*!< Specifies the extended identifier. It can be 0 to 0x1FFFFFFF. */ + CAN_TYPEID_T typeID; + CAN_RTXR_T remoteTxReq; + uint8_t dataLengthCode;/*!< Specifies the data length code. It can be 0 to 8. */ + uint8_t data[8]; /*!< Specifies the data to be transmitted. It can be 0 to 0xFF. */ +} CAN_TxMessage_T; + +/** + * @brief CAN Rx message structure definition + */ +typedef struct +{ + uint32_t stdID; /*!< Specifies the standard identifier. It can be 0 to 0x7FF. */ + uint32_t extID; /*!< Specifies the extended identifier. It can be 0 to 0x1FFFFFFF. */ + uint32_t typeID; + uint32_t remoteTxReq; + uint8_t dataLengthCode; /*!< Specifies the data length code. It can be 0 to 8. */ + uint8_t data[8]; /*!< Specifies the data to be transmitted. It can be 0 to 0xFF. */ + uint8_t filterMatchIndex;/*!< Specifies the filter match index. It can be 0 to 0xFF. */ +} CAN_RxMessage_T; + +/** + * @brief CAN filter configure structure definition + */ +typedef struct +{ + uint8_t filterNumber; /*!< Specifies the filter number. It can be 0 to 13. */ + uint16_t filterIdHigh; /*!< Specifies the filter identification number.It can be 0 to 0xFFFF. */ + uint16_t filterIdLow; /*!< Specifies the filter identification number.It can be 0 to 0xFFFF. */ + uint16_t filterMaskIdHigh; /*!< Specifies the filter mask identification. It can be 0 to 0xFFFF. */ + uint16_t filterMaskIdLow; /*!< Specifies the filter mask identification. It can be 0 to 0xFFFF. */ + uint16_t filterActivation; /*!< Specifies the filter Activation. It can be ENABLE or DISABLE. */ + CAN_FILTER_FIFO_T filterFIFO; + CAN_FILTER_MODE_T filterMode; + CAN_FILTER_SCALE_T filterScale; +} CAN_FilterConfig_T; + +/**@} end of group CAN_Structures */ + +/** @defgroup CAN_Functions Functions + @{ +*/ + +/* CAN reset and configuration */ +void CAN_Reset(CAN_T* can); +uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig); +void CAN_ConfigFilter(CAN_T* can, CAN_FilterConfig_T* filterConfig); +void CAN_ConfigStructInit(CAN_Config_T* canConfig); +void CAN_EnableDBGFreeze(CAN_T* can); +void CAN_DisableDBGFreeze(CAN_T* can); +void CAN_SlaveStartBank(CAN_T* can, uint8_t bankNum); + +/* CAN frames transmit */ +uint8_t CAN_TxMessage(CAN_T* can, CAN_TxMessage_T* TxMessage); +uint8_t CAN_TxMessageStatus(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox); +void CAN_CancelTxMailbox(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox); + +/* CAN frames receive */ +void CAN_RxMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber, CAN_RxMessage_T* RxMessage); +void CAN_ReleaseFIFO(CAN_T* can, CAN_RX_FIFO_T FIFONumber); +uint8_t CAN_PendingMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber); + +/* CAN operation modes */ +uint8_t CAN_OperatingMode(CAN_T* can, CAN_OPERATING_MODE_T operatingMode); +uint8_t CAN_SleepMode(CAN_T* can); +uint8_t CAN_WakeUpMode(CAN_T* can); + +/* CAN bus error management */ +uint8_t CAN_ReadLastErrorCode(CAN_T* can); +uint8_t CAN_ReadRxErrorCounter(CAN_T* can); +uint8_t CAN_ReadLSBTxErrorCounter(CAN_T* can); + +/* CAN interrupt and flag */ +void CAN_EnableInterrupt(CAN_T* can, uint32_t interrupt); +void CAN_DisableInterrupt(CAN_T* can, uint32_t interrupt); +uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag); +void CAN_ClearStatusFlag(CAN_T* can, CAN_FLAG_T flag); +uint8_t CAN_ReadIntFlag(CAN_T* can, CAN_INT_T flag); +void CAN_ClearIntFlag(CAN_T* can, CAN_INT_T flag); + +/**@} end of group CAN_Functions */ +/**@} end of group CAN_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_CAN_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_crc.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_crc.h new file mode 100644 index 0000000000..7975bdbfdf --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_crc.h @@ -0,0 +1,68 @@ +/*! + * @file apm32s10x_crc.h + * + * @brief This file contains all the functions prototypes for the CRC firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_CRC_H +#define __APM32S10X_CRC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup CRC_Driver CRC Driver + @{ +*/ + +/** @defgroup CRC_Functions Functions + @{ +*/ + +/* Reset DATA */ +void CRC_ResetDATA(void); + +/* Operation functions */ +uint32_t CRC_CalculateCRC(uint32_t data); +uint32_t CRC_CalculateBlockCRC(uint32_t* buf, uint32_t bufLen); +uint32_t CRC_ReadCRC(void); +void CRC_WriteIDRegister(uint8_t inData); +uint8_t CRC_ReadIDRegister(void); + +/**@} end of group CRC_Functions */ +/**@} end of group CRC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_CRC_H */ + diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_dbgmcu.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_dbgmcu.h new file mode 100644 index 0000000000..c8a5e5777d --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_dbgmcu.h @@ -0,0 +1,90 @@ +/*! + * @file apm32s10x_dbgmcu.h + * + * @brief This file contains all the functions prototypes for the DBUGMCU firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_DBGMCU_H +#define __APM32S10X_DBGMCU_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DBGMCU_Driver DBGMCU Driver + @{ +*/ + +/** @defgroup DBGMCU_Enumerations Enumerations + @{ +*/ + +enum +{ + DBGMCU_SLEEP = ((uint32_t)0x00000001), + DBGMCU_STOP = ((uint32_t)0x00000002), + DBGMCU_STANDBY = ((uint32_t)0x00000004), + DBGMCU_IOEN = ((uint32_t)0x00000020), + DBGMCU_IOMODE0 = ((uint32_t)0x00000000), + DBGMCU_IOMODE1 = ((uint32_t)0x00000040), + DBGMCU_IOMODE2 = ((uint32_t)0x00000080), + DBGMCU_IOMODE3 = ((uint32_t)0x000000C0), + DBGMCU_IWDT_STOP = ((uint32_t)0x00000100), + DBGMCU_WWDT_STOP = ((uint32_t)0x00000200), + DBGMCU_TMR1_STOP = ((uint32_t)0x00000400), + DBGMCU_TMR2_STOP = ((uint32_t)0x00000800), + DBGMCU_TMR3_STOP = ((uint32_t)0x00001000), + DBGMCU_TMR4_STOP = ((uint32_t)0x00002000), + DBGMCU_CAN1_STOP = ((uint32_t)0x00004000), + DBGMCU_I2C1_SMBUS_TIMEOUT = ((uint32_t)0x00008000), + DBGMCU_I2C2_SMBUS_TIMEOUT = ((uint32_t)0x00010000), + DBGMCU_CAN2_STOP = ((uint32_t)0x00200000) +}; + +/**@} end of group DBGMCU_Enumerations */ + +/** @defgroup DBGMCU_Functions Functions + @{ +*/ + +uint32_t DBGMCU_ReadDEVID(void); +uint32_t DBGMCU_ReadREVID(void); +void DBGMCU_Enable(uint32_t periph); +void DBGMCU_Disable(uint32_t periph); + +/**@} end of group DBGMCU_Functions */ +/**@} end of group DBGMCU_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_DBGMCU_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_dma.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_dma.h new file mode 100644 index 0000000000..821809242d --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_dma.h @@ -0,0 +1,262 @@ +/*! + * @file apm32s10x_dma.h + * + * @brief This file contains all the functions prototypes for the DMA firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_DMA_H +#define __APM32S10X_DMA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DMA_Driver DMA Driver + @{ +*/ + +/** @defgroup DMA_Enumerations Enumerations + @{ +*/ + +/** + * @brief DMA Transmission direction + */ +typedef enum +{ + DMA_DIR_PERIPHERAL_SRC, + DMA_DIR_PERIPHERAL_DST +} DMA_DIR_T; + +/** + * @brief DMA Peripheral address increment + */ +typedef enum +{ + DMA_PERIPHERAL_INC_DISABLE, + DMA_PERIPHERAL_INC_ENABLE +} DMA_PERIPHERAL_INC_T; + +/** + * @brief DMA Memory address increment + */ +typedef enum +{ + DMA_MEMORY_INC_DISABLE, + DMA_MEMORY_INC_ENABLE +} DMA_MEMORY_INC_T; + +/** + * @brief DMA Peripheral Data Size + */ +typedef enum +{ + DMA_PERIPHERAL_DATA_SIZE_BYTE, + DMA_PERIPHERAL_DATA_SIZE_HALFWORD, + DMA_PERIPHERAL_DATA_SIZE_WOED +} DMA_PERIPHERAL_DATA_SIZE_T; + +/** + * @brief DMA Memory Data Size + */ +typedef enum +{ + DMA_MEMORY_DATA_SIZE_BYTE, + DMA_MEMORY_DATA_SIZE_HALFWORD, + DMA_MEMORY_DATA_SIZE_WOED +} DMA_MEMORY_DATA_SIZE_T; + +/** + * @brief DMA Mode + */ +typedef enum +{ + DMA_MODE_NORMAL, + DMA_MODE_CIRCULAR +} DMA_LOOP_MODE_T; + +/** + * @brief DMA priority level + */ +typedef enum +{ + DMA_PRIORITY_LOW, + DMA_PRIORITY_MEDIUM, + DMA_PRIORITY_HIGH, + DMA_PRIORITY_VERYHIGH +} DMA_PRIORITY_T; + +/** + * @brief DMA Memory to Memory + */ +typedef enum +{ + DMA_M2MEN_DISABLE, + DMA_M2MEN_ENABLE +} DMA_M2MEN_T; + +/** + * @brief DMA interrupt + */ +typedef enum +{ + DMA_INT_TC = 0x00000002, + DMA_INT_HT = 0x00000004, + DMA_INT_TERR = 0x00000008 +} DMA_INT_T; + +/** + * @brief DMA Flag + */ +typedef enum +{ + DMA1_FLAG_GINT1 = 0x00000001, + DMA1_FLAG_TC1 = 0x00000002, + DMA1_FLAG_HT1 = 0x00000004, + DMA1_FLAG_TERR1 = 0x00000008, + DMA1_FLAG_GINT2 = 0x00000010, + DMA1_FLAG_TC2 = 0x00000020, + DMA1_FLAG_HT2 = 0x00000040, + DMA1_FLAG_TERR2 = 0x00000080, + DMA1_FLAG_GINT3 = 0x00000100, + DMA1_FLAG_TC3 = 0x00000200, + DMA1_FLAG_HT3 = 0x00000400, + DMA1_FLAG_TERR3 = 0x00000800, + DMA1_FLAG_GINT4 = 0x00001000, + DMA1_FLAG_TC4 = 0x00002000, + DMA1_FLAG_HT4 = 0x00004000, + DMA1_FLAG_TERR4 = 0x00008000, + DMA1_FLAG_GINT5 = 0x00010000, + DMA1_FLAG_TC5 = 0x00020000, + DMA1_FLAG_HT5 = 0x00040000, + DMA1_FLAG_TERR5 = 0x00080000, + DMA1_FLAG_GINT6 = 0x00100000, + DMA1_FLAG_TC6 = 0x00200000, + DMA1_FLAG_HT6 = 0x00400000, + DMA1_FLAG_TERR6 = 0x00800000, + DMA1_FLAG_GINT7 = 0x01000000, + DMA1_FLAG_TC7 = 0x02000000, + DMA1_FLAG_HT7 = 0x04000000, + DMA1_FLAG_TERR7 = 0x08000000, +} DMA_FLAG_T; + +/** + * @brief DMA Interrupt Flag + */ +typedef enum +{ + DMA1_INT_FLAG_GINT1 = 0x00000001, + DMA1_INT_FLAG_TC1 = 0x00000002, + DMA1_INT_FLAG_HT1 = 0x00000004, + DMA1_INT_FLAG_TERR1 = 0x00000008, + DMA1_INT_FLAG_GINT2 = 0x00000010, + DMA1_INT_FLAG_TC2 = 0x00000020, + DMA1_INT_FLAG_HT2 = 0x00000040, + DMA1_INT_FLAG_TERR2 = 0x00000080, + DMA1_INT_FLAG_GINT3 = 0x00000100, + DMA1_INT_FLAG_TC3 = 0x00000200, + DMA1_INT_FLAG_HT3 = 0x00000400, + DMA1_INT_FLAG_TERR3 = 0x00000800, + DMA1_INT_FLAG_GINT4 = 0x00001000, + DMA1_INT_FLAG_TC4 = 0x00002000, + DMA1_INT_FLAG_HT4 = 0x00004000, + DMA1_INT_FLAG_TERR4 = 0x00008000, + DMA1_INT_FLAG_GINT5 = 0x00010000, + DMA1_INT_FLAG_TC5 = 0x00020000, + DMA1_INT_FLAG_HT5 = 0x00040000, + DMA1_INT_FLAG_TERR5 = 0x00080000, + DMA1_INT_FLAG_GINT6 = 0x00100000, + DMA1_INT_FLAG_TC6 = 0x00200000, + DMA1_INT_FLAG_HT6 = 0x00400000, + DMA1_INT_FLAG_TERR6 = 0x00800000, + DMA1_INT_FLAG_GINT7 = 0x01000000, + DMA1_INT_FLAG_TC7 = 0x02000000, + DMA1_INT_FLAG_HT7 = 0x04000000, + DMA1_INT_FLAG_TERR7 = 0x08000000, +} DMA_INT_FLAG_T; + +/**@} end of group DMA_Enumerations */ + +/** @defgroup DMA_Structures Structures + @{ +*/ + +/** + * @brief DMA Configure structure definition + */ +typedef struct +{ + uint32_t peripheralBaseAddr; + uint32_t memoryBaseAddr; + DMA_DIR_T dir; + uint32_t bufferSize; + DMA_PERIPHERAL_INC_T peripheralInc; + DMA_MEMORY_INC_T memoryInc; + DMA_PERIPHERAL_DATA_SIZE_T peripheralDataSize; + DMA_MEMORY_DATA_SIZE_T memoryDataSize; + DMA_LOOP_MODE_T loopMode; + DMA_PRIORITY_T priority; + DMA_M2MEN_T M2M; +} DMA_Config_T; + +/**@} end of group DMA_Structures */ + +/** @defgroup DMA_Functions Functions + @{ +*/ + +/* Reset and configuration */ +void DMA_Reset(DMA_Channel_T* channel); +void DMA_Config(DMA_Channel_T* channel, DMA_Config_T* dmaConfig); +void DMA_ConfigStructInit(DMA_Config_T* dmaConfig); +void DMA_Enable(DMA_Channel_T* channel); +void DMA_Disable(DMA_Channel_T* channel); + +/* Data number */ +void DMA_ConfigDataNumber(DMA_Channel_T* channel, uint16_t dataNumber); +uint16_t DMA_ReadDataNumber(DMA_Channel_T* channel); + +/* Interrupt and flag */ +void DMA_EnableInterrupt(DMA_Channel_T* channel, uint32_t interrupt); +void DMA_DisableInterrupt(DMA_Channel_T* channel, uint32_t interrupt); +uint8_t DMA_ReadStatusFlag(DMA_FLAG_T flag); +void DMA_ClearStatusFlag(uint32_t flag); +uint8_t DMA_ReadIntFlag(DMA_INT_FLAG_T flag); +void DMA_ClearIntFlag(uint32_t flag); + +/**@} end of group DMA_Functions */ +/**@} end of group DMA_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_DMA_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_eint.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_eint.h new file mode 100644 index 0000000000..937add9c4b --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_eint.h @@ -0,0 +1,135 @@ +/*! + * @file apm32s10x_eint.h + * + * @brief This file contains all the functions prototypes for the EINT firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_EINT_H +#define __APM32S10X_EINT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup EINT_Driver EINT Driver + @{ +*/ + +/** @defgroup EINT_Enumerations Enumerations + @{ +*/ + +/** + * @brief EINT mode enumeration + */ +typedef enum +{ + EINT_MODE_INTERRUPT = 0x00, + EINT_MODE_EVENT = 0x04 +} EINT_MODE_T; + +/** + * @brief EINT Trigger enumeration + */ +typedef enum +{ + EINT_TRIGGER_RISING = 0x08, + EINT_TRIGGER_FALLING = 0x0C, + EINT_TRIGGER_RISING_FALLING = 0x10 +} EINT_TRIGGER_T; + +typedef enum +{ + EINT_LINENONE = 0x00000, /*!< No interrupt selected > */ + EINT_LINE_0 = 0x00001, /*!< External interrupt line 0 */ + EINT_LINE_1 = 0x00002, /*!< External interrupt line 1 */ + EINT_LINE_2 = 0x00004, /*!< External interrupt line 2 */ + EINT_LINE_3 = 0x00008, /*!< External interrupt line 3 */ + EINT_LINE_4 = 0x00010, /*!< External interrupt line 4 */ + EINT_LINE_5 = 0x00020, /*!< External interrupt line 5 */ + EINT_LINE_6 = 0x00040, /*!< External interrupt line 6 */ + EINT_LINE_7 = 0x00080, /*!< External interrupt line 7 */ + EINT_LINE_8 = 0x00100, /*!< External interrupt line 8 */ + EINT_LINE_9 = 0x00200, /*!< External interrupt line 9 */ + EINT_LINE_10 = 0x00400, /*!< External interrupt line 10 */ + EINT_LINE_11 = 0x00800, /*!< External interrupt line 11 */ + EINT_LINE_12 = 0x01000, /*!< External interrupt line 12 */ + EINT_LINE_13 = 0x02000, /*!< External interrupt line 13 */ + EINT_LINE_14 = 0x04000, /*!< External interrupt line 14 */ + EINT_LINE_15 = 0x08000, /*!< External interrupt line 15 */ + EINT_LINE_16 = 0x10000, /*!< External interrupt line 16 Connected to the PVD Output */ + EINT_LINE_17 = 0x20000, /*!< External interrupt line 17 Connected to the RTC Alarm event */ + EINT_LINE_18 = 0x40000, /*!< External interrupt line 18 Connected to the USB Device */ +} EINT_LINE_T; + +/**@} end of group EINT_Enumerations */ + +/** @defgroup EINT_Structures Structures + @{ +*/ + +/** + * @brief EINT Config structure definition + */ +typedef struct +{ + uint32_t line; + EINT_MODE_T mode; + EINT_TRIGGER_T trigger; + uint8_t lineCmd; +} EINT_Config_T; + +/**@} end of group EINT_Structures */ + +/** @defgroup EINT_Functions Functions + @{ +*/ + +/* Reset and configuration */ +void EINT_Reset(void); +void EINT_Config(EINT_Config_T* eintConfig); +void EINT_ConfigStructInit(EINT_Config_T* eintConfig); + +/* Interrupt and flag */ +void EINT_SelectSWInterrupt(uint32_t line); +uint8_t EINT_ReadStatusFlag(EINT_LINE_T line); +void EINT_ClearStatusFlag(uint32_t line); +uint8_t EINT_ReadIntFlag(EINT_LINE_T line); +void EINT_ClearIntFlag(uint32_t line); + +/**@} end of group EINT_Functions */ +/**@} end of group EINT_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10XEINT_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_fmc.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_fmc.h new file mode 100644 index 0000000000..0c5b681096 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_fmc.h @@ -0,0 +1,231 @@ +/*! + * @file apm32s10x_fmc.h + * + * @brief This file contains all the functions prototypes for the FMC firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_FMC_H +#define __APM32S10X_FMC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup FMC_Driver FMC Driver + @{ +*/ + +/** @defgroup FMC_Macros Macros + @{ +*/ + +/* Macros description */ + +/* Values for APM32 Medium-density devices */ +#define FLASH_WRP_PAGE_0_3 ((uint32_t)BIT0) /*!< Write protection of page 0 to 3 */ +#define FLASH_WRP_PAGE_4_7 ((uint32_t)BIT1) /*!< Write protection of page 4 to 7 */ +#define FLASH_WRP_PAGE_8_11 ((uint32_t)BIT2) /*!< Write protection of page 8 to 11 */ +#define FLASH_WRP_PAGE_12_15 ((uint32_t)BIT3) /*!< Write protection of page 12 to 15 */ +#define FLASH_WRP_PAGE_16_19 ((uint32_t)BIT4) /*!< Write protection of page 16 to 19 */ +#define FLASH_WRP_PAGE_20_23 ((uint32_t)BIT5) /*!< Write protection of page 20 to 23 */ +#define FLASH_WRP_PAGE_24_27 ((uint32_t)BIT6) /*!< Write protection of page 24 to 27 */ +#define FLASH_WRP_PAGE_28_31 ((uint32_t)BIT7) /*!< Write protection of page 28 to 31 */ +#define FLASH_WRP_PAGE_32_35 ((uint32_t)BIT8) /*!< Write protection of page 32 to 35 */ +#define FLASH_WRP_PAGE_36_39 ((uint32_t)BIT9) /*!< Write protection of page 36 to 39 */ +#define FLASH_WRP_PAGE_40_43 ((uint32_t)BIT10) /*!< Write protection of page 40 to 43 */ +#define FLASH_WRP_PAGE_44_47 ((uint32_t)BIT11) /*!< Write protection of page 44 to 47 */ +#define FLASH_WRP_PAGE_48_51 ((uint32_t)BIT12) /*!< Write protection of page 48 to 51 */ +#define FLASH_WRP_PAGE_52_55 ((uint32_t)BIT13) /*!< Write protection of page 52 to 55 */ +#define FLASH_WRP_PAGE_56_59 ((uint32_t)BIT14) /*!< Write protection of page 56 to 59 */ +#define FLASH_WRP_PAGE_60_63 ((uint32_t)BIT15) /*!< Write protection of page 60 to 63 */ +#define FLASH_WRP_PAGE_64_67 ((uint32_t)BIT16) /*!< Write protection of page 64 to 67 */ +#define FLASH_WRP_PAGE_68_71 ((uint32_t)BIT17) /*!< Write protection of page 68 to 71 */ +#define FLASH_WRP_PAGE_72_75 ((uint32_t)BIT18) /*!< Write protection of page 72 to 75 */ +#define FLASH_WRP_PAGE_76_79 ((uint32_t)BIT19) /*!< Write protection of page 76 to 79 */ +#define FLASH_WRP_PAGE_80_83 ((uint32_t)BIT20) /*!< Write protection of page 80 to 83 */ +#define FLASH_WRP_PAGE_84_87 ((uint32_t)BIT21) /*!< Write protection of page 84 to 87 */ +#define FLASH_WRP_PAGE_88_91 ((uint32_t)BIT22) /*!< Write protection of page 88 to 91 */ +#define FLASH_WRP_PAGE_92_95 ((uint32_t)BIT23) /*!< Write protection of page 92 to 95 */ +#define FLASH_WRP_PAGE_96_99 ((uint32_t)BIT24) /*!< Write protection of page 96 to 99 */ +#define FLASH_WRP_PAGE_100_103 ((uint32_t)BIT25) /*!< Write protection of page 100 to 103 */ +#define FLASH_WRP_PAGE_104_107 ((uint32_t)BIT26) /*!< Write protection of page 104 to 107 */ +#define FLASH_WRP_PAGE_108_111 ((uint32_t)BIT27) /*!< Write protection of page 108 to 111 */ +#define FLASH_WRP_PAGE_112_115 ((uint32_t)BIT28) /*!< Write protection of page 112 to 115 */ +#define FLASH_WRP_PAGE_116_119 ((uint32_t)BIT29) /*!< Write protection of page 116 to 119 */ +#define FLASH_WRP_PAGE_120_123 ((uint32_t)BIT30) /*!< Write protection of page 120 to 123 */ +#define FLASH_WRP_PAGE_124_127 ((uint32_t)BIT31) /*!< Write protection of page 124 to 127 */ +#define FMC_WRP_PAGE_ALL ((uint32_t)0xFFFFFFFF) /*!< Write protection of page all */ + +/**@} end of group FMC_Macros */ + +/** @defgroup FMC_Enumerations Enumerations + @{ +*/ + +/** + * @brief Flash Latency + */ +typedef enum +{ + FMC_LATENCY_0, + FMC_LATENCY_1, + FMC_LATENCY_2 +} FMC_LATENCY_T; + +/** + * @brief FMC Status + */ +typedef enum +{ + FMC_STATUS_BUSY = 1, /*!< flash busy */ + FMC_STATUS_ERROR_PG, /*!< flash programming error */ + FMC_STATUS_ERROR_WRP, /*!< flash write protection error */ + FMC_STATUS_COMPLETE, /*!< flash operation complete */ + FMC_STATUS_TIMEOUT /*!< flash time out */ +} FMC_STATUS_T; + +/** + * @brief Option Bytes IWatchdog + */ +typedef enum +{ + OB_IWDT_HARD = 0x0000, + OB_IWDT_SOTF = 0x0001 +} OB_IWDT_T; + +/** + * @brief Option Bytes nRST STOP + */ +typedef enum +{ + OB_STOP_RST = 0x0000, + OB_STOP_NORST = 0x0002 +} OB_STOP_T; + +/** + * @brief Option Bytes nRST STDBY + */ +typedef enum +{ + OB_STDBY_RST = 0x0000, + OB_STDBY_NORST = 0x0004 +} OB_STDBY_T; + +/** + * @brief FMC Interrupts + */ +typedef enum +{ + FMC_INT_ERR, + FMC_INT_OC +} FMC_INT_T; + +/** + * @brief FMC flag + */ +typedef enum +{ + FMC_FLAG_BUSY = 0x00000001, /*!< FMC Busy flag */ + FMC_FLAG_OC = 0x00000020, /*!< FMC End of Operation flag */ + FMC_FLAG_PE = 0x00000004, /*!< FMC Program error flag */ + FMC_FLAG_WPE = 0x00000010, /*!< FMC Write protected error flag */ + FMC_FLAG_OBE = 0x10000001, /*!< FMC Option Byte error flag */ +} FMC_FLAG_T; + +/**@} end of group FMC_Enumerations */ + +/** @defgroup FMC_Structures Structures + @{ +*/ + +/** + * @brief User Option byte config struct definition + */ +typedef struct +{ + OB_IWDT_T iwdtSet; + OB_STOP_T stopSet; + OB_STDBY_T stdbySet; +} FMC_UserConfig_T; + +/**@} end of group FMC_Structures */ + +/** @defgroup FMC_Functions Functions + @{ +*/ + +/* Initialization and Configuration */ +void FMC_ConfigLatency(FMC_LATENCY_T latency); +void FMC_EnableHalfCycleAccess(void); +void FMC_DisableHalfCycleAccess(void); +void FMC_EnablePrefetchBuffer(void); +void FMC_DisablePrefetchBuffer(void); + +/* Lock management */ +void FMC_Unlock(void); +void FMC_Lock(void); + +/* Erase management */ +FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr); +FMC_STATUS_T FMC_EraseAllPage(void); +FMC_STATUS_T FMC_EraseOptionBytes(void); + +/* Read Write management */ +FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data); +FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data); +FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data); +FMC_STATUS_T FMC_EnableWriteProtection(uint32_t page); +FMC_STATUS_T FMC_EnableReadOutProtection(void); +FMC_STATUS_T FMC_DisableReadOutProtection(void); +FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig); +uint32_t FMC_ReadUserOptionByte(void); +uint32_t FMC_ReadOptionByteWriteProtection(void); +uint8_t FMC_GetReadProtectionStatus(void); +uint8_t FMC_ReadPrefetchBufferStatus(void); + +/* Interrupts and flags */ +void FMC_EnableInterrupt(FMC_INT_T interrupt); +void FMC_DisableInterrupt(FMC_INT_T interrupt); +uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag); +void FMC_ClearStatusFlag(uint32_t flag); + +/* Status management */ +FMC_STATUS_T FMC_ReadStatus(void); +FMC_STATUS_T FMC_WaitForLastOperation(uint32_t timeOut); + +/**@} end of group FMC_Functions */ +/**@} end of group FMC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_FMC_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_gpio.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_gpio.h new file mode 100644 index 0000000000..7c291aca1d --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_gpio.h @@ -0,0 +1,254 @@ +/*! + * @file apm32s10x_gpio.h + * + * @brief This file contains all the functions prototypes for the GPIO firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_GPIO_H +#define __APM32S10X_GPIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup GPIO_Driver GPIO Driver + @{ +*/ + +/** @defgroup GPIO_Enumerations Enumerations + @{ +*/ + +/** + * @brief GPIO Output Maximum frequency selection + */ +typedef enum +{ + GPIO_SPEED_10MHz = 1, + GPIO_SPEED_2MHz, + GPIO_SPEED_50MHz +} GPIO_SPEED_T; + +/** + * @brief Configuration Mode enumeration + */ +typedef enum +{ + GPIO_MODE_ANALOG = 0x0, /*!< Analog mode */ + GPIO_MODE_IN_FLOATING = 0x04, /*!< Floating input */ + GPIO_MODE_IN_PD = 0x28, /*!< Input with pull-down */ + GPIO_MODE_IN_PU = 0x48, /*!< Input with pull-up */ + GPIO_MODE_OUT_PP = 0x80, /*!< General purpose output push-pull */ + GPIO_MODE_OUT_OD = 0x84, /*!< General purpose output Open-drain */ + GPIO_MODE_AF_PP = 0x88, /*!< Alternate function output Push-pull */ + GPIO_MODE_AF_OD = 0x8C /*!< Alternate function output Open-drain */ +} GPIO_MODE_T; + +/** + * @brief Definition of the GPIO pins + */ +typedef enum +{ + GPIO_PIN_0 = ((uint16_t)BIT0), + GPIO_PIN_1 = ((uint16_t)BIT1), + GPIO_PIN_2 = ((uint16_t)BIT2), + GPIO_PIN_3 = ((uint16_t)BIT3), + GPIO_PIN_4 = ((uint16_t)BIT4), + GPIO_PIN_5 = ((uint16_t)BIT5), + GPIO_PIN_6 = ((uint16_t)BIT6), + GPIO_PIN_7 = ((uint16_t)BIT7), + GPIO_PIN_8 = ((uint16_t)BIT8), + GPIO_PIN_9 = ((uint16_t)BIT9), + GPIO_PIN_10 = ((uint16_t)BIT10), + GPIO_PIN_11 = ((uint16_t)BIT11), + GPIO_PIN_12 = ((uint16_t)BIT12), + GPIO_PIN_13 = ((uint16_t)BIT13), + GPIO_PIN_14 = ((uint16_t)BIT14), + GPIO_PIN_15 = ((uint16_t)BIT15), + GPIO_PIN_ALL = ((uint32_t)0XFFFF) +} GPIO_PIN_T; + +/** + * @brief GPIO remap type define + */ +typedef enum +{ + GPIO_NO_REMAP_SPI1 = 0x00000010, + GPIO_REMAP_SPI1 = 0x00000011, + + GPIO_NO_REMAP_I2C1 = 0x00000110, + GPIO_REMAP_I2C1 = 0x00000111, + + GPIO_NO_REMAP_USART1 = 0x00000210, + GPIO_REMAP_USART1 = 0x00000211, + + GPIO_NO_REMAP_USART2 = 0x00000310, + GPIO_REMAP_USART2 = 0x00000311, + + GPIO_NO_REMAP_USART3 = 0x00000430, + GPIO_PARTIAL_REMAP_USART3 = 0x00000431, + GPIO_FULL_REMAP_USART3 = 0x00000433, + + GPIO_NO_REMAP_TMR1 = 0x00000630, + GPIO_PARTIAL_REMAP_TMR1 = 0x00000631, + GPIO_FULL_REMAP_TMR1 = 0x00000633, + + GPIO_NO_REMAP_TMR2 = 0x00000830, + GPIO_PARTIAL_REMAP1_TMR2 = 0x00000831, + GPIO_PARTIAL_REMAP2_TMR2 = 0x00000832, + GPIO_FULL_REMAP_TMR2 = 0x00000833, + + GPIO_NO_REMAP_TMR3 = 0x00000A30, + GPIO_PARTIAL_REMAP_TMR3 = 0x00000A32, + GPIO_FULL_REMAP_TMR3 = 0x00000A33, + + GPIO_NO_REMAP_TMR4 = 0x00000C10, + GPIO_REMAP_TMR4 = 0x00000C11, + + GPIO_NO_REMAP_CAN1 = 0x00000D30, + GPIO_REMAP1_CAN1 = 0x00000D32, + GPIO_REMAP2_CAN1 = 0x00000D33, + + GPIO_NO_REMAP_PD01 = 0x00000F10, + GPIO_REMAP_PD01 = 0x00000F11, + + GPIO_NO_REMAP_ADC1_ETRGINJ = 0x00001110, + GPIO_REMAP_ADC1_ETRGINJ = 0x00001111, + + GPIO_NO_REMAP_ADC1_ETRGREG = 0x00001210, + GPIO_REMAP_ADC1_ETRGREG = 0x00001211, + + GPIO_NO_REMAP_ADC2_ETRGINJ = 0x00001310, + GPIO_REMAP_ADC2_ETRGINJ = 0x00001311, + + GPIO_NO_REMAP_ADC2_ETRGREG = 0x00001410, + GPIO_REMAP_ADC2_ETRGREG = 0x00001411, + + GPIO_NO_REMAP_CAN2 = 0x00001610, + GPIO_REMAP_CAN2 = 0x00001611, + + GPIO_NO_REMAP_SWJ = 0x00001870, + GPIO_REMAP_SWJ_NOJTRST = 0x00001871, + GPIO_REMAP_SWJ_JTAGDISABLE = 0x00001872, + GPIO_REMAP_SWJ_DISABLE = 0x00001874 +} GPIO_REMAP_T; + +/** + * @brief gpio port source define + */ +typedef enum +{ + GPIO_PORT_SOURCE_A, + GPIO_PORT_SOURCE_B, + GPIO_PORT_SOURCE_C, + GPIO_PORT_SOURCE_D, + GPIO_PORT_SOURCE_E +} GPIO_PORT_SOURCE_T; + +/** + * @brief gpio pin source define + */ +typedef enum +{ + GPIO_PIN_SOURCE_0, + GPIO_PIN_SOURCE_1, + GPIO_PIN_SOURCE_2, + GPIO_PIN_SOURCE_3, + GPIO_PIN_SOURCE_4, + GPIO_PIN_SOURCE_5, + GPIO_PIN_SOURCE_6, + GPIO_PIN_SOURCE_7, + GPIO_PIN_SOURCE_8, + GPIO_PIN_SOURCE_9, + GPIO_PIN_SOURCE_10, + GPIO_PIN_SOURCE_11, + GPIO_PIN_SOURCE_12, + GPIO_PIN_SOURCE_13, + GPIO_PIN_SOURCE_14, + GPIO_PIN_SOURCE_15 +} GPIO_PIN_SOURCE_T; + +/**@} end of group GPIO_Enumerations */ + +/** @defgroup GPIO_Structures Structures + @{ +*/ + +/** + * @brief GPIO Config structure definition + */ +typedef struct +{ + uint16_t pin; + GPIO_SPEED_T speed; + GPIO_MODE_T mode; +} GPIO_Config_T; + +/**@} end of group GPIO_Structures */ + +/** @defgroup GPIO_Functions Functions + @{ +*/ + +/* Reset and common Configuration */ +void GPIO_Reset(GPIO_T* port); +void GPIO_AFIOReset(void); +void GPIO_Config(GPIO_T* port, GPIO_Config_T* gpioConfig); +void GPIO_ConfigStructInit(GPIO_Config_T* gpioConfig); + +/* Read */ +uint8_t GPIO_ReadInputBit(GPIO_T* port, uint16_t pin); +uint16_t GPIO_ReadInputPort(GPIO_T* port); +uint8_t GPIO_ReadOutputBit(GPIO_T* port, uint16_t pin); +uint16_t GPIO_ReadOutputPort(GPIO_T* port); + +/* Write */ +void GPIO_SetBit(GPIO_T* port, uint16_t pin); +void GPIO_ResetBit(GPIO_T* port, uint16_t pin); +void GPIO_WriteOutputPort(GPIO_T* port, uint16_t portValue); +void GPIO_WriteBitValue(GPIO_T* port, uint16_t pin, uint8_t bitVal); + +/* GPIO Configuration */ +void GPIO_ConfigPinLock(GPIO_T* port, uint16_t pin); +void GPIO_ConfigEventOutput(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource); +void GPIO_EnableEventOutput(void); +void GPIO_DisableEventOutput(void); +void GPIO_ConfigPinRemap(GPIO_REMAP_T remap); +void GPIO_ConfigEINTLine(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource); + +/**@} end of group GPIO_Functions */ +/**@} end of group GPIO_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_GPIO_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_i2c.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_i2c.h new file mode 100644 index 0000000000..3ce21e322e --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_i2c.h @@ -0,0 +1,349 @@ +/*! + * @file apm32s10x_i2c.h + * + * @brief This file contains all the functions prototypes for the I2C firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_I2C_H +#define __APM32S10X_I2C_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup I2C_Driver I2C Driver + @{ +*/ + +/** @defgroup I2C_Enumerations Enumerations + @{ +*/ + +/** + * @brief I2C Mode + */ +typedef enum +{ + I2C_MODE_I2C = 0x0000, + I2C_MODE_SMBUUSDEVICE = 0x0002, + I2C_MODE_SMBUSHOST = 0x000A +} I2C_MODE_T; + +/** + * @brief I2C duty cycle in fast mode + */ +typedef enum +{ + I2C_DUTYCYCLE_16_9 = 0x4000, + I2C_DUTYCYCLE_2 = 0xBFFF +} I2C_DUTYCYCLE_T; + +/** + * @brief I2C acknowledgement + */ +typedef enum +{ + I2C_ACK_DISABLE, + I2C_ACK_ENABLE +} I2C_ACK_T; + +/** + * @brief I2C acknowledged address + */ +typedef enum +{ + I2C_ACK_ADDRESS_7BIT = 0x4000, + I2C_ACK_ADDRESS_10BIT = 0xC000 +} I2C_ACK_ADDRESS_T; + +/** + * @brief I2C interrupts definition + */ +typedef enum +{ + I2C_INT_BUF = 0x0400, + I2C_INT_EVT = 0x0200, + I2C_INT_ERR = 0x0100 +} I2C_INT_T; + +/** + * @brief I2C transfer direction + */ + +typedef enum +{ + I2C_DIRECTION_TX, + I2C_DIRECTION_RX +} I2C_DIRECTION_T; + +/** + * @brief I2C Register + */ +typedef enum +{ + I2C_REGISTER_CTRL1, + I2C_REGISTER_CTRL2, + I2C_REGISTER_SADDR1, + I2C_REGISTER_SADDR2, + I2C_REGISTER_DATA, + I2C_REGISTER_STS1, + I2C_REGISTER_STS2, + I2C_REGISTER_CLKCTRL, + I2C_REGISTER_RISETMAX, + I2C_REGISTER_SWITCH +} I2C_REGISTER_T; + +/** + * @brief I2C NCAK position + */ +typedef enum +{ + I2C_NACK_POSITION_NEXT, + I2C_NACK_POSITION_CURRENT +} I2C_NACK_POSITION_T; + +/** + * @brief I2C SMBus alert pin level + */ +typedef enum +{ + I2C_SMBUSALER_LOW, + I2C_SMBUSALER_HIGH +} I2C_SMBUSALER_T; + +/** + * @brief I2C PEC position + */ +typedef enum +{ + I2C_PEC_POSITION_NEXT, + I2C_PEC_POSITION_CURRENT +} I2C_PEC_POSITION_T; + +/** + * @brief I2C Events + */ +typedef enum +{ + /* I2C Master Events */ + /* Event 5: Communication start event */ + I2C_EVENT_MASTER_MODE_SELECT = 0x00030001, /*!< BUSBSYFLG, MSFLG and STARTFLG flag */ + + /* + * Event 6: 7-bit Address Acknowledge + * in case of master receiver + */ + I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED = 0x00070082, /*!< BUSBSYFLG, MSFLG, ADDRFLG, TXBEFLG and TRFLG flags */ + I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED = 0x00030002, /*!< BUSBSYFLG, MSFLG and ADDRFLG flags */ + /* + * Event 9: Master has sent the first byte + * in 10-bit address mode + */ + I2C_EVENT_MASTER_MODE_ADDRESS10 = 0x00030008, /*!< BUSBSYFLG, MSFLG and ADDR10FLG flags */ + + /* Master RECEIVER mode */ + /* Event 7 */ + I2C_EVENT_MASTER_BYTE_RECEIVED = 0x00030040, /*!< BUSBSYFLG, MSFLG and RXBNEFLG flags */ + + /* Master TRANSMITTER mode */ + /* Event 8 */ + I2C_EVENT_MASTER_BYTE_TRANSMITTING = 0x00070080, /*!< TRFLG, BUSBSYFLG, MSFLG, TXBEFLG flags */ + /* Event 8_2 */ + I2C_EVENT_MASTER_BYTE_TRANSMITTED = 0x00070084, /*!< TRFLG, BUSBSYFLG, MSFLG, TXBEFLG and BTCFLG flags */ + + + /* EV1 (all the events below are variants of EV1) */ + /* 1, Case of One Single Address managed by the slave */ + I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED = 0x00020002, /*!< BUSBSYFLG and ADDRFLG flags */ + I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED = 0x00060082, /*!< TRFLG, BUSBSYFLG, TXBEFLG and ADDRFLG flags */ + + /* 2, Case of Dual address managed by the slave */ + I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED = 0x00820000, /*!< DUALF and BUSBSYFLG flags */ + I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED = 0x00860080, /*!< DUALF, TRFLG, BUSBSYFLG and TXBEFLG flags */ + + /* 3, Case of General Call enabled for the slave */ + I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED = 0x00120000, /*!< GENCALL and BUSBSYFLG flags */ + + + /* Slave RECEIVER mode */ + /* EV2 */ + I2C_EVENT_SLAVE_BYTE_RECEIVED = 0x00020040, /*!< BUSBSYFLG and RXBNEFLG flags */ + /* EV4 */ + I2C_EVENT_SLAVE_STOP_DETECTED = 0x00000010, /*!< STOPFLG flag */ + + /* Slave TRANSMITTER mode */ + /* EV3 */ + I2C_EVENT_SLAVE_BYTE_TRANSMITTED = 0x00060084, /*!< TRFLG, BUSBSYFLG, TXBEFLG and BTCFLG flags */ + I2C_EVENT_SLAVE_BYTE_TRANSMITTING = 0x00060080, /*!< TRFLG, BUSBSYFLG and TXBEFLG flags */ + /* EV3_2 */ + I2C_EVENT_SLAVE_ACK_FAILURE = 0x00000400, /*!< AEFLG flag */ +} I2C_EVENT_T; + +/** + * @brief I2C flags + */ +typedef enum +{ + /* STS2 register flags */ + I2C_FLAG_DUALADDR, + I2C_FLAG_SMMHADDR, + I2C_FLAG_SMBDADDR, + I2C_FLAG_GENCALL, + I2C_FLAG_TR, + I2C_FLAG_BUSBSY, + I2C_FLAG_MS, + + /* STS1 register flags */ + I2C_FLAG_SMBALT, + I2C_FLAG_TTE, + I2C_FLAG_PECE, + I2C_FLAG_OVRUR, + I2C_FLAG_AE, + I2C_FLAG_AL, + I2C_FLAG_BERR, + I2C_FLAG_TXBE, + I2C_FLAG_RXBNE, + I2C_FLAG_STOP, + I2C_FLAG_ADDR10, + I2C_FLAG_BTC, + I2C_FLAG_ADDR, + I2C_FLAG_START, +} I2C_FLAG_T; + +/** + * @brief I2C interrupt + */ +typedef enum +{ + I2C_INT_FLAG_SMBALT = 0x01008000, + I2C_INT_FLAG_TTE = 0x01004000, + I2C_INT_FLAG_PECE = 0x01001000, + I2C_INT_FLAG_OVRUR = 0x01000800, + I2C_INT_FLAG_AE = 0x01000400, + I2C_INT_FLAG_AL = 0x01000200, + I2C_INT_FLAG_BERR = 0x01000100, + I2C_INT_FLAG_TXBE = 0x06000080, + I2C_INT_FLAG_RXBNE = 0x06000040, + I2C_INT_FLAG_STOP = 0x02000010, + I2C_INT_FLAG_ADDR10 = 0x02000008, + I2C_INT_FLAG_BTC = 0x02000004, + I2C_INT_FLAG_ADDR = 0x02000002, + I2C_INT_FLAG_START = 0x02000001, +} I2C_INT_FLAG_T; + +/**@} end of group I2C_Enumerations */ + +/** @defgroup I2C_Structures Structures + @{ +*/ + +/** + * @brief I2C Configure structure definition + */ +typedef struct +{ + uint32_t clockSpeed; + I2C_MODE_T mode; + I2C_DUTYCYCLE_T dutyCycle; + uint16_t ownAddress1; + I2C_ACK_T ack; + I2C_ACK_ADDRESS_T ackAddress; +} I2C_Config_T; + +/**@} end of group I2C_Structures */ + +/** @defgroup I2C_Functions Functions + @{ +*/ + +/* I2C reset and configuration */ +void I2C_Reset(I2C_T* i2c); +void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig); +void I2C_ConfigStructInit(I2C_Config_T* i2cConfig); +void I2C_Enable(I2C_T* i2c); +void I2C_Disable(I2C_T* i2c); +void I2C_EnableGenerateStart(I2C_T* i2c); +void I2C_DisableGenerateStart(I2C_T* i2c); +void I2C_EnableGenerateStop(I2C_T* i2c); +void I2C_DisableGenerateStop(I2C_T* i2c); +void I2C_EnableAcknowledge(I2C_T* i2c); +void I2C_DisableAcknowledge(I2C_T* i2c); +void I2C_ConfigOwnAddress2(I2C_T* i2c, uint8_t address); +void I2C_EnableDualAddress(I2C_T* i2c); +void I2C_DisableDualAddress(I2C_T* i2c); +void I2C_EnableGeneralCall(I2C_T* i2c); +void I2C_DisableGeneralCall(I2C_T* i2c); + +/* Transmit Configuration */ +void I2C_TxData(I2C_T* i2c, uint8_t data); +uint8_t I2C_RxData(I2C_T* i2c); +void I2C_Tx7BitAddress(I2C_T* i2c, uint8_t address, I2C_DIRECTION_T direction); +uint16_t I2C_ReadRegister(I2C_T* i2c, I2C_REGISTER_T i2cRegister); +void I2C_EnableSoftwareReset(I2C_T* i2c); +void I2C_DisableSoftwareReset(I2C_T* i2c); +void I2C_ConfigNACKPosition(I2C_T* i2c, I2C_NACK_POSITION_T NACKPosition); +void I2C_ConfigSMBusAlert(I2C_T* i2c, I2C_SMBUSALER_T SMBusState); +void I2C_EnablePECTransmit(I2C_T* i2c); +void I2C_DisablePECTransmit(I2C_T* i2c); +void I2C_ConfigPECPosition(I2C_T* i2c, I2C_PEC_POSITION_T PECPosition); +void I2C_EnablePEC(I2C_T* i2c); +void I2C_DisablePEC(I2C_T* i2c); +uint8_t I2C_ReadPEC(I2C_T* i2c); +void I2C_EnableARP(I2C_T* i2c); +void I2C_DisableARP(I2C_T* i2c); +void I2C_EnableStretchClock(I2C_T* i2c); +void I2C_DisableStretchClock(I2C_T* i2c); +void I2C_ConfigFastModeDutyCycle(I2C_T* i2c, I2C_DUTYCYCLE_T dutyCycle); + +/* DMA */ +void I2C_EnableDMA(I2C_T* i2c); +void I2C_DisableDMA(I2C_T* i2c); +void I2C_EnableDMALastTransfer(I2C_T* i2c); +void I2C_DisableDMALastTransfer(I2C_T* i2c); + +/* Interrupts and flags */ +void I2C_EnableInterrupt(I2C_T* i2c, uint16_t interrupt); +void I2C_DisableInterrupt(I2C_T* i2c, uint16_t interrupt); +uint8_t I2C_ReadEventStatus(I2C_T* i2c, I2C_EVENT_T i2cEvent); +uint32_t I2C_ReadLastEvent(I2C_T* i2c); +uint8_t I2C_ReadStatusFlag(I2C_T* i2c, I2C_FLAG_T flag); +void I2C_ClearStatusFlag(I2C_T* i2c, I2C_FLAG_T flag); +uint8_t I2C_ReadIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag); +void I2C_ClearIntFlag(I2C_T* i2c, uint32_t flag); + +/**@} end of group I2C_Functions */ +/**@} end of group I2C_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_I2C_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_iwdt.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_iwdt.h new file mode 100644 index 0000000000..b1118001ef --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_iwdt.h @@ -0,0 +1,123 @@ +/*! + * @file apm32s10x_iwdt.h + * + * @brief This file contains all the functions prototypes for the IWDT firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_IWDT_H +#define __APM32S10X_IWDT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup IWDT_Driver IWDT Driver + @{ +*/ + +/** @defgroup IWDT_Enumerations Enumerations + @{ +*/ + +/** + * @brief IWDT KEYWORD define + */ +typedef enum +{ + IWDT_KEYWORD_RELOAD = 0xAAAA, + IWDT_KEYWORD_ENABLE = 0xCCCC +} IWDT_KEYWORD_T; + +/** + * @brief IWDT Write Access define + */ +typedef enum +{ + IWDT_WRITEACCESS_ENABLE = 0x5555, + IWDT_WRITEACCESS_DISABLE = 0x0000 +} IWDT_WRITEACCESS_T; + +/** + * @brief IWDT Divider + */ +typedef enum +{ + IWDT_DIVIDER_4 = 0x00, + IWDT_DIVIDER_8 = 0x01, + IWDT_DIVIDER_16 = 0x02, + IWDT_DIVIDER_32 = 0x03, + IWDT_DIVIDER_64 = 0x04, + IWDT_DIVIDER_128 = 0x05, + IWDT_DIVIDER_256 = 0x06 +} IWDT_DIVIDER_T; + +/** + * @brief IWDT Flag + */ +typedef enum +{ + IWDT_FLAG_PSCU = BIT0, + IWDT_FLAG_CNTU = BIT1 +} IWDT_FLAG_T; + +/**@} end of group IWDT_Enumerations */ + +/** @defgroup IWDT_Functions Functions + @{ +*/ + +/* Enable IWDT */ +void IWDT_Enable(void); + +/* Refresh IWDT */ +void IWDT_Refresh(void); + +/* Counter reload */ +void IWDT_ConfigReload(uint16_t reload); + +/* Divider */ +void IWDT_ConfigDivider(uint8_t div); + +/* Write Access */ +void IWDT_EnableWriteAccess(void); +void IWDT_DisableWriteAccess(void); + +/* flag */ +uint8_t IWDT_ReadStatusFlag(uint16_t flag); + +/**@} end of group IWDT_Functions */ +/**@} end of group IWDT_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_IWDT_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_misc.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_misc.h new file mode 100644 index 0000000000..4ef76d36ec --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_misc.h @@ -0,0 +1,119 @@ +/*! + * @file apm32s10x_misc.h + * + * @brief This file provides all the miscellaneous firmware functions. + * Include NVIC,SystemTick and Power management. + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_MISC_H +#define __APM32S10X_MISC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup MISC_Driver MISC Driver + @{ +*/ + +/** @defgroup MISC_Enumerations Enumerations + @{ +*/ + +/** + * @brief NVIC Vect table + */ +typedef enum +{ + NVIC_VECT_TAB_RAM = 0x20000000, + NVIC_VECT_TAB_FLASH = 0x08000000, +} NVIC_VECT_TAB_T; + +/** + * @brief system low power mode + */ +typedef enum +{ + NVIC_LOWPOWER_SEVONPEND = 0x10, + NVIC_LOWPOWER_SLEEPDEEP = 0x04, + NVIC_LOWPOWER_SLEEPONEXIT = 0x02 +} NVIC_LOWPOWER_T; + +/** + * @brief nvic priority group + */ +typedef enum +{ + NVIC_PRIORITY_GROUP_0 = 0x700, /*!< 0 bits for pre-emption priority,4 bits for subpriority */ + NVIC_PRIORITY_GROUP_1 = 0x600, /*!< 1 bits for pre-emption priority,3 bits for subpriority */ + NVIC_PRIORITY_GROUP_2 = 0x500, /*!< 2 bits for pre-emption priority,2 bits for subpriority */ + NVIC_PRIORITY_GROUP_3 = 0x400, /*!< 3 bits for pre-emption priority,1 bits for subpriority */ + NVIC_PRIORITY_GROUP_4 = 0x300 /*!< 4 bits for pre-emption priority,0 bits for subpriority */ +} NVIC_PRIORITY_GROUP_T; + +/** + * @brief SysTick Clock source + */ +typedef enum +{ + SYSTICK_CLK_SOURCE_HCLK_DIV8 = 0x00, + SYSTICK_CLK_SOURCE_HCLK = 0x01 +} SYSTICK_CLK_SOURCE_T; + +/**@} end of group MISC_Enumerations */ + +/** @defgroup MISC_Functions Functions + @{ +*/ + +/* NVIC */ +void NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_T priorityGroup); +void NVIC_EnableIRQRequest(IRQn_Type irq, uint8_t preemptionPriority, uint8_t subPriority); +void NVIC_DisableIRQRequest(IRQn_Type irq); + +/* Vector Table */ +void NVIC_ConfigVectorTable(NVIC_VECT_TAB_T vectTab, uint32_t offset); + +/* Power */ +void NVIC_SetSystemLowPower(NVIC_LOWPOWER_T lowPowerMode); +void NVIC_ResetystemLowPower(NVIC_LOWPOWER_T lowPowerMode); + +/* Systick */ +void SysTick_ConfigCLKSource(SYSTICK_CLK_SOURCE_T clkSource); + +/**@} end of group MISC_Functions */ +/**@} end of group MISC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_MISC_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_pmu.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_pmu.h new file mode 100644 index 0000000000..8b2b8be5d8 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_pmu.h @@ -0,0 +1,124 @@ +/*! + * @file apm32s10x_pmu.h + * + * @brief This file contains all the functions prototypes for the PMU firmware library. + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_PMU_H +#define __APM32S10X_PMU_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup PMU_Driver PMU Driver + @{ +*/ + +/** @defgroup PMU_Enumerations Enumerations + @{ +*/ + +/** + * @brief PMU PVD detection level + */ +typedef enum +{ + PMU_PVD_LEVEL_2V2 = 0x00, /*!< PVD detection level set to 2.2V */ + PMU_PVD_LEVEL_2V3 = 0x01, /*!< PVD detection level set to 2.3V */ + PMU_PVD_LEVEL_2V4 = 0x02, /*!< PVD detection level set to 2.4V */ + PMU_PVD_LEVEL_2V5 = 0x03, /*!< PVD detection level set to 2.5V */ + PMU_PVD_LEVEL_2V6 = 0x04, /*!< PVD detection level set to 2.6V */ + PMU_PVD_LEVEL_2V7 = 0x05, /*!< PVD detection level set to 2.7V */ + PMU_PVD_LEVEL_2V8 = 0x06, /*!< PVD detection level set to 2.8V */ + PMU_PVD_LEVEL_2V9 = 0x07, /*!< PVD detection level set to 2.9V */ +} PMU_PVD_LEVEL_T; + +/** + * @brief PMU Regulator state in STOP mode + */ +typedef enum +{ + PMU_REGULATOR_ON = 0x00, + PMU_REGULATOR_LOWPOWER = 0x01 +} PMU_REGULATOR_T; + +/** + * @brief PMU STOP mode entry + */ +typedef enum +{ + PMU_STOP_ENTRY_WFI = 0x01, + PMU_STOP_ENTRY_WFE = 0x02 +} PMU_STOP_ENTRY_T; + +/** + * @brief PMU Flag + */ +typedef enum +{ + PMU_FLAG_WUE, + PMU_FLAG_SB, + PMU_FLAG_PVDO +} PMU_FLAG_T; + +/**@} end of group PMU_Enumerations */ + +/** @defgroup PMU_Functions Functions + @{ +*/ + +/* PMU Reset */ +void PMU_Reset(void); + +/* Configuration and Operation modes */ +void PMU_EnableBackupAccess(void); +void PMU_DisableBackupAccess(void); +void PMU_EnablePVD(void); +void PMU_DisablePVD(void); +void PMU_ConfigPVDLevel(PMU_PVD_LEVEL_T level); +void PMU_EnableWakeUpPin(void); +void PMU_DisableWakeUpPin(void); +void PMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry); +void PMU_EnterSTANDBYMode(void); + +/* flags */ +uint8_t PMU_ReadStatusFlag(PMU_FLAG_T flag); +void PMU_ClearStatusFlag(PMU_FLAG_T flag); + +/**@} end of group PMU_Functions */ +/**@} end of group PMU_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_PMU_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_qspi.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_qspi.h new file mode 100644 index 0000000000..6b53e9800c --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_qspi.h @@ -0,0 +1,350 @@ +/*! + * @file apm32s10x_qspi.h + * + * @brief This file contains all the prototypes,enumeration and macros for the QSPI peripheral + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_QSPI_H +#define __APM32S10X_QSPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup QSPI_Driver QSPI Driver + @{ +*/ + +/** @defgroup QSPI_Macros Macros + @{ +*/ + +/* CTRL1 register reset value */ +#define QSPI_CTRL1_RESET_VALUE ((uint32_t)0x4007) +/* CTRL2 register reset value */ +#define QSPI_CTRL2_RESET_VALUE ((uint32_t)0x00) +/* SSIEN register reset value */ +#define QSPI_SSIEN_RESET_VALUE ((uint32_t)0x00) +/* SLAEN register reset value */ +#define QSPI_SLAEN_RESET_VALUE ((uint32_t)0x00) +/* BR register reset value */ +#define QSPI_BR_RESET_VALUE ((uint32_t)0x00) +/* TFTL register reset value */ +#define QSPI_TFTL_RESET_VALUE ((uint32_t)0x00) +/* RFTL register reset value */ +#define QSPI_RFTL_RESET_VALUE ((uint32_t)0x00) +/* TFL register reset value */ +#define QSPI_TFL_RESET_VALUE ((uint32_t)0x00) +/* RFL register reset value */ +#define QSPI_RFL_RESET_VALUE ((uint32_t)0x00) +/* STS register reset value */ +#define QSPI_STS_RESET_VALUE ((uint32_t)0x06) +/* INTEN register reset value */ +#define QSPI_INTEN_RESET_VALUE ((uint32_t)0x7F) +/* RSD register reset value */ +#define QSPI_RSD_RESET_VALUE ((uint32_t)0x00) +/* CTRL3 register reset value */ +#define QSPI_CTRL3_RESET_VALUE ((uint32_t)0x200) +/* IOSW register reset value */ +#define QSPI_IOSW_RESET_VALUE ((uint32_t)0x00) + +/**@} end of group QSPI_Macros */ + +/** @defgroup QSPI_Enumerations Enumerations + @{ +*/ + +/** + * @brief Frame format + */ +typedef enum +{ + QSPI_FRF_STANDARD, /*!< Standard mode */ + QSPI_FRF_DUAL, /*!< Dual SPI */ + QSPI_FRF_QUAD /*!< QUAD SPI */ +} QSPI_FRF_T; + +/** + * @brief Transmission mode + */ +typedef enum +{ + QSPI_TRANS_MODE_TX_RX, /*!< TX and RX mode */ + QSPI_TRANS_MODE_TX, /*!< TX mode only */ + QSPI_TRANS_MODE_RX, /*!< RX mode only */ + QSPI_TRANS_MODE_EEPROM_READ /*!< EEPROM read mode */ +} QSPI_TRANS_MODE_T; + +/** + * @brief Clock polarity + */ +typedef enum +{ + QSPI_CLKPOL_LOW, + QSPI_CLKPOL_HIGH +} QSPI_CLKPOL_T; + +/** + * @brief Clock phase + */ +typedef enum +{ + QSPI_CLKPHA_1EDGE, + QSPI_CLKPHA_2EDGE +} QSPI_CLKPHA_T; + +/** + * @brief Data format size + */ +typedef enum +{ + QSPI_DFS_4BIT = 3, + QSPI_DFS_5BIT, + QSPI_DFS_6BIT, + QSPI_DFS_7BIT, + QSPI_DFS_8BIT, + QSPI_DFS_9BIT, + QSPI_DFS_10BIT, + QSPI_DFS_11BIT, + QSPI_DFS_12BIT, + QSPI_DFS_13BIT, + QSPI_DFS_14BIT, + QSPI_DFS_15BIT, + QSPI_DFS_16BIT, + QSPI_DFS_17BIT, + QSPI_DFS_18BIT, + QSPI_DFS_19BIT, + QSPI_DFS_20BIT, + QSPI_DFS_21BIT, + QSPI_DFS_22BIT, + QSPI_DFS_23BIT, + QSPI_DFS_24BIT, + QSPI_DFS_25BIT, + QSPI_DFS_26BIT, + QSPI_DFS_27BIT, + QSPI_DFS_28BIT, + QSPI_DFS_29BIT, + QSPI_DFS_30BIT, + QSPI_DFS_31BIT, + QSPI_DFS_32BIT +} QSPI_DFS_T; + +/** + * @brief QSPI flag + */ +typedef enum +{ + QSPI_FLAG_BUSY = BIT0, /*!< Busy flag */ + QSPI_FLAG_TFNF = BIT1, /*!< TX FIFO not full flag */ + QSPI_FLAG_TFE = BIT2, /*!< TX FIFO empty flag */ + QSPI_FLAG_RFNE = BIT3, /*!< RX FIFO not empty flag */ + QSPI_FLAG_RFF = BIT4, /*!< RX FIFO full flag */ + QSPI_FLAG_DCE = BIT6 /*!< Data collision error */ +} QSPI_FLAG_T; + +/** + * @brief QSPI interrupt source + */ +typedef enum +{ + QSPI_INT_TFE = BIT0, /*!< TX FIFO empty interrupt */ + QSPI_INT_TFO = BIT1, /*!< TX FIFO overflow interrupt */ + QSPI_INT_RFU = BIT2, /*!< RX FIFO underflow interrupt */ + QSPI_INT_RFO = BIT3, /*!< RX FIFO overflow interrupt */ + QSPI_INT_RFF = BIT4, /*!< RX FIFO full interrupt */ + QSPI_INT_MST = BIT5 /*!< Master interrupt */ +} QSPI_INT_T; + +/** + * @brief QSPI interrupt flag + */ +typedef enum +{ + QSPI_INT_FLAG_TFE = BIT0, /*!< TX FIFO empty interrupt flag */ + QSPI_INT_FLAG_TFO = BIT1, /*!< TX FIFO overflow interrupt flag */ + QSPI_INT_FLAG_RFU = BIT2, /*!< RX FIFO underflow interrupt flag */ + QSPI_INT_FLAG_RFO = BIT3, /*!< RX FIFO overflow interrupt flag */ + QSPI_INT_FLAG_RFF = BIT4, /*!< RX FIFO full interrupt flag */ + QSPI_INT_FLAG_MST = BIT5 /*!< Master interrupt flag */ +} QSPI_INT_FLAG_T; + +/** + * @brief Reception sample edge + */ +typedef enum +{ + QSPI_RSE_RISING, + QSPI_RSE_FALLING +} QSPI_RSE_T; + +/** + * @brief Instruction length + */ +typedef enum +{ + QSPI_INST_LEN_0, + QSPI_INST_LEN_4BIT, + QSPI_INST_LEN_8BIT, + QSPI_INST_LEN_16BIT +} QSPI_INST_LEN_T; + +/** + * @brief QSPI address length + */ +typedef enum +{ + QSPI_ADDR_LEN_0, + QSPI_ADDR_LEN_4BIT, + QSPI_ADDR_LEN_8BIT, + QSPI_ADDR_LEN_12BIT, + QSPI_ADDR_LEN_16BIT, + QSPI_ADDR_LEN_20BIT, + QSPI_ADDR_LEN_24BIT, + QSPI_ADDR_LEN_28BIT, + QSPI_ADDR_LEN_32BIT, + QSPI_ADDR_LEN_36BIT, + QSPI_ADDR_LEN_40BIT, + QSPI_ADDR_LEN_44BIT, + QSPI_ADDR_LEN_48BIT, + QSPI_ADDR_LEN_52BIT, + QSPI_ADDR_LEN_56BIT, + QSPI_ADDR_LEN_60BIT +} QSPI_ADDR_LEN_T; + +/** + * @brief Instruction and address transmission mode + */ +typedef enum +{ + QSPI_INST_ADDR_TYPE_STANDARD, + QSPI_INST_TYPE_STANDARD, + QSPI_INST_ADDR_TYPE_FRF +} QSPI_INST_ADDR_TYPE_T; + +/** + * @brief Slave Select Toggle + */ +typedef enum +{ + QSPI_SST_DISABLE, + QSPI_SST_ENABLE +} QSPI_SST_T; + +/**@} end of group QSPI_Enumerations */ + +/** @defgroup QSPI_Structures Structures + @{ +*/ +typedef struct +{ + QSPI_SST_T selectSlaveToggle; /*!< Slave Select Toggle */ + QSPI_FRF_T frameFormat; /*!< Frame format */ + uint16_t clockDiv; /*!< Clock divider */ + QSPI_CLKPOL_T clockPolarity; /*!< Clock polarity */ + QSPI_CLKPHA_T clockPhase; /*!< Clock phase */ + QSPI_DFS_T dataFrameSize; /*!< Data frame size */ +} QSPI_Config_T; + +/**@} end of group QSPI_Structures */ + +/** @defgroup QSPI_Functions Functions + @{ +*/ + +/* Reset */ +void QSPI_Reset(void); + +/* Configuration */ +void QSPI_Config(QSPI_Config_T* qspiConfig); +void QSPI_ConfigStructInit(QSPI_Config_T* qspiConfig); + +/* Data frame size, frame number, frame format */ +void QSPI_ConfigFrameNum(uint16_t num); +void QSPI_ConfigDataFrameSize(QSPI_DFS_T dfs); +void QSPI_ConfigFrameFormat(QSPI_FRF_T frameFormat); + +/* Disable or Enable */ +void QSPI_Enable(void); +void QSPI_Disable(void); + +/* TX and RX FIFO */ +uint8_t QSPI_ReadTxFifoDataNum(void); +uint8_t QSPI_ReadRxFifoDataNum(void); +void QSPI_ConfigRxFifoThreshold(uint8_t threshold); +void QSPI_ConfigTxFifoThreshold(uint8_t threshold); +void QSPI_ConfigTxFifoEmptyThreshold(uint8_t threshold); + +/* RX Sample */ +void QSPI_ConfigRxSampleEdge(QSPI_RSE_T rse); +void QSPI_ConfigRxSampleDelay(uint8_t delay); + +/* Clock stretch */ +void QSPI_EnableClockStretch(void); +void QSPI_DisableClockStretch(void); + +/* Instruction, address, Wait cycle */ +void QSPI_ConfigInstLen(QSPI_INST_LEN_T len); +void QSPI_ConfigAddrLen(QSPI_ADDR_LEN_T len); +void QSPI_ConfigInstAddrType(QSPI_INST_ADDR_TYPE_T type); +void QSPI_ConfigWaitCycle(uint8_t cycle); + +/* IO */ +void QSPI_OpenIO(void); +void QSPI_CloseIO(void); + +/* Transmission mode */ +void QSPI_ConfigTansMode(QSPI_TRANS_MODE_T mode); + +/* Rx and Tx data */ +uint32_t QSPI_RxData(void); +void QSPI_TxData(uint32_t data); + +/* Slave */ +void QSPI_EnableSlave(void); +void QSPI_DisableSlave(void); + +/* Interrupt */ +void QSPI_EnableInterrupt(uint32_t interrupt); +void QSPI_DisableInterrupt(uint32_t interrupt); + +/* Flag */ +uint8_t QSPI_ReadStatusFlag(QSPI_FLAG_T flag); +void QSPI_ClearStatusFlag(void); +uint8_t QSPI_ReadIntFlag(QSPI_INT_FLAG_T flag); +void QSPI_ClearIntFlag(uint32_t flag); + +/**@} end of group QSPI_Functions */ +/**@} end of group QSPI_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_QSPI_H_ */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_rcm.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_rcm.h new file mode 100644 index 0000000000..37f9d5c791 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_rcm.h @@ -0,0 +1,365 @@ +/*! + * @file apm32s10x_rcm.h + * + * @brief This file contains all the functions prototypes for the RCM firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_RCM_H +#define __APM32S10X_RCM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup RCM_Driver RCM Driver + @{ +*/ + +/** @defgroup RCM_Enumerations Enumerations + @{ +*/ + +/** + * @brief HSE state + */ +typedef enum +{ + RCM_HSE_CLOSE, + RCM_HSE_OPEN, + RCM_HSE_BYPASS +} RCM_HSE_T; + +/** + * @brief PLL multiplication factor + */ +typedef enum +{ + RCM_PLLMF_2, + RCM_PLLMF_3, + RCM_PLLMF_4, + RCM_PLLMF_5, + RCM_PLLMF_6, + RCM_PLLMF_7, + RCM_PLLMF_8, + RCM_PLLMF_9, + RCM_PLLMF_10, + RCM_PLLMF_11, + RCM_PLLMF_12, + RCM_PLLMF_13, + RCM_PLLMF_14, + RCM_PLLMF_15, + RCM_PLLMF_16 +} RCM_PLLMF_T; + +/** + * @brief System clock select + */ +typedef enum +{ + RCM_SYSCLK_SEL_HSI, + RCM_SYSCLK_SEL_HSE, + RCM_SYSCLK_SEL_PLL +} RCM_SYSCLK_SEL_T; + +/** + * @brief AHB divider Number + */ +typedef enum +{ + RCM_AHB_DIV_1 = 7, + RCM_AHB_DIV_2, + RCM_AHB_DIV_4, + RCM_AHB_DIV_8, + RCM_AHB_DIV_16, + RCM_AHB_DIV_64, + RCM_AHB_DIV_128, + RCM_AHB_DIV_256, + RCM_AHB_DIV_512 +} RCM_AHB_DIV_T; + +/** + * @brief APB divider Number + */ +typedef enum +{ + RCM_APB_DIV_1 = 3, + RCM_APB_DIV_2, + RCM_APB_DIV_4, + RCM_APB_DIV_8, + RCM_APB_DIV_16 +} RCM_APB_DIV_T; + +/** + * @brief USB divider Number + */ +typedef enum +{ + RCM_USB_DIV_1_5, + RCM_USB_DIV_1, + RCM_USB_DIV_2, +} RCM_USB_DIV_T; + +/** + * @brief FPU divider Number + */ +typedef enum +{ + RCM_FPU_DIV_1, + RCM_FPU_DIV_2 +} RCM_FPU_DIV_T; + +/** + * @brief ADC divider Number + */ +typedef enum +{ + RCM_PCLK2_DIV_2, + RCM_PCLK2_DIV_4, + RCM_PCLK2_DIV_6, + RCM_PCLK2_DIV_8 +} RCM_PCLK2_DIV_T; + +/** + * @brief LSE State + */ +typedef enum +{ + RCM_LSE_CLOSE, + RCM_LSE_OPEN, + RCM_LSE_BYPASS +} RCM_LSE_T; + +/** + * @brief RTC clock select + */ +typedef enum +{ + RCM_RTCCLK_LSE = 1, + RCM_RTCCLK_LSI, + RCM_RTCCLK_HSE_DIV_128 +} RCM_RTCCLK_T; + +/** + * @brief Clock output control + */ +typedef enum +{ + RCM_MCOCLK_NO_CLOCK = 3, + RCM_MCOCLK_SYSCLK, + RCM_MCOCLK_HSI, + RCM_MCOCLK_HSE, + RCM_MCOCLK_PLLCLK_DIV_2 +} RCM_MCOCLK_T; + +/** + * @brief PLL entry clock select + */ +typedef enum +{ + RCM_PLLSEL_HSI_DIV_2 = 0, + RCM_PLLSEL_HSE = 1, + RCM_PLLSEL_HSE_DIV2 = 3, +} RCM_PLLSEL_T; + +/** + * @brief RCM Interrupt Source + */ +typedef enum +{ + RCM_INT_LSIRDY = BIT0, /*!< LSI ready interrupt */ + RCM_INT_LSERDY = BIT1, /*!< LSE ready interrupt */ + RCM_INT_HSIRDY = BIT2, /*!< HSI ready interrupt */ + RCM_INT_HSERDY = BIT3, /*!< HSE ready interrupt */ + RCM_INT_PLLRDY = BIT4, /*!< PLL ready interrupt */ + RCM_INT_CSS = BIT7 /*!< Clock security system interrupt */ +} RCM_INT_T; + +/** + * @brief AHB peripheral + */ +typedef enum +{ + RCM_AHB_PERIPH_DMA1 = BIT0, + RCM_AHB_PERIPH_SRAM = BIT2, + RCM_AHB_PERIPH_FPU = BIT3, + RCM_AHB_PERIPH_FMC = BIT4, + RCM_AHB_PERIPH_QSPI = BIT5, + RCM_AHB_PERIPH_CRC = BIT6 +} RCM_AHB_PERIPH_T; + +/** + * @brief AHB2 peripheral + */ +typedef enum +{ + RCM_APB2_PERIPH_AFIO = BIT0, + RCM_APB2_PERIPH_GPIOA = BIT2, + RCM_APB2_PERIPH_GPIOB = BIT3, + RCM_APB2_PERIPH_GPIOC = BIT4, + RCM_APB2_PERIPH_GPIOD = BIT5, + RCM_APB2_PERIPH_GPIOE = BIT6, + RCM_APB2_PERIPH_ADC1 = BIT9, + RCM_APB2_PERIPH_ADC2 = BIT10, + RCM_APB2_PERIPH_TMR1 = BIT11, + RCM_APB2_PERIPH_SPI1 = BIT12, + RCM_APB2_PERIPH_USART1 = BIT14 +} RCM_APB2_PERIPH_T; + +/** + * @brief AHB1 peripheral + */ +typedef enum +{ + RCM_APB1_PERIPH_TMR2 = BIT0, + RCM_APB1_PERIPH_TMR3 = BIT1, + RCM_APB1_PERIPH_TMR4 = BIT2, + RCM_APB1_PERIPH_WWDT = BIT11, + RCM_APB1_PERIPH_SPI2 = BIT14, + RCM_APB1_PERIPH_USART2 = BIT17, + RCM_APB1_PERIPH_USART3 = BIT18, + RCM_APB1_PERIPH_I2C1 = BIT21, + RCM_APB1_PERIPH_I2C2 = BIT22, + RCM_APB1_PERIPH_USB = BIT23, + RCM_APB1_PERIPH_CAN1 = BIT25, + RCM_APB1_PERIPH_CAN2 = BIT26, + RCM_APB1_PERIPH_BAKR = BIT27, + RCM_APB1_PERIPH_PMU = BIT28 +} RCM_APB1_PERIPH_T; + +/** + * @brief RCM FLAG define + */ +typedef enum +{ + RCM_FLAG_HSIRDY = 0x001, /*!< HSI Ready Flag */ + RCM_FLAG_HSERDY = 0x011, /*!< HSE Ready Flag */ + RCM_FLAG_PLLRDY = 0x019, /*!< PLL Ready Flag */ + RCM_FLAG_LSERDY = 0x101, /*!< LSE Ready Flag */ + RCM_FLAG_LSIRDY = 0x201, /*!< LSI Ready Flag */ + RCM_FLAG_PINRST = 0x21A, /*!< PIN reset flag */ + RCM_FLAG_PORRST = 0x21B, /*!< POR/PDR reset flag */ + RCM_FLAG_SWRST = 0x21C, /*!< Software reset flag */ + RCM_FLAG_IWDTRST = 0x21D, /*!< Independent watchdog reset flag */ + RCM_FLAG_WWDTRST = 0x21E, /*!< Window watchdog reset flag */ + RCM_FLAG_LPRRST = 0x21F /*!< Low-power reset flag */ +} RCM_FLAG_T; + +/**@} end of group RCM_Enumerations */ + +/** @defgroup RCM_Functions Functions + @{ +*/ + +/* Function description */ + +/* RCM Reset */ +void RCM_Reset(void); + +/* HSE clock */ +void RCM_ConfigHSE(RCM_HSE_T state); +uint8_t RCM_WaitHSEReady(void); + +/* HSI clock */ +void RCM_ConfigHSITrim(uint8_t HSITrim); +void RCM_EnableHSI(void); +void RCM_DisableHSI(void); + +/* LSE and LSI clock */ +void RCM_ConfigLSE(RCM_LSE_T state); +void RCM_EnableLSI(void); +void RCM_DisableLSI(void); + +/* PLL clock */ +void RCM_ConfigPLL(RCM_PLLSEL_T pllSelect, RCM_PLLMF_T pllMf); +void RCM_EnablePLL(void); +void RCM_DisablePLL(void); + +/* Clock Security System */ +void RCM_EnableCSS(void); +void RCM_DisableCSS(void); + +void RCM_ConfigMCO(RCM_MCOCLK_T mcoClock); +void RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_T sysClkSelect); +RCM_SYSCLK_SEL_T RCM_ReadSYSCLKSource(void); + +/* Config clock prescaler of AHB, APB1, APB2, USB and ADC */ +void RCM_ConfigAHB(RCM_AHB_DIV_T AHBDiv); +void RCM_ConfigAPB1(RCM_APB_DIV_T APB1Div); +void RCM_ConfigAPB2(RCM_APB_DIV_T APB2Div); +void RCM_ConfigUSBCLK(RCM_USB_DIV_T USBDiv); +void RCM_ConfigFPUCLK(RCM_FPU_DIV_T FPUDiv); +void RCM_ConfigADCCLK(RCM_PCLK2_DIV_T ADCDiv); + +/* RTC clock */ +void RCM_ConfigRTCCLK(RCM_RTCCLK_T rtcClkSelect); +void RCM_EnableRTCCLK(void); +void RCM_DisableRTCCLK(void); + +/* Reads the clock frequency */ +uint32_t RCM_ReadSYSCLKFreq(void); +uint32_t RCM_ReadHCLKFreq(void); +void RCM_ReadPCLKFreq(uint32_t* PCLK1, uint32_t* PCLK2); +uint32_t RCM_ReadADCCLKFreq(void); + +/* Enable or disable Periph Clock */ +void RCM_EnableAHBPeriphClock(uint32_t AHBPeriph); +void RCM_DisableAHBPeriphClock(uint32_t AHBPeriph); +void RCM_EnableAPB2PeriphClock(uint32_t APB2Periph); +void RCM_DisableAPB2PeriphClock(uint32_t APB2Periph); +void RCM_EnableAPB1PeriphClock(uint32_t APB1Periph); +void RCM_DisableAPB1PeriphClock(uint32_t APB1Periph); + +/* Enable or disable Periph Reset */ +void RCM_EnableAPB2PeriphReset(uint32_t APB2Periph); +void RCM_DisableAPB2PeriphReset(uint32_t APB2Periph); +void RCM_EnableAPB1PeriphReset(uint32_t APB1Periph); +void RCM_DisableAPB1PeriphReset(uint32_t APB1Periph); + +/* Backup domain reset */ +void RCM_EnableBackupReset(void); +void RCM_DisableBackupReset(void); + +/* Interrupts and flags */ +void RCM_EnableInterrupt(uint32_t interrupt); +void RCM_DisableInterrupt(uint32_t interrupt); +uint8_t RCM_ReadStatusFlag(RCM_FLAG_T flag); +void RCM_ClearStatusFlag(void); +uint8_t RCM_ReadIntFlag(RCM_INT_T flag); +void RCM_ClearIntFlag(uint32_t flag); + +/**@} end of group RCM_Functions */ +/**@} end of group RCM_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_RCM_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_rtc.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_rtc.h new file mode 100644 index 0000000000..13b2a2427e --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_rtc.h @@ -0,0 +1,100 @@ +/*! + * @file apm32s10x_rtc.h + * + * @brief This file contains all the functions prototypes for the RTC firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_RTC_H +#define __APM32S10X_RTC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup RTC_Driver RTC Driver + @{ +*/ + +/** @defgroup RTC_Enumerations Enumerations + @{ +*/ + +typedef enum +{ + RTC_FLAG_OC = 0x0020, /*!< RTC Operation Complete flag */ + RTC_FLAG_RSYNC = 0x0008, /*!< Registers Synchronized flag */ + RTC_FLAG_OVR = 0x0004, /*!< Overflow flag */ + RTC_FLAG_ALR = 0x0002, /*!< Alarm flag */ + RTC_FLAG_SEC = 0x0001 /*!< Second flag */ +} RTC_FLAG_T; + +typedef enum +{ + RTC_INT_OVR = 0x0004, /*!< Overflow interrupt */ + RTC_INT_ALR = 0x0002, /*!< Alarm interrupt */ + RTC_INT_SEC = 0x0001 /*!< Second interrupt */ +} RTC_INT_T; + +/**@} end of group RTC_Enumerations */ + +/** @defgroup RTC_Functions Functions + @{ +*/ + +/* Operation modes */ +void RTC_EnableConfigMode(void); +void RTC_DisableConfigMode(void); + +/* Configuration */ +uint32_t RTC_ReadCounter(void); +void RTC_ConfigCounter(uint32_t value); +void RTC_ConfigPrescaler(uint32_t value); +void RTC_ConfigAlarm(uint32_t value); +uint32_t RTC_ReadDivider(void); +void RTC_WaitForLastTask(void); +void RTC_WaitForSynchro(void); + +/* Interrupts and flags */ +void RTC_EnableInterrupt(uint16_t interrupt); +void RTC_DisableInterrupt(uint16_t interrupt); +uint8_t RTC_ReadStatusFlag(RTC_FLAG_T flag); +void RTC_ClearStatusFlag(uint16_t flag); +uint8_t RTC_ReadIntFlag(RTC_INT_T flag); +void RTC_ClearIntFlag(uint16_t flag); + +/**@} end of group RTC_Functions */ +/**@} end of group RTC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_RTC_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_spi.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_spi.h new file mode 100644 index 0000000000..607329d75d --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_spi.h @@ -0,0 +1,248 @@ +/*! + * @file apm32s10x_spi.h + * + * @brief This file contains all the functions prototypes for the SPI firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_SPI_H +#define __APM32S10X_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SPI_Driver SPI Driver + @{ +*/ + +/** @defgroup SPI_Enumerations Enumerations + @{ +*/ + +/** + * @brief SPI data direction mode + */ +typedef enum +{ + SPI_DIRECTION_2LINES_FULLDUPLEX = 0x0000, + SPI_DIRECTION_2LINES_RXONLY = 0x0400, + SPI_DIRECTION_1LINE_RX = 0x8000, + SPI_DIRECTION_1LINE_TX = 0xC000 +} SPI_DIRECTION_T; + +/** + * @brief SPI mode + */ +typedef enum +{ + SPI_MODE_MASTER = 0x0104, + SPI_MODE_SLAVE = 0x0000 +} SPI_MODE_T; + +/** + * @brief SPI Data length + */ +typedef enum +{ + SPI_DATA_LENGTH_16B = 0x0800, + SPI_DATA_LENGTH_8B = 0x0000 +} SPI_DATA_LENGTH_T; + +/** + * @brief SPI Clock Polarity + */ +typedef enum +{ + SPI_CLKPOL_LOW = 0x0000, + SPI_CLKPOL_HIGH = 0x0002 +} SPI_CLKPOL_T; + +/** + * @brief SPI Clock Phase + */ +typedef enum +{ + SPI_CLKPHA_1EDGE = 0x0000, + SPI_CLKPHA_2EDGE = 0x0001 +} SPI_CLKPHA_T; + +/** + * @brief SPI Slave Select management + */ +typedef enum +{ + SPI_NSS_SOFT = 0x0200, + SPI_NSS_HARD = 0x0000 +} SPI_NSS_T; + +/** + * @brief SPI BaudRate Prescaler + */ +typedef enum +{ + SPI_BAUDRATE_DIV_2 = 0x0000, + SPI_BAUDRATE_DIV_4 = 0x0008, + SPI_BAUDRATE_DIV_8 = 0x0010, + SPI_BAUDRATE_DIV_16 = 0x0018, + SPI_BAUDRATE_DIV_32 = 0x0020, + SPI_BAUDRATE_DIV_64 = 0x0028, + SPI_BAUDRATE_DIV_128 = 0x0030, + SPI_BAUDRATE_DIV_256 = 0x0038, +} SPI_BAUDRATE_DIV_T; + +/** + * @brief SPI MSB LSB transmission + */ +typedef enum +{ + SPI_FIRSTBIT_MSB = 0x0000, + SPI_FIRSTBIT_LSB = 0x0080 +} SPI_FIRSTBIT_T; + +/** + * @brief SPI Direction select + */ +typedef enum +{ + SPI_DIRECTION_RX = 0xBFFF, + SPI_DIRECTION_TX = 0x4000 +} SPI_DIRECTION_SELECT_T; + +/** + * @brief SPI interrupts definition + */ +typedef enum +{ + SPI_INT_TXBE = 0x8002, + SPI_INT_RXBNE = 0x4001, + SPI_INT_ERR = 0x2000, + SPI_INT_OVR = 0x2040, + SPI_INT_CRCE = 0x2010, + SPI_INT_ME = 0x2020, + SPI_INT_UDR = 0x2008 +} SPI_INT_T; + +/** + * @brief SPI flags definition + */ +typedef enum +{ + SPI_FLAG_RXBNE = 0x0001, + SPI_FLAG_TXBE = 0x0002, + SPI_FLAG_SCHDIR = 0x0004, + SPI_FLAG_UDR = 0x0008, + SPI_FLAG_CRCE = 0x0010, + SPI_FLAG_ME = 0x0020, + SPI_FLAG_OVR = 0x0040, + SPI_FLAG_BSY = 0x0080 +} SPI_FLAG_T; + +/** + * @brief SPI DMA requests + */ +typedef enum +{ + SPI_DMA_REQ_TX = 0x0002, + SPI_DMA_REQ_RX = 0x0001 +} SPI_DMA_REQ_T; + +/**@} end of group SPI_Enumerations */ + +/** @defgroup SPI_Structures Structures + @{ +*/ + +/** + * @brief SPI Configure structure definition + */ +typedef struct +{ + SPI_MODE_T mode; + SPI_DATA_LENGTH_T length; + SPI_CLKPHA_T phase; + SPI_CLKPOL_T polarity; + SPI_NSS_T nss; + SPI_FIRSTBIT_T firstBit; + SPI_DIRECTION_T direction; + SPI_BAUDRATE_DIV_T baudrateDiv; + uint16_t crcPolynomial; +} SPI_Config_T; + +/**@} end of group SPI_Structures */ + +/** @defgroup SPI_Functions Functions + @{ +*/ + +/* Reset and Configuration */ +void SPI_Reset(SPI_T* spi); +void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig); +void SPI_ConfigStructInit(SPI_Config_T* spiConfig); +void SPI_Enable(SPI_T* spi); +void SPI_Disable(SPI_T* spi); + +void SPI_TxData(SPI_T* spi, uint16_t data); +uint16_t SPI_RxData(SPI_T* spi); +void SPI_SetSoftwareNSS(SPI_T* spi); +void SPI_ResetSoftwareNSS(SPI_T* spi); +void SPI_EnableSSOutput(SPI_T* spi); +void SPI_DisableSSOutput(SPI_T* spi); +void SPI_ConfigDataSize(SPI_T* spi, SPI_DATA_LENGTH_T length); + +/* DMA */ +void SPI_EnableDMA(SPI_T* spi, SPI_DMA_REQ_T dmaReq); +void SPI_DisableDMA(SPI_T* spi, SPI_DMA_REQ_T dmaReq); + +/* CRC */ +void SPI_TxCRC(SPI_T* spi); +void SPI_EnableCRC(SPI_T* spi); +void SPI_DisableCRC(SPI_T* spi); +uint16_t SPI_ReadTxCRC(SPI_T* spi); +uint16_t SPI_ReadRxCRC(SPI_T* spi); +uint16_t SPI_ReadCRCPolynomial(SPI_T* spi); +void SPI_ConfigBiDirectionalLine(SPI_T* spi, SPI_DIRECTION_SELECT_T direction); + +/* Interrupts and flag */ +void SPI_EnableInterrupt(SPI_T* spi, SPI_INT_T interrupt); +void SPI_DisableInterrupt(SPI_T* spi, SPI_INT_T interrupt); +uint8_t SPI_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag); +void SPI_ClearStatusFlag(SPI_T* spi, SPI_FLAG_T flag); +uint8_t SPI_ReadIntFlag(SPI_T* spi, SPI_INT_T flag); +void SPI_ClearIntFlag(SPI_T* spi, SPI_INT_T flag); + +/**@} end of group SPI_Functions */ +/**@} end of group SPI_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_SPI_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_tmr.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_tmr.h new file mode 100644 index 0000000000..7b4c4564a6 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_tmr.h @@ -0,0 +1,676 @@ +/*! + * @file apm32s10x_tmr.h + * + * @brief This file contains all the functions prototypes for the TMR firmware library. + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_TMR_H +#define __APM32S10X_TMR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup TMR_Driver TMR Driver + @{ +*/ + +/** @defgroup TMR_Enumerations Enumerations + @{ +*/ + +/** + * @brief TMR Counter Mode + */ +typedef enum +{ + TMR_COUNTER_MODE_UP = 0x0000, + TMR_COUNTER_MODE_DOWN = 0x0010, + TMR_COUNTER_MODE_CENTERALIGNED1 = 0x0020, + TMR_COUNTER_MODE_CENTERALIGNED2 = 0x0040, + TMR_COUNTER_MODE_CENTERALIGNED3 = 0x0060 +} TMR_COUNTER_MODE_T; + +/** + * @brief TMR Clock division + */ +typedef enum +{ + TMR_CLOCK_DIV_1, + TMR_CLOCK_DIV_2, + TMR_CLOCK_DIV_4 +} TMR_CLOCK_DIV_T; + +/** + * @brief TMR Output Compare and PWM modes + */ +typedef enum +{ + TMR_OC_MODE_TMRING = 0x00, + TMR_OC_MODE_ACTIVE = 0x01, + TMR_OC_MODE_INACTIVE = 0x02, + TMR_OC_MODE_TOGGEL = 0x03, + TMR_OC_MODE_LOWLEVEL = 0x04, + TMR_OC_MODE_HIGHLEVEL = 0x05, + TMR_OC_MODE_PWM1 = 0x06, + TMR_OC_MODE_PWM2 = 0x07 +} TMR_OC_MODE_T; + +/** + * @brief TMR Output Compare state + */ +typedef enum +{ + TMR_OC_STATE_DISABLE, + TMR_OC_STATE_ENABLE +} TMR_OC_STATE_T; + +/** + * @brief TMR Output Compare N state + */ +typedef enum +{ + TMR_OC_NSTATE_DISABLE, + TMR_OC_NSTATE_ENABLE +} TMR_OC_NSTATE_T; + +/** + * @brief TMR Output Compare Polarity + */ +typedef enum +{ + TMR_OC_POLARITY_HIGH, + TMR_OC_POLARITY_LOW +} TMR_OC_POLARITY_T; + +/** + * @brief TMR Output Compare N Polarity + */ +typedef enum +{ + TMR_OC_NPOLARITY_HIGH, + TMR_OC_NPOLARITY_LOW +} TMR_OC_NPOLARITY_T; + +/** + * @brief TMR Output Compare Idle State + */ +typedef enum +{ + TMR_OC_IDLE_STATE_RESET, + TMR_OC_IDLE_STATE_SET +} TMR_OC_IDLE_STATE_T; + +/** + * @brief TMR Output Compare N Idle State + */ +typedef enum +{ + TMR_OC_NIDLE_STATE_RESET, + TMR_OC_NIDLE_STATE_SET +} TMR_OC_NIDLE_STATE_T; + +/** + * @brief TMR Input Capture Init structure definition + */ +typedef enum +{ + TMR_CHANNEL_1 = 0x0000, + TMR_CHANNEL_2 = 0x0004, + TMR_CHANNEL_3 = 0x0008, + TMR_CHANNEL_4 = 0x000C +} TMR_CHANNEL_T; + +/** + * @brief TMR Input Capture Polarity + */ +typedef enum +{ + TMR_IC_POLARITY_RISING = 0x00, + TMR_IC_POLARITY_FALLING = 0x02, + TMR_IC_POLARITY_BOTHEDGE = 0x0A +} TMR_IC_POLARITY_T; + +/** + * @brief TMR Input Capture Selection + */ +typedef enum +{ + TMR_IC_SELECTION_DIRECT_TI = 0x01, + TMR_IC_SELECTION_INDIRECT_TI = 0x02, + TMR_IC_SELECTION_TRC = 0x03 +} TMR_IC_SELECTION_T; + +/** + * @brief TMR Input Capture Prescaler + */ +typedef enum +{ + TMR_IC_PSC_1, + TMR_IC_PSC_2, + TMR_IC_PSC_4, + TMR_IC_PSC_8 +} TMR_IC_PSC_T; + +/** + * @brief TMR Specifies the Off-State selection used in Run mode + */ +typedef enum +{ + TMR_RMOS_STATE_DISABLE, + TMR_RMOS_STATE_ENABLE +} TMR_RMOS_STATE_T; + +/** + * @brief TMR Closed state configuration in idle mode + */ +typedef enum +{ + TMR_IMOS_STATE_DISABLE, + TMR_IMOS_STATE_ENABLE +} TMR_IMOS_STATE_T; + +/** + * @brief TMR Protect mode configuration values + */ +typedef enum +{ + TMR_LOCK_LEVEL_OFF, + TMR_LOCK_LEVEL_1, + TMR_LOCK_LEVEL_2, + TMR_LOCK_LEVEL_3 +} TMR_LOCK_LEVEL_T; + +/** + * @brief TMR BRK state + */ +typedef enum +{ + TMR_BRK_STATE_DISABLE, + TMR_BRK_STATE_ENABLE +} TMR_BRK_STATE_T; + +/** + * @brief TMR Specifies the Break Input pin polarity. + */ +typedef enum +{ + TMR_BRK_POLARITY_LOW, + TMR_BRK_POLARITY_HIGH +} TMR_BRK_POLARITY_T; + +/** + * @brief TMR Specifies the Break Input pin polarity. + */ +typedef enum +{ + TMR_AUTOMATIC_OUTPUT_DISABLE, + TMR_AUTOMATIC_OUTPUT_ENABLE +} TMR_AUTOMATIC_OUTPUT_T; + +/** + * @brief TMR_interrupt_sources + */ +typedef enum +{ + TMR_INT_UPDATE = 0x0001, + TMR_INT_CC1 = 0x0002, + TMR_INT_CC2 = 0x0004, + TMR_INT_CC3 = 0x0008, + TMR_INT_CC4 = 0x0010, + TMR_INT_COM = 0x0020, + TMR_INT_TRG = 0x0040, + TMR_INT_BRK = 0x0080 +} TMR_INT_T; + +/** + * @brief TMR event sources + */ +typedef enum +{ + TMR_EVENT_UPDATE = 0x001, + TMR_EVENT_CC1 = 0x002, + TMR_EVENT_CC2 = 0x004, + TMR_EVENT_CC3 = 0x008, + TMR_EVENT_CC4 = 0x010, + TMR_EVENT_COM = 0x020, + TMR_EVENT_TRG = 0x040, + TMR_EVENT_BRK = 0x080 +} TMR_EVENT_T; + +/** + * @brief TMR DMA Base Address + */ +typedef enum +{ + TMR_DMA_BASE_CTRL1 = 0x0000, + TMR_DMA_BASE_CTRL2 = 0x0001, + TMR_DMA_BASE_SMCTRL = 0x0002, + TMR_DMA_BASE_DIEN = 0x0003, + TMR_DMA_BASE_STS = 0x0004, + TMR_DMA_BASE_CEG = 0x0005, + TMR_DMA_BASE_CCM1 = 0x0006, + TMR_DMA_BASE_CCM2 = 0x0007, + TMR_DMA_BASE_CCEN = 0x0008, + TMR_DMA_BASE_CNT = 0x0009, + TMR_DMA_BASE_PSC = 0x000A, + TMR_DMA_BASE_AUTORLD = 0x000B, + TMR_DMA_BASE_REPCNT = 0x000C, + TMR_DMA_BASE_CC1 = 0x000D, + TMR_DMA_BASE_CC2 = 0x000E, + TMR_DMA_BASE_CC3 = 0x000F, + TMR_DMA_BASE_CC4 = 0x0010, + TMR_DMA_BASE_BDT = 0x0011, + TMR_DMA_BASE_DCTRL = 0x0012 +} TMR_DMA_BASE_T; + +/** + * @brief TMR DMA Burst Length + */ +typedef enum +{ + TMR_DMA_BURSTLENGTH_1TRANSFER = 0x0000, + TMR_DMA_BURSTLENGTH_2TRANSFERS = 0x0100, + TMR_DMA_BURSTLENGTH_3TRANSFERS = 0x0200, + TMR_DMA_BURSTLENGTH_4TRANSFERS = 0x0300, + TMR_DMA_BURSTLENGTH_5TRANSFERS = 0x0400, + TMR_DMA_BURSTLENGTH_6TRANSFERS = 0x0500, + TMR_DMA_BURSTLENGTH_7TRANSFERS = 0x0600, + TMR_DMA_BURSTLENGTH_8TRANSFERS = 0x0700, + TMR_DMA_BURSTLENGTH_9TRANSFERS = 0x0800, + TMR_DMA_BURSTLENGTH_10TRANSFERS = 0x0900, + TMR_DMA_BURSTLENGTH_11TRANSFERS = 0x0A00, + TMR_DMA_BURSTLENGTH_12TRANSFERS = 0x0B00, + TMR_DMA_BURSTLENGTH_13TRANSFERS = 0x0C00, + TMR_DMA_BURSTLENGTH_14TRANSFERS = 0x0D00, + TMR_DMA_BURSTLENGTH_15TRANSFERS = 0x0E00, + TMR_DMA_BURSTLENGTH_16TRANSFERS = 0x0F00, + TMR_DMA_BURSTLENGTH_17TRANSFERS = 0x1000, + TMR_DMA_BURSTLENGTH_18TRANSFERS = 0x1100, +} TMR_DMA_BURSTLENGTH_T; + +/** + * @brief TMR DMA Soueces + */ +typedef enum +{ + TMR_DMA_SOURCE_UPDATE = 0x0100, + TMR_DMA_SOURCE_CC1 = 0x0200, + TMR_DMA_SOURCE_CC2 = 0x0400, + TMR_DMA_SOURCE_CC3 = 0x0800, + TMR_DMA_SOURCE_CC4 = 0x1000, + TMR_DMA_SOURCE_COM = 0x2000, + TMR_DMA_SOURCE_TRG = 0x4000 +} TMR_DMA_SOURCE_T; + +/** + * @brief TMR Internal Trigger Selection + */ +typedef enum +{ + TMR_TRIGGER_SOURCE_ITR0 = 0x00, + TMR_TRIGGER_SOURCE_ITR1 = 0x01, + TMR_TRIGGER_SOURCE_ITR2 = 0x02, + TMR_TRIGGER_SOURCE_ITR3 = 0x03, + TMR_TRIGGER_SOURCE_TI1F_ED = 0x04, + TMR_TRIGGER_SOURCE_TI1FP1 = 0x05, + TMR_TRIGGER_SOURCE_TI2FP2 = 0x06, + TMR_TRIGGER_SOURCE_ETRF = 0x07 +} TMR_TRIGGER_SOURCE_T; + +/** + * @brief TMR The external Trigger Prescaler. + */ +typedef enum +{ + TMR_EXTTRG_PSC_OFF = 0x00, + TMR_EXTTRG_PSC_DIV2 = 0x01, + TMR_EXTTRG_PSC_DIV4 = 0x02, + TMR_EXTTRG_PSC_DIV8 = 0x03 +} TMR_EXTTRG_PSC_T; + +/** + * @brief TMR External Trigger Polarity + */ +typedef enum +{ + TMR_EXTTGR_POL_NONINVERTED, + TMR_EXTTRG_POL_INVERTED +} TMR_EXTTRG_POL_T; + +/** + * @brief TMR Prescaler Reload Mode + */ +typedef enum +{ + TMR_PSC_RELOAD_UPDATE, + TMR_PSC_RELOAD_IMMEDIATE +} TMR_PSC_RELOAD_T; + +/** + * @brief TMR Encoder Mode + */ +typedef enum +{ + TMR_ENCODER_MODE_TI1 = 0x01, + TMR_ENCODER_MODE_TI2 = 0x02, + TMR_ENCODER_MODE_TI12 = 0x03 +} TMR_ENCODER_MODE_T; + +/** + * @brief TMR Forced Action + */ +typedef enum +{ + TMR_FORCED_ACTION_INACTIVE = 0x04, + TMR_FORCED_ACTION_ACTIVE = 0x05 +} TMR_FORCED_ACTION_T; + +/** + * @brief TMR Output Compare Preload State + */ +typedef enum +{ + TMR_OC_PRELOAD_DISABLE, + TMR_OC_PRELOAD_ENABLE +} TMR_OC_PRELOAD_T; + +/** + * @brief TMR Output Compare Preload State + */ +typedef enum +{ + TMR_OC_FAST_DISABLE, + TMR_OC_FAST_ENABLE +} TMR_OC_FAST_T; + +/** + * @brief TMR Output Compare Preload State + */ +typedef enum +{ + TMR_OC_CLEAR_DISABLE, + TMR_OC_CLEAR_ENABLE +} TMR_OC_CLEAR_T; + +/** + * @brief TMR UpdateSource + */ +typedef enum +{ + TMR_UPDATE_SOURCE_GLOBAL, + TMR_UPDATE_SOURCE_REGULAR, +} TMR_UPDATE_SOURCE_T; + +/** + * @brief TMR Single Pulse Mode + */ +typedef enum +{ + TMR_SPM_REPETITIVE, + TMR_SPM_SINGLE, +} TMR_SPM_T; + +/** + * @brief TMR Trigger Output Source + */ +typedef enum +{ + TMR_TRGO_SOURCE_RESET, + TMR_TRGO_SOURCE_ENABLE, + TMR_TRGO_SOURCE_UPDATE, + TMR_TRGO_SOURCE_OC1, + TMR_TRGO_SOURCE_OC1REF, + TMR_TRGO_SOURCE_OC2REF, + TMR_TRGO_SOURCE_OC3REF, + TMR_TRGO_SOURCE_OC4REF +} TMR_TRGO_SOURCE_T; + +/** + * @brief TMR Slave Mode + */ +typedef enum +{ + TMR_SLAVE_MODE_RESET = 0x04, + TMR_SLAVE_MODE_GATED = 0x05, + TMR_SLAVE_MODE_TRIGGER = 0x06, + TMR_SLAVE_MODE_EXTERNAL1 = 0x07 +} TMR_SLAVE_MODE_T; + +/** + * @brief TMR Flag + */ +typedef enum +{ + TMR_FLAG_UPDATE = 0x0001, + TMR_FLAG_CC1 = 0x0002, + TMR_FLAG_CC2 = 0x0004, + TMR_FLAG_CC3 = 0x0008, + TMR_FLAG_CC4 = 0x0010, + TMR_FLAG_COM = 0x0020, + TMR_FLAG_TRG = 0x0040, + TMR_FLAG_BRK = 0x0080, + TMR_FLAG_CC1RC = 0x0200, + TMR_FLAG_CC2RC = 0x0400, + TMR_FLAG_CC3RC = 0x0800, + TMR_FLAG_CC4RC = 0x1000 +} TMR_FLAG_T; + +/**@} end of group TMR_Enumerations */ + +/** @defgroup TMR_Structures Structures + @{ +*/ + +/** + * @brief TMR Base Configure structure definition + */ +typedef struct +{ + TMR_COUNTER_MODE_T countMode; + TMR_CLOCK_DIV_T clockDivision; + uint16_t period; /*!< This must between 0x0000 and 0xFFFF */ + uint16_t division; /*!< This must between 0x0000 and 0xFFFF */ + uint8_t repetitionCounter; /*!< This must between 0x00 and 0xFF, only for TMR1. */ +} TMR_BaseConfig_T; ; + +/** + * @brief TMR Output Compare Configure structure definition + */ +typedef struct +{ + TMR_OC_MODE_T mode; + TMR_OC_STATE_T outputState; + TMR_OC_NSTATE_T outputNState; + TMR_OC_POLARITY_T polarity; + TMR_OC_NPOLARITY_T nPolarity; + TMR_OC_IDLE_STATE_T idleState; + TMR_OC_NIDLE_STATE_T nIdleState; + uint16_t pulse; /*!< This must between 0x0000 and 0xFFFF */ +} TMR_OCConfig_T; + +/** + * @brief TMR BDT structure definition + */ +typedef struct +{ + TMR_RMOS_STATE_T RMOS; + TMR_IMOS_STATE_T IMOS; + TMR_LOCK_LEVEL_T lockLevel; + uint16_t deadTime; + TMR_BRK_STATE_T BRKState; + TMR_BRK_POLARITY_T BRKPolarity; + TMR_AUTOMATIC_OUTPUT_T automaticOutput; +} TMR_BDTConfig_T; + +/** + * @brief TMR Input Capture Configure structure definition + */ +typedef struct +{ + TMR_CHANNEL_T channel; + TMR_IC_POLARITY_T polarity; + TMR_IC_SELECTION_T selection; + TMR_IC_PSC_T prescaler; + uint16_t filter; /*!< This must between 0x00 and 0x0F */ +} TMR_ICConfig_T; + +/**@} end of group TMR_Structures */ + +/** @defgroup TMR_Functions Functions + @{ +*/ + +/* Reset and Configuration */ +void TMR_Reset(TMR_T* tmr); +void TMR_ConfigTimeBase(TMR_T* tmr, TMR_BaseConfig_T* baseConfig); +void TMR_ConfigOC1(TMR_T* tmr, TMR_OCConfig_T* OCConfig); +void TMR_ConfigOC2(TMR_T* tmr, TMR_OCConfig_T* OCConfig); +void TMR_ConfigOC3(TMR_T* tmr, TMR_OCConfig_T* OCConfig); +void TMR_ConfigOC4(TMR_T* tmr, TMR_OCConfig_T* OCConfig); +void TMR_ConfigIC(TMR_T* tmr, TMR_ICConfig_T* ICConfig); +void TMR_ConfigBDT(TMR_T* tmr, TMR_BDTConfig_T* BDTConfig); +void TMR_ConfigTimeBaseStructInit(TMR_BaseConfig_T* baseConfig); +void TMR_ConfigOCStructInit(TMR_OCConfig_T* OCConfig); +void TMR_ConfigICStructInit(TMR_ICConfig_T* ICConfig); +void TMR_ConfigBDTStructInit(TMR_BDTConfig_T* BDTConfig); +void TMR_ConfigSinglePulseMode(TMR_T* tmr, TMR_SPM_T singlePulseMode); +void TMR_ConfigClockDivision(TMR_T* tmr, TMR_CLOCK_DIV_T clockDivision); +void TMR_Enable(TMR_T* tmr); +void TMR_Disable(TMR_T* tmr); + +/* PWM Configuration */ +void TMR_ConfigPWM(TMR_T* tmr, TMR_ICConfig_T* PWMConfig); +void TMR_EnablePWMOutputs(TMR_T* tmr); +void TMR_DisablePWMOutputs(TMR_T* tmr); + +/* DMA */ +void TMR_ConfigDMA(TMR_T* tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T burstLength); +void TMR_EnableDMASoure(TMR_T* tmr, uint16_t dmaSource); +void TMR_DisableDMASoure(TMR_T* tmr, uint16_t dmaSource); + +/* Configuration */ +void TMR_ConfigInternalClock(TMR_T* tmr); +void TMR_ConfigIntTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource); +void TMR_ConfigTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource, + TMR_IC_POLARITY_T ICpolarity, uint16_t ICfilter); +void TMR_ConfigETRClockMode1(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter); +void TMR_ConfigETRClockMode2(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter); +void TMR_ConfigETR(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter); +void TMR_ConfigPrescaler(TMR_T* tmr, uint16_t prescaler, TMR_PSC_RELOAD_T pscReloadMode); +void TMR_ConfigCounterMode(TMR_T* tmr, TMR_COUNTER_MODE_T countMode); +void TMR_SelectInputTrigger(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSouce); +void TMR_ConfigEncodeInterface(TMR_T* tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC_POLARITY_T IC1Polarity, + TMR_IC_POLARITY_T IC2Polarity); +void TMR_ConfigForcedOC1(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC2(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC3(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC4(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction); +void TMR_EnableAutoReload(TMR_T* tmr); +void TMR_DisableAutoReload(TMR_T* tmr); +void TMR_EnableSelectCOM(TMR_T* tmr); +void TMR_DisableSelectCOM(TMR_T* tmr); +void TMR_EnableCCDMA(TMR_T* tmr); +void TMR_DisableCCDMA(TMR_T* tmr); +void TMR_EnableCCPreload(TMR_T* tmr); +void TMR_DisableCCPreload(TMR_T* tmr); +void TMR_ConfigOC1Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC2Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC3Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC4Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC1Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC2Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC3Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC4Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); +void TMR_ClearOC1Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC2Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC3Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC4Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ConfigOC1Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC1NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC2Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC2NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC3Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC3NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC4Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_EnableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel); +void TMR_DisableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel); +void TMR_EnableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel); +void TMR_DisableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel); +void TMR_SelectOCxMode(TMR_T* tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T OCMode); +void TMR_EnableUpdate(TMR_T* tmr); +void TMR_DisableUpdate(TMR_T* tmr); +void TMR_ConfigUpdateRequest(TMR_T* tmr, TMR_UPDATE_SOURCE_T updateSource); +void TMR_EnableHallSensor(TMR_T* tmr); +void TMR_DisableHallSensor(TMR_T* tmr); +void TMR_SelectOutputTrigger(TMR_T* tmr, TMR_TRGO_SOURCE_T TRGOSource); +void TMR_SelectSlaveMode(TMR_T* tmr, TMR_SLAVE_MODE_T slaveMode); +void TMR_EnableMasterSlaveMode(TMR_T* tmr); +void TMR_DisableMasterSlaveMode(TMR_T* tmr); +void TMR_ConfigCounter(TMR_T* tmr, uint16_t counter); +void TMR_ConfigAutoreload(TMR_T* tmr, uint16_t autoReload); +void TMR_ConfigCompare1(TMR_T* tmr, uint16_t compare1); +void TMR_ConfigCompare2(TMR_T* tmr, uint16_t compare2); +void TMR_ConfigCompare3(TMR_T* tmr, uint16_t compare3); +void TMR_ConfigCompare4(TMR_T* tmr, uint16_t compare4); +void TMR_ConfigIC1Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC2Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC3Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC4Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); +uint16_t TMR_ReadCaputer1(TMR_T* tmr); +uint16_t TMR_ReadCaputer2(TMR_T* tmr); +uint16_t TMR_ReadCaputer3(TMR_T* tmr); +uint16_t TMR_ReadCaputer4(TMR_T* tmr); +uint16_t TMR_ReadCounter(TMR_T* tmr); +uint16_t TMR_ReadPrescaler(TMR_T* tmr); + +/* Interrupts and Event */ +void TMR_EnableInterrupt(TMR_T* tmr, uint16_t interrupt); +void TMR_DisableInterrupt(TMR_T* tmr, uint16_t interrupt); +void TMR_GenerateEvent(TMR_T* tmr, uint16_t eventSources); + +/* flags */ +uint16_t TMR_ReadStatusFlag(TMR_T* tmr, TMR_FLAG_T flag); +void TMR_ClearStatusFlag(TMR_T* tmr, uint16_t flag); +uint16_t TMR_ReadIntFlag(TMR_T* tmr, TMR_INT_T flag); +void TMR_ClearIntFlag(TMR_T* tmr, uint16_t flag); + +/**@} end of group TMR_Functions */ +/**@} end of group TMR_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_TMR_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_usart.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_usart.h new file mode 100644 index 0000000000..08e82558f2 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_usart.h @@ -0,0 +1,312 @@ +/*! + * @file apm32s10x_usart.h + * + * @brief This file contains all the functions prototypes for the USART firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_USART_H +#define __APM32S10X_USART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup USART_Driver USART Driver + @{ +*/ + +/** @defgroup USART_Enumerations Enumerations + @{ +*/ + +/** + * @brief USART Word Length define + */ +typedef enum +{ + USART_WORD_LEN_8B = 0, + USART_WORD_LEN_9B = BIT12 +} USART_WORD_LEN_T; + +/** + * @brief USART Stop bits define + */ +typedef enum +{ + USART_STOP_BIT_1 = 0, + USART_STOP_BIT_0_5 = BIT12, + USART_STOP_BIT_2 = BIT13, + USART_STOP_BIT_1_5 = BIT12 | BIT13 +} USART_STOP_BIT_T; + +/** + * @brief USART Parity define + */ +typedef enum +{ + USART_PARITY_NONE = 0, + USART_PARITY_EVEN = BIT10, + USART_PARITY_ODD = BIT10 | BIT9 +} USART_PARITY_T; + +/** + * @brief USART mode define + */ +typedef enum +{ + USART_MODE_RX = BIT2, + USART_MODE_TX = BIT3, + USART_MODE_TX_RX = BIT2 | BIT3 +} USART_MODE_T; + +/** + * @brief USART hardware flow control define + */ +typedef enum +{ + USART_HARDWARE_FLOW_NONE = 0, + USART_HARDWARE_FLOW_RTS = BIT8, + USART_HARDWARE_FLOW_CTS = BIT9, + USART_HARDWARE_FLOW_RTS_CTS = BIT8 | BIT9 +} USART_HARDWARE_FLOW_T; + +/** + * @brief USART Clock enable + */ +typedef enum +{ + USART_CLKEN_DISABLE, + USART_CLKEN_ENABLE +} USART_CLKEN_T; + +/** + * @brief USART Clock polarity define + */ +typedef enum +{ + USART_CLKPOL_LOW, + USART_CLKPOL_HIGH +} USART_CLKPOL_T; + +/** + * @brief USART Clock phase define + */ +typedef enum +{ + USART_CLKPHA_1EDGE, + USART_CLKPHA_2EDGE +} USART_CLKPHA_T; + +/** + * @brief USART Last bit clock pulse enable + */ +typedef enum +{ + USART_LBCP_DISABLE, + USART_LBCP_ENABLE, +} USART_LBCP_T; + +/** + * @brief USART Interrupt Source + */ +typedef enum +{ + USART_INT_PE = 0x0010100, + USART_INT_TXBE = 0x7010080, + USART_INT_TXC = 0x6010040, + USART_INT_RXBNE = 0x5010020, + USART_INT_IDLE = 0x4010010, + USART_INT_LBD = 0x8020040, + USART_INT_CTS = 0x9040400, + USART_INT_ERR = 0x0040001, + USART_INT_OVRE = 0x3040001, + USART_INT_NE = 0x2040001, + USART_INT_FE = 0x1040001 +} USART_INT_T; + +/** + * @brief USART DMA enable + */ +typedef enum +{ + USART_DMA_TX = BIT7, + USART_DMA_RX = BIT6, + USART_DMA_TX_RX = BIT6 | BIT7 +} USART_DMA_T; + +/** + * @brief USART Wakeup method + */ +typedef enum +{ + USART_WAKEUP_IDLE_LINE, + USART_WAKEUP_ADDRESS_MARK +} USART_WAKEUP_T; + +/** + * @brief USART LIN break detection length + */ +typedef enum +{ + USART_LBDL_10B, + USART_LBDL_11B +} USART_LBDL_T; + +/** + * @brief USART IrDA low-power + */ +typedef enum +{ + USART_IRDALP_NORMAL, + USART_IRDALP_LOWPOWER +} USART_IRDALP_T; + +/** + * @brief USART flag define + */ +typedef enum +{ + USART_FLAG_CTS = 0x0200, + USART_FLAG_LBD = 0x0100, + USART_FLAG_TXBE = 0x0080, + USART_FLAG_TXC = 0x0040, + USART_FLAG_RXBNE = 0x0020, + USART_FLAG_IDLE = 0x0010, + USART_FLAG_OVRE = 0x0008, + USART_FLAG_NE = 0x0004, + USART_FLAG_FE = 0x0002, + USART_FLAG_PE = 0x0001 +} USART_FLAG_T; + +/**@} end of group USART_Enumerations */ + +/** @defgroup USART_Structures Structures + @{ +*/ + +/** + * @brief USART Config struct definition + */ +typedef struct +{ + uint32_t baudRate; /*!< Specifies the baud rate */ + USART_WORD_LEN_T wordLength; /*!< Specifies the word length */ + USART_STOP_BIT_T stopBits; /*!< Specifies the stop bits */ + USART_PARITY_T parity; /*!< Specifies the parity */ + USART_MODE_T mode; /*!< Specifies the mode */ + USART_HARDWARE_FLOW_T hardwareFlow; /*!< Specifies the hardware flow control */ +} USART_Config_T; + +/** + * @brief USART synchronous communication clock configure structure definition + */ +typedef struct +{ + USART_CLKEN_T clock; /*!< Enable or Disable Clock */ + USART_CLKPOL_T polarity; /*!< Specifies the clock polarity */ + USART_CLKPHA_T phase; /*!< Specifies the clock phase */ + USART_LBCP_T lastBit; /*!< Enable or Disable last bit clock */ +} USART_ClockConfig_T; + +/**@} end of group USART_Structures */ + +/** @defgroup USART_Functions Functions + @{ +*/ + +/* USART Reset and Configuration */ +void USART_Reset(USART_T* usart); +void USART_Config(USART_T* uart, USART_Config_T* usartConfig); +void USART_ConfigStructInit(USART_Config_T* usartConfig); +void USART_Address(USART_T* usart, uint8_t address); +void USART_Enable(USART_T* usart); +void USART_Disable(USART_T* usart); + +/* Clock communication */ +void USART_ConfigClock(USART_T* usart, USART_ClockConfig_T* clockConfig); +void USART_ConfigClockStructInit(USART_ClockConfig_T* clockConfig); + +/* DMA mode */ +void USART_EnableDMA(USART_T* usart, USART_DMA_T dmaReq); +void USART_DisableDMA(USART_T* usart, USART_DMA_T dmaReq); + +/* Mute mode */ +void USART_ConfigWakeUp(USART_T* usart, USART_WAKEUP_T wakeup); +void USART_EnableMuteMode(USART_T* usart); +void USART_DisableMuteMode(USART_T* usart); + +/* LIN mode */ +void USART_ConfigLINBreakDetectLength(USART_T* usart, USART_LBDL_T length); +void USART_EnableLIN(USART_T* usart); +void USART_DisableLIN(USART_T* usart); + +/* Transmit and receive */ +void USART_EnableTx(USART_T* usart); +void USART_DisableTx(USART_T* usart); +void USART_EnableRx(USART_T* usart); +void USART_DisableRx(USART_T* usart); +void USART_TxData(USART_T* usart, uint16_t data); +uint16_t USART_RxData(USART_T* usart); +void USART_TxBreak(USART_T* usart); + +/* Smartcard mode */ +void USART_ConfigGuardTime(USART_T* usart, uint8_t guardTime); +void USART_ConfigPrescaler(USART_T* usart, uint8_t div); +void USART_EnableSmartCard(USART_T* usart); +void USART_DisableSmartCard(USART_T* usart); +void USART_EnableSmartCardNACK(USART_T* usart); +void USART_DisableSmartCardNACK(USART_T* usart); + +/* Half-duplex mode*/ +void USART_EnableHalfDuplex(USART_T* usart); +void USART_DisableHalfDuplex(USART_T* usart); + +/* IrDA mode */ +void USART_ConfigIrDA(USART_T* usart, USART_IRDALP_T IrDAMode); +void USART_EnableIrDA(USART_T* usart); +void USART_DisableIrDA(USART_T* usart); + +/* Interrupt and flag */ +void USART_EnableInterrupt(USART_T* usart, USART_INT_T interrupt); +void USART_DisableInterrupt(USART_T* usart, USART_INT_T interrupt); +uint8_t USART_ReadStatusFlag(USART_T* usart, USART_FLAG_T flag); +void USART_ClearStatusFlag(USART_T* usart, USART_FLAG_T flag); +uint8_t USART_ReadIntFlag(USART_T* usart, USART_INT_T flag); +void USART_ClearIntFlag(USART_T* usart, USART_INT_T flag); + +/**@} end of group USART_Functions */ +/**@} end of group USART_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_USART_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_wwdt.h b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_wwdt.h new file mode 100644 index 0000000000..dc49fc680f --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/inc/apm32s10x_wwdt.h @@ -0,0 +1,94 @@ +/*! + * @file apm32s10x_wwdt.h + * + * @brief This file contains all the functions prototypes for the WWDT firmware library + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_WWDT_H +#define __APM32S10X_WWDT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup WWDT_Driver WWDT Driver + @{ +*/ + +/** @defgroup WWDT_Enumerations Enumerations + @{ +*/ + +/** + * @brief WWDT Timebase(Prescaler) define + */ +typedef enum +{ + WWDT_TIME_BASE_1 = 0x00000000, + WWDT_TIME_BASE_2 = 0x00000080, + WWDT_TIME_BASE_4 = 0x00000100, + WWDT_TIME_BASE_8 = 0x00000180 +} WWDT_TIME_BASE_T; + +/**@} end of group WWDT_Enumerations */ + +/** @defgroup WWDT_Functions Functions + @{ +*/ + +/* WWDT reset */ +void WWDT_Reset(void); + +/* Config WWDT Timebase */ +void WWDT_ConfigTimebase(WWDT_TIME_BASE_T timeBase); + +/* Config Window Data */ +void WWDT_ConfigWindowData(uint8_t windowData); + +/* Config Couter */ +void WWDT_ConfigCounter(uint8_t counter); + +/* Enable WWDT and Early Wakeup interrupt */ +void WWDT_EnableEWI(void); +void WWDT_Enable(uint8_t count); + +/* Read Flag and Clear Flag */ +uint8_t WWDT_ReadFlag(void); +void WWDT_ClearFlag(void); + +/**@} end of group WWDT_Functions */ +/**@} end of group WWDT_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_WWDT_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_adc.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_adc.c new file mode 100644 index 0000000000..5e2f32eaa7 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_adc.c @@ -0,0 +1,1052 @@ +/*! + * @file apm32s10x_adc.c + * + * @brief This file provides all the ADC firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_adc.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup ADC_Driver ADC Driver + @{ +*/ + +/** @defgroup ADC_Functions Functions + @{ +*/ + +/*! + * @brief Reset ADC peripheral registers to their default reset values. + * + * @param adc: Select ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_Reset(ADC_T* adc) +{ + if (adc == ADC1) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_ADC1); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_ADC1); + } + else if (adc == ADC2) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_ADC2); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_ADC2); + } +} + +/*! + * @brief Config the ADC peripheral according to the specified parameters in the adcConfig. + * + * @param adc: Select ADC peripheral. + * + * @param adcConfig: pointer to a ADC_Config_T structure. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig) +{ + uint32_t reg; + + reg = adc->CTRL1; + reg &= 0xFFF0FEFF; + reg |= (uint32_t)((adcConfig->mode) | ((uint32_t)adcConfig->scanConvMode << 8)); + adc->CTRL1 = reg; + + reg = adc->CTRL2; + reg &= 0xFFF1F7FD; + reg |= (uint32_t)adcConfig->dataAlign | \ + (uint32_t)adcConfig->externalTrigConv | \ + ((uint32_t)adcConfig->continuosConvMode << 1); + + adc->CTRL2 = reg; + + reg = adc->REGSEQ1; + reg &= 0xFF0FFFFF; + reg |= (uint32_t)((adcConfig->nbrOfChannel - (uint8_t)1) << 20); + adc->REGSEQ1 = reg; +} + +/*! + * @brief Fills each ADC_Config_T member with its default value. + * + * @param adcConfig: pointer to a ADC_Config_T structure which will be initialized. + * + * @retval None + */ +void ADC_ConfigStructInit(ADC_Config_T* adcConfig) +{ + adcConfig->mode = ADC_MODE_INDEPENDENT; + adcConfig->scanConvMode = DISABLE; + adcConfig->continuosConvMode = DISABLE; + adcConfig->externalTrigConv = ADC_EXT_TRIG_CONV_TMR1_CC1; + adcConfig->dataAlign = ADC_DATA_ALIGN_RIGHT; + adcConfig->nbrOfChannel = 1; +} + +/*! + * @brief Enables the specified ADC peripheral. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_Enable(ADC_T* adc) +{ + adc->CTRL2_B.ADCEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC peripheral. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_Disable(ADC_T* adc) +{ + adc->CTRL2_B.ADCEN = BIT_RESET; +} + +/*! + * @brief Disable the specified ADC DMA request. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableDMA(ADC_T* adc) +{ + adc->CTRL2_B.DMAEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC DMA request. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableDMA(ADC_T* adc) +{ + adc->CTRL2_B.DMAEN = BIT_RESET; +} + +/*! + * @brief Reset the specified ADC calibration registers. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ResetCalibration(ADC_T* adc) +{ + adc->CTRL2_B.CALRST = BIT_SET; +} + +/*! + * @brief Reads the specified ADC calibration reset status. + * + * @param adc: Select the ADC peripheral. + * + * @retval The status of ADC calibration reset. + * + * @note adc can be ADC1, ADC2. + */ +uint8_t ADC_ReadResetCalibrationStatus(ADC_T* adc) +{ + uint8_t ret; + ret = (adc->CTRL2_B.CALRST) ? BIT_SET : BIT_RESET; + return ret; +} + +/*! + * @brief Starts the specified ADC calibration. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_StartCalibration(ADC_T* adc) +{ + adc->CTRL2_B.CAL = BIT_SET; +} + +/*! + * @brief Reads the specified ADC calibration start flag. + * + * @param adc: Select the ADC peripheral. + * + * @retval The status of ADC calibration start. + * + * @note adc can be ADC1, ADC2. + */ +uint8_t ADC_ReadCalibrationStartFlag(ADC_T* adc) +{ + uint8_t ret; + ret = (adc->CTRL2_B.CAL) ? BIT_SET : BIT_RESET; + return ret; +} + +/*! + * @brief Enables the specified ADC software start conversion. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableSoftwareStartConv(ADC_T* adc) +{ + adc->CTRL2 |= 0x00500000; +} + +/*! + * @brief Disable the specified ADC software start conversion. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableSoftwareStartConv(ADC_T* adc) +{ + adc->CTRL2 &= 0xFFAFFFFF; +} + +/*! + * @brief Reads the specified ADC Software start conversion Status. + * + * @param adc: Select the ADC peripheral. + * + * @retval The status of ADC Software start conversion registers. + * + * @note adc can be ADC1, ADC2. + */ +uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T* adc) +{ + uint8_t ret; + ret = (adc->CTRL2_B.REGSWSC) ? BIT_SET : BIT_RESET; + return ret; +} + +/*! + * @brief Configures the specified ADC regular discontinuous mode. + * + * @param adc: Select the ADC peripheral. + * + * @param number: The number of the discontinuous mode regular channels. + * This parameter can be between 1 and 8. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ConfigDiscMode(ADC_T* adc, uint8_t number) +{ + adc->CTRL1_B.DISCNUMCFG |= number - 1; +} + +/*! + * @brief Enable the specified ADC regular discontinuous mode. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableDiscMode(ADC_T* adc) +{ + adc->CTRL1_B.REGDISCEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC regular discontinuous mode. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableDiscMode(ADC_T* adc) +{ + adc->CTRL1_B.REGDISCEN = BIT_RESET; +} + +/*! + * @brief Configures the specified ADC regular channel. + * + * @param adc: Select the ADC peripheral. + * + * @param channel: Select the ADC channel. + * This parameter can be one of the following values: + * @arg ADC_CHANNEL_0: ADC channel 0 + * @arg ADC_CHANNEL_1: ADC channel 1 + * @arg ADC_CHANNEL_2: ADC channel 2 + * @arg ADC_CHANNEL_3: ADC channel 3 + * @arg ADC_CHANNEL_4: ADC channel 4 + * @arg ADC_CHANNEL_5: ADC channel 5 + * @arg ADC_CHANNEL_6: ADC channel 6 + * @arg ADC_CHANNEL_7: ADC channel 7 + * @arg ADC_CHANNEL_8: ADC channel 8 + * @arg ADC_CHANNEL_9: ADC channel 9 + * @arg ADC_CHANNEL_10: ADC channel 10 + * @arg ADC_CHANNEL_11: ADC channel 11 + * @arg ADC_CHANNEL_12: ADC channel 12 + * @arg ADC_CHANNEL_13: ADC channel 13 + * @arg ADC_CHANNEL_14: ADC channel 14 + * @arg ADC_CHANNEL_15: ADC channel 15 + * @arg ADC_CHANNEL_16: ADC channel 16 which is connected to TempSensor + * @arg ADC_CHANNEL_17: ADC channel 17 which is connected to Vrefint + * + * @param rank: The rank in the regular group sequencer + * This parameter must be between 1 to 16. + * + * @param sampleTime: the specified ADC channel SampleTime + * The parameter can be one of following values: + * @arg ADC_SAMPLETIME_1CYCLES5: ADC 1.5 clock cycles + * @arg ADC_SAMPLETIME_7CYCLES5: ADC 7.5 clock cycles + * @arg ADC_SAMPLETIME_13CYCLES5: ADC 13.5 clock cycles + * @arg ADC_SAMPLETIME_28CYCLES5: ADC 28.5 clock cycles + * @arg ADC_SAMPLETIME_41CYCLES5: ADC 41.5 clock cycles + * @arg ADC_SAMPLETIME_55CYCLES5: ADC 55.5 clock cycles + * @arg ADC_SAMPLETIME_71CYCLES5: ADC 71.5 clock cycles + * @arg ADC_SAMPLETIME_239CYCLES5: ADC 239.5 clock cycles + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime) +{ + uint32_t temp1 = 0; + uint32_t temp2 = 0; + if (channel > ADC_CHANNEL_9) + { + temp1 = adc->SMPTIM1; + temp2 = SMPCYCCFG_SET_SMPTIM1 << (3 * (channel - 10)); + temp1 &= ~temp2; + temp2 = (uint32_t)sampleTime << (3 * (channel - 10)); + temp1 |= temp2; + adc->SMPTIM1 = temp1; + } + else + { + temp1 = adc->SMPTIM2; + temp2 = SMPCYCCFG_SET_SMPTIM2 << (3 * channel); + temp1 &= ~temp2; + temp2 = (uint32_t)sampleTime << (3 * channel); + temp1 |= temp2; + adc->SMPTIM2 = temp1; + } + + if (rank < 7) + { + temp1 = adc->REGSEQ3; + temp2 = REGSEQC_SET_REGSEQ3 << (5 * (rank - 1)); + temp1 &= ~temp2; + temp2 = (uint32_t)channel << (5 * (rank - 1)); + temp1 |= temp2; + adc->REGSEQ3 = temp1; + } + else if (rank < 13) + { + temp1 = adc->REGSEQ2; + temp2 = REGSEQC_SET_REGSEQ2 << (5 * (rank - 7)); + temp1 &= ~temp2; + temp2 = (uint32_t)channel << (5 * (rank - 7)); + temp1 |= temp2; + adc->REGSEQ2 = temp1; + } + else + { + temp1 = adc->REGSEQ1; + temp2 = REGSEQC_SET_REGSEQ1 << (5 * (rank - 13)); + temp1 &= ~temp2; + temp2 = (uint32_t)channel << (5 * (rank - 13)); + temp1 |= temp2; + adc->REGSEQ1 = temp1; + } +} + +/*! + * @brief Enable the specified ADC regular channel external trigger. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableExternalTrigConv(ADC_T* adc) +{ + adc->CTRL2_B.REGEXTTRGEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC regular channel external trigger. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableExternalTrigConv(ADC_T* adc) +{ + adc->CTRL2_B.REGEXTTRGEN = BIT_RESET; +} + +/*! + * @brief Reads the specified ADC conversion result data. + * + * @param adc: Select the ADC peripheral. + * + * @retval The Data conversion value. + * + * @note adc can be ADC1, ADC2. + */ +uint16_t ADC_ReadConversionValue(ADC_T* adc) +{ + return (uint16_t) adc->REGDATA; +} + +/*! + * @brief Reads the specified ADC conversion result data in dual mode. + * + * @param adc: Select the ADC peripheral. + * + * @retval The Data conversion value. + * + * @note adc can be ADC1, ADC2. + */ +uint32_t ADC_ReadDualModeConversionValue(ADC_T* adc) +{ + return (*(__IOM uint32_t*) RDG_ADDRESS); +} + +/*! + * @brief Enable the specified ADC automatic injected group. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableAutoInjectedConv(ADC_T* adc) +{ + adc->CTRL1_B.INJGACEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC automatic injected group. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableAutoInjectedConv(ADC_T* adc) +{ + adc->CTRL1_B.INJGACEN = BIT_RESET; +} + +/*! + * @brief Enable the specified ADC discontinuous mode for injected group. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableInjectedDiscMode(ADC_T* adc) +{ + adc->CTRL1_B.INJDISCEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC discontinuous mode for injected group. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableInjectedDiscMode(ADC_T* adc) +{ + adc->CTRL1_B.INJDISCEN = BIT_RESET; +} + +/*! + * @brief Configures the specified ADC external trigger for injected channels conversion + * + * @param adc: Select the ADC peripheral + * + * @param extTrigInjecConv: Select the ADC trigger to start injected conversion + * This parameter can be one of the following values: + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR1_TRGO : Select Timer1 TRGO event + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR1_CC4 : Select Timer1 capture compare4 + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR2_TRGO : Select Timer2 TRGO event + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR2_CC1 : Select Timer2 capture compare1 + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR3_CC4 : Select Timer3 capture compare4 + * @arg ADC_EXT_TRIG_INJEC_CONV_TMR4_TRGO : Select Timer4 TRGO event selected + * @arg ADC_EXT_TRIG_INJEC_CONV_EINT15 : External interrupt line 15 + * @arg ADC_EXT_TRIG_INJEC_CONV_NONE : Injected conversion started by software instead of external trigger + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ConfigExternalTrigInjectedConv(ADC_T* adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv) +{ + adc->CTRL2_B.INJGEXTTRGSEL = RESET; + adc->CTRL2_B.INJGEXTTRGSEL |= extTrigInjecConv; +} + +/*! + * @brief Ensable the specified ADC injected channels conversion through + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableExternalTrigInjectedConv(ADC_T* adc) +{ + adc->CTRL2_B.INJEXTTRGEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC injected channels conversion through + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableExternalTrigInjectedConv(ADC_T* adc) +{ + adc->CTRL2_B.INJEXTTRGEN = BIT_RESET; +} + +/*! + * @brief Enable the specified ADC start of the injected + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableSoftwareStartInjectedConv(ADC_T* adc) +{ + adc->CTRL2_B.INJEXTTRGEN = BIT_SET; + adc->CTRL2_B.INJSWSC = BIT_SET; +} + +/*! + * @brief Disable the specified ADC start of the injected + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableSoftwareStartInjectedConv(ADC_T* adc) +{ + adc->CTRL2_B.INJEXTTRGEN = BIT_RESET; + adc->CTRL2_B.INJSWSC = BIT_RESET; +} + +/*! + * @brief Reads the specified ADC Software start injected conversion Status + * + * @param adc: Select the ADC peripheral + * + * @retval The status of ADC Software start injected conversion + * + * @note adc can be ADC1, ADC2. + */ +uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T* adc) +{ + uint8_t ret; + ret = (adc->CTRL2_B.INJSWSC) ? BIT_SET : BIT_RESET; + return ret; +} + +/*! + * @brief Configures the specified ADC injected channel. + * + * @param adc: Select the ADC peripheral. + * + * @param channel: Select the ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_CHANNEL_0: ADC channel 0 + * @arg ADC_CHANNEL_1: ADC channel 1 + * @arg ADC_CHANNEL_2: ADC channel 2 + * @arg ADC_CHANNEL_3: ADC channel 3 + * @arg ADC_CHANNEL_4: ADC channel 4 + * @arg ADC_CHANNEL_5: ADC channel 5 + * @arg ADC_CHANNEL_6: ADC channel 6 + * @arg ADC_CHANNEL_7: ADC channel 7 + * @arg ADC_CHANNEL_8: ADC channel 8 + * @arg ADC_CHANNEL_9: ADC channel 9 + * @arg ADC_CHANNEL_10: ADC channel 10 + * @arg ADC_CHANNEL_11: ADC channel 11 + * @arg ADC_CHANNEL_12: ADC channel 12 + * @arg ADC_CHANNEL_13: ADC channel 13 + * @arg ADC_CHANNEL_14: ADC channel 14 + * @arg ADC_CHANNEL_15: ADC channel 15 + * @arg ADC_CHANNEL_16: ADC channel 16 which is connected to TempSensor + * @arg ADC_CHANNEL_17: ADC channel 17 which is connected to Vrefint + * + * @param rank: The rank in the injected group sequencer. + * This parameter must be between 1 to 4. + * + * @param sampleTime: the specified ADC channel SampleTime + * The parameter can be one of following values: + * @arg ADC_SAMPLETIME_1CYCLES5: ADC 1.5 clock cycles + * @arg ADC_SAMPLETIME_7CYCLES5: ADC 7.5 clock cycles + * @arg ADC_SAMPLETIME_13CYCLES5: ADC 13.5 clock cycles + * @arg ADC_SAMPLETIME_28CYCLES5: ADC 28.5 clock cycles + * @arg ADC_SAMPLETIME_41CYCLES5: ADC 41.5 clock cycles + * @arg ADC_SAMPLETIME_55CYCLES5: ADC 55.5 clock cycles + * @arg ADC_SAMPLETIME_71CYCLES5: ADC 71.5 clock cycles + * @arg ADC_SAMPLETIME_239CYCLES5: ADC 239.5 clock cycles + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime) +{ + uint32_t temp1 = 0; + uint32_t temp2 = 0; + uint32_t temp3 = 0; + if (channel > ADC_CHANNEL_9) + { + temp1 = adc->SMPTIM1; + temp2 = SMPCYCCFG_SET_SMPTIM1 << (3 * (channel - 10)); + temp1 &= ~temp2; + temp2 = (uint32_t)sampleTime << (3 * (channel - 10)); + temp1 |= temp2; + adc->SMPTIM1 = temp1; + } + else + { + temp1 = adc->SMPTIM2; + temp2 = SMPCYCCFG_SET_SMPTIM2 << (3 * channel); + temp1 &= ~temp2; + temp2 = (uint32_t)sampleTime << (3 * channel); + temp1 |= temp2; + adc->SMPTIM2 = temp1; + } + temp1 = adc->INJSEQ; + temp3 = (temp1 & INJSEQ_SET_INJSEQLEN) >> 20; + temp2 = INJSEQ_SET_INJSEQC << (5 * (uint8_t)((rank + 3) - (temp3 + 1))); + temp1 &= ~temp2; + temp2 = (uint32_t)channel << (5 * (uint8_t)((rank + 3) - (temp3 + 1))); + temp1 |= temp2; + adc->INJSEQ = temp1; +} + +/*! + * @brief Configures the specified ADC injected channel. + * + * @param adc: Select the ADC peripheral. + * + * @param length: The sequencer length. + * This parameter must be a number between 1 to 4. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ConfigInjectedSequencerLength(ADC_T* adc, uint8_t length) +{ + adc->INJSEQ_B.INJSEQLEN = RESET; + adc->INJSEQ_B.INJSEQLEN |= length - 1; +} + +/*! + * @brief Configures the specified ADC injected channel conversion value offset. + * + * @param adc: Select the ADC peripheral. + * + * @param channel: Select the ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_INJEC_CHANNEL_1: select Injected Channel 1 + * @arg ADC_INJEC_CHANNEL_2: select Injected Channel 2 + * @arg ADC_INJEC_CHANNEL_3: select Injected Channel 3 + * @arg ADC_INJEC_CHANNEL_4: select Injected Channel 4 + * + * @param offSet: The specified ADC injected channel offset. + * This parameter must be a 12bit value. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ConfigInjectedOffset(ADC_T* adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet) +{ + __IOM uint32_t tmp = 0; + + tmp = (uint32_t)adc; + tmp += channel; + + *(__IOM uint32_t*) tmp = (uint32_t)offSet; +} + +/*! + * @brief Reads the ADC injected channel conversion value. + * + * @param adc: Select the ADC peripheral. + * + * @param channel: Select the ADC injected channel. + * This parameter can be one of the following values: + * @arg ADC_INJEC_CHANNEL_1: select Injected Channel 1 + * @arg ADC_INJEC_CHANNEL_2: select Injected Channel 2 + * @arg ADC_INJEC_CHANNEL_3: select Injected Channel 3 + * @arg ADC_INJEC_CHANNEL_4: select Injected Channel 4 + * + * @retval The Data of conversion value. + * + * @note adc can be ADC1, ADC2. + */ +uint16_t ADC_ReadInjectedConversionValue(ADC_T* adc, ADC_INJEC_CHANNEL_T channel) +{ + __IOM uint32_t temp = 0; + + temp = (uint32_t)adc; + temp += channel + INJDATA_OFFSET; + + return (uint16_t)(*(__IOM uint32_t*) temp); +} + +/*! + * @brief Enable the specified ADC analog watchdog. + * + * @param adc: Select the ADC peripheral. + * + * @param analogWatchdog: The ADC analog watchdog configuration + * This parameter can be one of the following values: + * @arg ADC_ANALOG_WATCHDOG_SINGLE_REG : Analog watchdog on a single regular channel + * @arg ADC_ANALOG_WATCHDOG_SINGLE_INJEC : Analog watchdog on a single injected channel + * @arg ADC_ANALOG_WATCHDOG_SINGLE_REG_INJEC : Analog watchdog on a single regular or injected channel + * @arg ADC_ANALOG_WATCHDOG_ALL_REG : Analog watchdog on all regular channel + * @arg ADC_ANALOG_WATCHDOG_ALL_INJEC : Analog watchdog on all injected channel + * @arg ADC_ANALOG_WATCHDOG_ALL_REG_ALL_INJEC : Analog watchdog on all regular and injected channels + * @arg ADC_ANALOG_WATCHDOG_NONE : No channel guarded by the analog watchdog + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableAnalogWatchdog(ADC_T* adc, uint32_t analogWatchdog) +{ + adc->CTRL1 &= 0xFF3FFDFF; + adc->CTRL1 |= analogWatchdog; +} + +/*! + * @brief Disable the specified ADC analog watchdog. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableAnalogWatchdog(ADC_T* adc) +{ + adc->CTRL1 &= 0xFF3FFDFF; +} + +/*! + * @brief Configures the specified ADC high and low thresholds of the analog watchdog. + * + * @param adc: Select the ADC peripheral. + * + * @param highThreshold: The ADC analog watchdog High threshold value. + * This parameter must be a 12bit value. + * + * @param lowThreshold: The ADC analog watchdog Low threshold value. + * This parameter must be a 12bit value. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ConfigAnalogWatchdogThresholds(ADC_T* adc, uint16_t highThreshold, uint16_t lowThreshold) +{ + adc->AWDHT = highThreshold; + adc->AWDLT = lowThreshold; +} + +/*! + * @brief Configures the specified ADC analog watchdog guarded single channel + * + * @param adc: Select the ADC peripheral + * + * @param channel: Select the ADC channel + * This parameter can be one of the following values: + * @arg ADC_Channel_0: Select ADC Channel 0 + * @arg ADC_Channel_1: Select ADC Channel 1 + * @arg ADC_Channel_2: Select ADC Channel 2 + * @arg ADC_Channel_3: Select ADC Channel 3 + * @arg ADC_Channel_4: Select ADC Channel 4 + * @arg ADC_Channel_5: Select ADC Channel 5 + * @arg ADC_Channel_6: Select ADC Channel 6 + * @arg ADC_Channel_7: Select ADC Channel 7 + * @arg ADC_Channel_8: Select ADC Channel 8 + * @arg ADC_Channel_9: Select ADC Channel 9 + * @arg ADC_Channel_10: Select ADC Channel 10 + * @arg ADC_Channel_11: Select ADC Channel 11 + * @arg ADC_Channel_12: Select ADC Channel 12 + * @arg ADC_Channel_13: Select ADC Channel 13 + * @arg ADC_Channel_14: Select ADC Channel 14 + * @arg ADC_Channel_15: Select ADC Channel 15 + * @arg ADC_Channel_16: Select ADC Channel 16 which is connected to TempSensor + * @arg ADC_Channel_17: Select ADC Channel 17 which is connected to Vrefint + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T* adc, uint8_t channel) +{ + adc->CTRL1_B.AWDCHSEL = BIT_RESET; + adc->CTRL1 |= channel; +} + +/*! + * @brief Enable the specified ADC temperature sensor and Vrefint channel. + * + * @param adc: Select the ADC peripheral. + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableTempSensorVrefint(ADC_T* adc) +{ + adc->CTRL2_B.TSVREFEN = BIT_SET; +} + +/*! + * @brief Disable the specified ADC temperature sensor and Vrefint channel. + * + * @param adc: Select the ADC peripheral + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableTempSensorVrefint(ADC_T* adc) +{ + adc->CTRL2_B.TSVREFEN = BIT_RESET; +} + +/*! + * @brief Enable the specified ADC interrupt. + * + * @param adc: Select the ADC peripheral. + * + * @param interrupt: Select the ADC interrupt sources + * This parameter can be any combination of the following values: + * @arg ADC_INT_AWD : Enable Analog watchdog interrupt + * @arg ADC_INT_EOC : Enable End of conversion interrupt + * @arg ADC_INT_INJEOC : Enable End of injected conversion interrupt + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_EnableInterrupt(ADC_T* adc, uint16_t interrupt) +{ + uint8_t mask; + + mask = (uint8_t)interrupt; + adc->CTRL1 |= (uint8_t)mask; +} + +/*! + * @brief Disable the specified ADC interrupt. + * + * @param adc: Select the ADC peripheral. + * + * @param interrupt: Select the ADC interrupt sources + * This parameter can be any combination of the following values: + * @arg ADC_INT_AWD : Disable Analog watchdog interrupt + * @arg ADC_INT_EOC : Disable End of conversion interrupt + * @arg ADC_INT_INJEOC : Disable End of injected conversion interrupt + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_DisableInterrupt(ADC_T* adc, uint16_t interrupt) +{ + uint8_t mask; + + mask = (uint8_t)interrupt; + adc->CTRL1 &= (~(uint32_t)mask); +} + +/*! + * @brief Reads the specified ADC flag + * + * @param adc: Select the ADC peripheral + * + * @param flag: Select the flag to check + * This parameter can be one of the following values: + * @arg ADC_FLAG_AWD : Analog watchdog flag + * @arg ADC_FLAG_EOC : End of conversion flag + * @arg ADC_FLAG_INJEOC: End of injected group conversion flag + * @arg ADC_FLAG_INJCS : Injected group conversion Start flag + * @arg ADC_FLAG_REGCS : Regular group conversion Start flag + * + * @retval The status of ADC flag + * + * @note adc can be ADC1, ADC2. + */ +uint8_t ADC_ReadStatusFlag(ADC_T* adc, ADC_FLAG_T flag) +{ + return (adc->STS & flag) ? SET : RESET; +} + +/*! + * @brief Clears the specified ADC flag + * + * @param adc: Select the ADC peripheral + * + * @param flag: Select the flag to clear + * This parameter can be any combination of the following values: + * @arg ADC_FLAG_AWD : Analog watchdog flag + * @arg ADC_FLAG_EOC : End of conversion flag + * @arg ADC_FLAG_INJEOC: End of injected group conversion flag + * @arg ADC_FLAG_INJCS : Injected group conversion Start flag + * @arg ADC_FLAG_REGCS : Regular group conversion Start flag + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ClearStatusFlag(ADC_T* adc, uint8_t flag) +{ + adc->STS = ~(uint32_t)flag; +} + +/*! + * @brief Reads the specified ADC Interrupt flag. + * + * @param adc: Select the ADC peripheral. + * + * @param interrupt: Select the ADC interrupt source. + * This parameter can be one of the following values: + * @arg ADC_INT_AWD : Enable Analog watchdog interrupt + * @arg ADC_INT_EOC : Enable End of conversion interrupt + * @arg ADC_INT_INJEOC : Enable End of injected conversion interrupt + * + * @retval The status of ADC interrupt + * + * @note adc can be ADC1, ADC2. + */ +uint8_t ADC_ReadIntFlag(ADC_T* adc, ADC_INT_T flag) +{ + uint8_t bitStatus = RESET; + uint32_t itmask = 0; + uint32_t enableStatus = 0; + + itmask = flag >> 8; + enableStatus = (adc->CTRL1 & (uint8_t)flag); + + if (((adc->STS & itmask) != (uint32_t)RESET) && enableStatus) + { + bitStatus = SET; + } + else + { + bitStatus = RESET; + } + return bitStatus; +} + +/*! + * @brief Clears the specified ADC Interrupt pending bits. + * + * @param adc: Select the ADC peripheral. + * + * @param interrupt: Select the ADC interrupt source. + * This parameter can be any combination of the following values: + * @arg ADC_INT_AWD : Enable Analog watchdog interrupt + * @arg ADC_INT_EOC : Enable End of conversion interrupt + * @arg ADC_INT_INJEOC : Enable End of injected conversion interrupt + * + * @retval None + * + * @note adc can be ADC1, ADC2. + */ +void ADC_ClearIntFlag(ADC_T* adc, uint16_t flag) +{ + uint8_t mask = 0; + + mask = (uint8_t)(flag >> 8); + adc->STS = ~(uint32_t)mask; +} + +/**@} end of group ADC_Functions */ +/**@} end of group ADC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_bakpr.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_bakpr.c new file mode 100644 index 0000000000..23eb08fd4c --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_bakpr.c @@ -0,0 +1,252 @@ +/*! + * @file apm32s10x_bakpr.c + * + * @brief This file provides all the BAKPR firmware functions. + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_bakpr.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup BAKPR_Driver ADC Driver + @{ +*/ + +/** @defgroup BAKPR_Functions Functions + @{ +*/ + +/*! + * @brief Reset the BAKPR peripheral registers to their default reset values. + * + * @param None + * + * @retval None + */ +void BAKPR_Reset(void) +{ + RCM_EnableBackupReset(); + RCM_DisableBackupReset(); +} + +/*! + * @brief Deinitializes the BAKPR peripheral registers to their default reset values. + * + * @param value: specifies the RTC output source. + * This parameter can be one of the following values: + * @arg BAKPR_TAMPER_PIN_LEVEL_HIGH: Tamper pin active on high level + * @arg BAKPR_TAMPER_PIN_LEVEL_LOW: Tamper pin active on low level + * + * @retval None + */ +void BAKPR_ConfigTamperPinLevel(BAKPR_TAMPER_PIN_LEVEL_T value) +{ + BAKPR->CTRL_B.TPALCFG = value; +} + +/*! + * @brief Enable the Tamper Pin activation. + * + * @param None + * + * @retval None + */ +void BAKPR_EnableTamperPin(void) +{ + BAKPR->CTRL_B.TPFCFG = ENABLE ; +} + +/*! + * @brief Disable the Tamper Pin activation. + * + * @param None + * + * @retval None + */ +void BAKPR_DisableTamperPin(void) +{ + BAKPR->CTRL_B.TPFCFG = DISABLE ; +} + +/*! + * @brief Enable the Tamper Pin Interrupt. + * + * @param None + * + * @retval None + */ +void BAKPR_EnableInterrupt(void) +{ + BAKPR->CSTS_B.TPIEN = ENABLE ; +} + +/*! + * @brief Disable the Tamper Pin Interrupt. + * + * @param None + * + * @retval None + */ +void BAKPR_DisableInterrupt(void) +{ + BAKPR->CSTS_B.TPIEN = DISABLE ; +} + +/*! + * @brief Select the RTC output source to output on the Tamper pin. + * + * @param soure: specifies the RTC output source. + * This parameter can be one of the following values: + * @arg BAKPR_RTC_OUTPUT_SOURCE_NONE : no RTC output on the Tamper pin. + * @arg BAKPR_RTC_OUTPUT_SOURCE_CALIBRATION_CLOCK: output the RTC clock with frequency divided by 64 on the Tamper pin. + * @arg BAKPR_RTC_OUTPUT_SOURCE_ALARM : output the RTC Alarm pulse signal on the Tamper pin. + * @arg BAKPR_RTC_OUTPUT_SOURCE_SECOND : output the RTC Second pulse signal on the Tamper pin. + * + * @retval None + */ +void BAKPR_ConfigRTCOutput(BAKPR_RTC_OUTPUT_SOURCE_T soure) +{ + if (soure == BAKPR_RTC_OUTPUT_SOURCE_NONE) + { + BAKPR->CLKCAL = RESET; + } + else if (soure == BAKPR_RTC_OUTPUT_SOURCE_CALIBRATION_CLOCK) + { + BAKPR->CLKCAL_B.CALCOEN = BIT_SET; + } + else if (soure == BAKPR_RTC_OUTPUT_SOURCE_ALARM) + { + BAKPR->CLKCAL_B.ASPOEN = BIT_SET; + } + else if (soure == BAKPR_RTC_OUTPUT_SOURCE_SECOND) + { + BAKPR->CLKCAL_B.ASPOSEL = BIT_SET; + } +} + +/*! + * @brief Set RTC Clock Calibration value. + * + * @param calibrationValue: Specifies the calibration value. + * This parameter must be a number between 0 and 0x7F. + * + * @retval None + */ +void BAKPR_ConfigRTCCalibrationValue(uint8_t calibrationValue) +{ + BAKPR->CLKCAL_B.CALVALUE = calibrationValue; +} + +/*! + * @brief Set user data to the specified Data Backup Register. + * + * @param bakrData : specifies the Data Backup Register. + * This parameter can be BAKPR_DATAx where x is between 1 and 10. + * + * @param data : data to set + * This parameter can be a 16bit value. + * + * @retval None + */ +void BAKPR_ConfigBackupRegister(BAKPR_DATA_T bakrData, uint16_t data) +{ + __IOM uint32_t tmp = 0; + + tmp = (uint32_t)BAKPR_BASE; + tmp += bakrData; + + *(__IOM uint32_t*) tmp = data; +} + +/*! + * @brief Read user data from the specified Data Backup Register. + * + * @param bakrData : specifies the Data Backup Register. + * This parameter can be BAKPR_DATAx where x is between 1 and 10. + * + * @retval The content of the specified Data Backup Register + */ +uint16_t BAKPR_ReadBackupRegister(BAKPR_DATA_T bakrData) +{ + __IOM uint32_t tmp = 0; + + tmp = (uint32_t)BAKPR_BASE; + tmp += bakrData; + + return (*(__IOM uint32_t*) tmp); +} + +/*! + * @brief Read whether the Tamper Pin Event flag is set or not. + * + * @param None + * + * @retval Tamper Pin Event flag state + */ +uint8_t BAKPR_ReadStatusFlag(void) +{ + return BAKPR->CSTS_B.TEFLG; +} + +/*! + * @brief Clear Tamper Pin Event pending flag. + * + * @param None + * + * @retval None + */ +void BAKPR_ClearStatusFlag(void) +{ + BAKPR->CSTS_B.TECLR = BIT_SET; +} + +/*! + * @brief Get whether the Tamper Pin Interrupt has occurred or not. + * + * @param None + * + * @retval Tamper Pin Interrupt State + */ +uint8_t BAKPR_ReadIntFlag(void) +{ + return BAKPR->CSTS_B.TIFLG; +} + +/*! + * @brief Clear Tamper Pin Interrupt pending bit. + * + * @param None + * + * @retval None + */ +void BAKPR_ClearIntFlag(void) +{ + BAKPR->CSTS_B.TICLR = BIT_SET; +} + +/**@} end of group BAKPR_Functions */ +/**@} end of group BAKPR_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_can.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_can.c new file mode 100644 index 0000000000..130610b1e3 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_can.c @@ -0,0 +1,1075 @@ +/*! + * @file apm32s10x_can.c + * + * @brief This file provides all the CAN firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_can.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup CAN_Driver CAN Driver + @{ +*/ + +/** @defgroup CAN_Functions Functions + @{ +*/ + +/*! + * @brief Reset CAN registers + * + * @param can: Select the CAN peripheral. + * + * @retval None + */ +void CAN_Reset(CAN_T* can) +{ + if (can == CAN1) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_CAN1); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_CAN1); + } + else if (can == CAN2) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_CAN2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_CAN2); + } +} + +/*! + * @brief Initialization parameter configuration + * + * @param can: Select the CAN peripheral which can be CAN1 or CAN2. + * + * @param canConfig: Point to a CAN_Config_T structure. + * + * @retval ERROR or SUCCEESS + */ +uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) +{ + uint8_t initStatus = ERROR; + uint32_t wait_ack = 0x00000000; + + /* Exit from sleep mode */ + can->MCTRL_B.SLEEPREQ = BIT_RESET; + /* Request initialisation */ + can->MCTRL_B.INITREQ = BIT_SET; + + /* Wait the acknowledge */ + while (((can->MSTS_B.INITFLG) != BIT_SET) && (wait_ack != 0x0000FFFF)) + { + wait_ack++; + } + /* Check acknowledge */ + if (((can->MSTS_B.INITFLG) != BIT_SET)) + { + initStatus = ERROR; + } + else + { + if (canConfig->autoBusOffManage == ENABLE) + { + can->MCTRL_B.ALBOFFM = BIT_SET; + } + else + { + can->MCTRL_B.ALBOFFM = BIT_RESET; + } + + if (canConfig->autoWakeUpMode == ENABLE) + { + can->MCTRL_B.AWUPCFG = BIT_SET; + } + else + { + can->MCTRL_B.AWUPCFG = BIT_RESET; + } + + if (canConfig->nonAutoRetran == ENABLE) + { + can->MCTRL_B.ARTXMD = BIT_SET; + } + else + { + can->MCTRL_B.ARTXMD = BIT_RESET; + } + + if (canConfig->rxFIFOLockMode == ENABLE) + { + can->MCTRL_B.RXFLOCK = BIT_SET; + } + else + { + can->MCTRL_B.RXFLOCK = BIT_RESET; + } + + if (canConfig->txFIFOPriority == ENABLE) + { + can->MCTRL_B.TXFPCFG = BIT_SET; + } + else + { + can->MCTRL_B.TXFPCFG = BIT_RESET; + } + + /* Set the bit timing register */ + can->BITTIM &= (uint32_t)0x3fffffff; + can->BITTIM |= (uint32_t)canConfig->mode << 30; + can->BITTIM_B.RSYNJW = canConfig->syncJumpWidth; + can->BITTIM_B.TIMSEG1 = canConfig->timeSegment1; + can->BITTIM_B.TIMSEG2 = canConfig->timeSegment2; + can->BITTIM_B.BRPSC = canConfig->prescaler - 1; + + /* Request leave initialisation */ + can->MCTRL_B.INITREQ = BIT_RESET; + + wait_ack = 0; + /* Wait the acknowledge */ + while (((can->MSTS_B.INITFLG) != BIT_RESET) && (wait_ack != 0x0000FFFF)) + { + wait_ack++; + } + /* Check acknowledge */ + if (((can->MSTS_B.INITFLG) != BIT_RESET)) + { + initStatus = ERROR; + } + else + { + initStatus = SUCCESS; + } + } + return initStatus; +} + +/*! + * @brief Configure the CAN peripheral according to the specified parameters in the filterConfig. + * + * @param can: Select the CAN peripheral which can be CAN1 or CAN2. + * + * @param filterConfig :Point to a CAN_FilterConfig_T structure. + * + * @retval None + */ +void CAN_ConfigFilter(CAN_T* can, CAN_FilterConfig_T* filterConfig) +{ + can->FCTRL_B.FINITEN = BIT_SET; + + can->FACT &= ~(1 << filterConfig->filterNumber); + + /* Filter Scale */ + if (filterConfig->filterScale == CAN_FILTER_SCALE_16BIT) + { + /* 16-bit scale for the filter */ + can->FSCFG &= ~(1 << filterConfig->filterNumber); + + can->sFilterRegister[filterConfig->filterNumber].FBANK1 = + ((0x0000FFFF & filterConfig->filterMaskIdLow) << 16) | + (0x0000FFFF & filterConfig->filterIdLow); + + can->sFilterRegister[filterConfig->filterNumber].FBANK2 = + ((0x0000FFFF & filterConfig->filterMaskIdHigh) << 16) | + (0x0000FFFF & filterConfig->filterIdHigh); + } + + if (filterConfig->filterScale == CAN_FILTER_SCALE_32BIT) + { + can->FSCFG |= (1 << filterConfig->filterNumber); + + can->sFilterRegister[filterConfig->filterNumber].FBANK1 = + ((0x0000FFFF & filterConfig->filterIdHigh) << 16) | + (0x0000FFFF & filterConfig->filterIdLow); + + can->sFilterRegister[filterConfig->filterNumber].FBANK2 = + ((0x0000FFFF & filterConfig->filterMaskIdHigh) << 16) | + (0x0000FFFF & filterConfig->filterMaskIdLow); + } + + /* Filter Mode */ + if (filterConfig->filterMode == CAN_FILTER_MODE_IDMASK) + { + can->FMCFG &= ~(1 << filterConfig->filterNumber); + } + else + { + can->FMCFG |= (1 << filterConfig->filterNumber); + } + + /* Filter FIFO assignment */ + if (filterConfig->filterFIFO == CAN_FILTER_FIFO_0) + { + can->FFASS &= ~(1 << filterConfig->filterNumber); + } + if (filterConfig->filterFIFO == CAN_FILTER_FIFO_1) + { + can->FFASS |= (1 << filterConfig->filterNumber); + } + + /* Filter activation */ + if (filterConfig->filterActivation == ENABLE) + { + can->FACT |= (1 << filterConfig->filterNumber); + } + can->FCTRL_B.FINITEN = BIT_RESET; +} + +/*! + * @brief Initialize a CAN_Config_T structure with the initial value. + * + * @param canConfig :Point to a CAN_Config_T structure. + * + * @retval None + */ +void CAN_ConfigStructInit(CAN_Config_T* canConfig) +{ + canConfig->autoBusOffManage = DISABLE; + canConfig->autoWakeUpMode = DISABLE; + canConfig->nonAutoRetran = DISABLE; + canConfig->rxFIFOLockMode = DISABLE; + canConfig->txFIFOPriority = DISABLE; + canConfig->mode = CAN_MODE_NORMAL; + canConfig->syncJumpWidth = CAN_SJW_1; + canConfig->timeSegment1 = CAN_TIME_SEGMENT1_4; + canConfig->timeSegment2 = CAN_TIME_SEGMENT2_3; + canConfig->prescaler = 1; +} + +/*! + * @brief Enable the DBG Freeze for CAN. + * + * @param can: Select the CAN peripheral. + * + * @retval None + * + * @note + */ +void CAN_EnableDBGFreeze(CAN_T* can) +{ + can->MCTRL_B.DBGFRZE = ENABLE; +} + +/*! + * @brief Disable the DBG Freeze for CAN. + * + * @param can: Select the CAN peripheral. + * + * @retval None + */ +void CAN_DisableDBGFreeze(CAN_T* can) +{ + can->MCTRL_B.DBGFRZE = DISABLE; +} + +/*! + * @brief Select the start bank filter for slave CAN. + * + * @param bankNum: the start slave bank filter from 1..27. + * + * @retval None + */ +void CAN_SlaveStartBank(CAN_T* can, uint8_t bankNum) +{ + can->FCTRL_B.FINITEN = SET; + can->FCTRL_B.CAN2BN = bankNum; + can->FCTRL_B.FINITEN = RESET; +} + +/*! + * @brief Initiate the transmission of a message. + * + * @param can: Select the CAN peripheral. + * + * @param TxMessage: pointer to a CAN_TxMessage_T structure. + * + * @retval The number of the mailbox which is used for transmission or 3 if No mailbox is empty. + */ +uint8_t CAN_TxMessage(CAN_T* can, CAN_TxMessage_T* TxMessage) +{ + uint8_t transmit_milbox = 0; + + /* Select one empty transmit mailbox */ + if ((can->TXSTS & 0x04000000) == 0x04000000) + { + transmit_milbox = 0; + } + else if ((can->TXSTS & 0x08000000) == 0x08000000) + { + transmit_milbox = 1; + } + else if ((can->TXSTS & 0x10000000) == 0x10000000) + { + transmit_milbox = 2; + } + else + { + return 3; /*!< No mailbox is empty */ + } + + /* Set up the Id */ + can->sTxMailBox[transmit_milbox].TXMID &= 0x00000001; + if (TxMessage->typeID == CAN_TYPEID_STD) + { + can->sTxMailBox[transmit_milbox].TXMID |= (TxMessage->stdID << 21) | (TxMessage->remoteTxReq); + } + else + { + can->sTxMailBox[transmit_milbox].TXMID |= (TxMessage->extID << 3) | (TxMessage->typeID) | (TxMessage->remoteTxReq); + } + + /* Set up the TXDLEN */ + TxMessage->dataLengthCode &= 0x0F; + can->sTxMailBox[transmit_milbox].TXDLEN &= (uint32_t)0xFFFFFFF0; + can->sTxMailBox[transmit_milbox].TXDLEN |= TxMessage->dataLengthCode; + + /* Set up the data field */ + can->sTxMailBox[transmit_milbox].TXMDL = ((uint32_t)TxMessage->data[3] << 24) | ((uint32_t)TxMessage->data[2] << 16) + | ((uint32_t)TxMessage->data[1] << 8) | ((uint32_t)TxMessage->data[0]); + can->sTxMailBox[transmit_milbox].TXMDH = ((uint32_t)TxMessage->data[7] << 24) | ((uint32_t)TxMessage->data[6] << 16) + | ((uint32_t)TxMessage->data[5] << 8) | ((uint32_t)TxMessage->data[4]); + /* Request transmission */ + can->sTxMailBox[transmit_milbox].TXMID |= 0x00000001; + + return transmit_milbox; +} + +/*! + * @brief Check the transmission of a message. + * + * @param can: Select the CAN peripheral. + * + * @param transmitMailbox: the number of the mailbox + * + * @retval state: 0: Status of transmission is Failed + * 1: Status of transmission is Ok + * 2: transmit pending + */ +uint8_t CAN_TxMessageStatus(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) +{ + uint32_t state = 0; + + switch (TxMailbox) + { + case (CAN_TX_MAILBIX_0): + state = can->TXSTS & (0x00000001 | 0x00000002 | 0x04000000); + break; + case (CAN_TX_MAILBIX_1): + state = can->TXSTS & (0x00000100 | 0x00000200 | 0x08000000); + break; + case (CAN_TX_MAILBIX_2): + state = can->TXSTS & (0x00010000 | 0x00020000 | 0x10000000); + break; + default: + state = 0; + break; + } + switch (state) + { + /* Transmit pending */ + case (0x0): + state = 2; + break; + /* Transmit failed */ + case (0x00000001 | 0x04000000): + state = 0; + break; + case (0x00000100 | 0x08000000): + state = 0; + break; + case (0x00010000 | 0x10000000): + state = 0; + break; + /* Transmit succeeded */ + case (0x00000001 | 0x00000002 | 0x04000000): + state = 1; + break; + case (0x00000100 | 0x00000200 | 0x08000000): + state = 1; + break; + case (0x00010000 | 0x00020000 | 0x10000000): + state = 1; + break; + default: + state = 0; + break; + } + return (uint8_t) state; +} + +/*! + * @brief Cancel a transmit request. + * + * @param can: Select the CAN peripheral. + * + * @param mailBox: the number of the mailbox + * This parameter can be one of the following values: + * @arg CAN_TX_MAILBIX_0 : Tx mailbox 0 + * @arg CAN_TX_MAILBIX_1 : Tx mailbox 1 + * @arg CAN_TX_MAILBIX_2 : Tx mailbox 2 + * + * @retval None + */ +void CAN_CancelTxMailbox(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) +{ + switch (TxMailbox) + { + case CAN_TX_MAILBIX_0: + can->TXSTS_B.ABREQFLG0 = BIT_SET; + break; + case CAN_TX_MAILBIX_1: + can->TXSTS_B.ABREQFLG1 = BIT_SET; + break; + case CAN_TX_MAILBIX_2: + can->TXSTS_B.ABREQFLG2 = BIT_SET; + break; + default: + break; + } +} + +/*! + * @brief Receive a message and save to a CAN_RxMessage_T structure. + * + * @param can: Select the CAN peripheral. + * + * @param FIFONumber: Receive FIFO number. + * This parameter can be one of the following values: + * @arg CAN_RX_FIFO_0 : Receive FIFO 0 + * @arg CAN_RX_FIFO_1 : Receive FIFO 1 + * + * @param RxMessage: pointer to a structure to receive the message. + * + * @retval None + */ +void CAN_RxMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber, CAN_RxMessage_T* RxMessage) +{ + /* Get the Id */ + RxMessage->typeID = ((uint8_t)0x04 & (can->sRxMailBox[FIFONumber].RXMID)); + if (RxMessage->typeID == CAN_TYPEID_STD) + { + RxMessage->stdID = (can->sRxMailBox[FIFONumber].RXMID >> 21) & 0x000007FF; + } + else + { + RxMessage->extID = (can->sRxMailBox[FIFONumber].RXMID >> 3) & 0x1FFFFFFF; + } + + RxMessage->remoteTxReq = can->sRxMailBox[FIFONumber].RXMID_B.RFTXREQ; + RxMessage->dataLengthCode = can->sRxMailBox[FIFONumber].RXDLEN_B.DLCODE; + RxMessage->filterMatchIndex = can->sRxMailBox[FIFONumber].RXDLEN_B.FMIDX; + /* Get the data field */ + RxMessage->data[0] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE0; + RxMessage->data[1] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE1; + RxMessage->data[2] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE2; + RxMessage->data[3] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE3; + RxMessage->data[4] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE4; + RxMessage->data[5] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE5; + RxMessage->data[6] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE6; + RxMessage->data[7] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE7; + + if (FIFONumber == CAN_RX_FIFO_0) + { + can->RXF0_B.RFOM0 = BIT_SET; + } + else + { + can->RXF1_B.RFOM1 = BIT_SET; + } +} + +/*! + * @brief Release the specified FIFO. + * + * @param can: Select the CAN peripheral. + * + * @param FIFONumber: Receive FIFO number + * This parameter can be one of the following values: + * @arg CAN_RX_FIFO_0 : Receive FIFO 0 + * @arg CAN_RX_FIFO_1 : Receive FIFO 1 + * + * @retval None + */ +void CAN_ReleaseFIFO(CAN_T* can, CAN_RX_FIFO_T FIFONumber) +{ + if (FIFONumber == CAN_RX_FIFO_0) + { + can->RXF0_B.RFOM0 = BIT_SET; + } + else + { + can->RXF1_B.RFOM1 = BIT_SET; + } +} + +/*! + * @brief Return the number of pending messages. + * + * @param can: Select the CAN peripheral. + * + * @param FIFONumber: Receive FIFO number + * This parameter can be one of the following values: + * @arg CAN_RX_FIFO_0 : Receive FIFO 0 + * @arg CAN_RX_FIFO_1 : Receive FIFO 1 + * + * @retval The number of pending message. + */ +uint8_t CAN_PendingMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber) +{ + if (FIFONumber == CAN_RX_FIFO_0) + { + return can->RXF0 & 0x03; + } + else + { + return can->RXF1 & 0x03; + } +} + +/*! + * @brief Select the CAN Operation mode + * + * @param can: Select the CAN peripheral. + * + * @param operatingMode: CAN Operating Mode + * This parameter can be one of the following values: + * @arg CAN_OPERATING_MODE_INIT : Initialization mode + * @arg CAN_OPERATING_MODE_NORMAL: Normal mode + * @arg CAN_OPERATING_MODE_SLEEP : sleep mode + * + * @retval modeState:status of the requested mode + * 0:CAN failed entering the specific mode + * 1:CAN Succeed entering the specific mode + * + * @note + */ +uint8_t CAN_OperatingMode(CAN_T* can, CAN_OPERATING_MODE_T operatingMode) +{ + uint8_t states = 0; + uint32_t time_out = 0x0000FFFF; + + if (operatingMode == CAN_OPERATING_MODE_INIT) + { + can->MCTRL_B.SLEEPREQ = BIT_RESET; + can->MCTRL_B.INITREQ = BIT_SET; + + while ((can->MSTS_B.INITFLG != BIT_SET && can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + { + time_out --; + } + if ((can->MSTS_B.INITFLG == BIT_SET && can->MSTS_B.SLEEPFLG == BIT_RESET)) + { + states = 1; + } + } + else if (operatingMode == CAN_OPERATING_MODE_NORMAL) + { + can->MCTRL_B.SLEEPREQ = BIT_RESET; + can->MCTRL_B.INITREQ = BIT_RESET; + + time_out = 0x0000FFFF; + + while ((can->MSTS_B.INITFLG != BIT_RESET || can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + { + time_out --; + } + if ((can->MSTS_B.INITFLG == BIT_RESET || can->MSTS_B.SLEEPFLG == BIT_RESET)) + { + states = 1; + } + } + else if (operatingMode == CAN_OPERATING_MODE_SLEEP) + { + can->MCTRL_B.SLEEPREQ = BIT_SET; + can->MCTRL_B.INITREQ = BIT_RESET; + + time_out = 0x0000FFFF; + + while ((can->MSTS_B.INITFLG != BIT_RESET && can->MSTS_B.SLEEPFLG != BIT_SET) && (time_out != 0)) + { + time_out --; + } + if ((can->MSTS_B.INITFLG == BIT_RESET && can->MSTS_B.SLEEPFLG == BIT_SET)) + { + states = 1; + } + } + return states ; +} + +/*! + * @brief Into the low power mode. + * + * @param can: Select the CAN peripheral. + * + * @retval status: Status of entering sleep mode. + * 0: Enter sleep fail + * 1: Enter sleep success + * + * @note + */ +uint8_t CAN_SleepMode(CAN_T* can) +{ + can->MCTRL_B.SLEEPREQ = BIT_SET; + can->MCTRL_B.INITREQ = BIT_RESET; + + if ((can->MSTS_B.INITFLG == BIT_RESET && can->MSTS_B.SLEEPFLG == BIT_SET)) + { + return 1; + } + return 0; +} + +/*! + * @brief Wake the CAN up. + * + * @param can: Select the CAN peripheral. + * + * @retval status: Status of waking the CAN up + * 0: WakeUp CAN fail, + * 1: WakeUp CAN success + * + * @note + */ +uint8_t CAN_WakeUpMode(CAN_T* can) +{ + uint32_t time_out = 0x0000FFFF; + + can->MCTRL_B.SLEEPREQ = BIT_RESET; + while ((can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + { + time_out --; + } + if (can->MSTS_B.SLEEPFLG == BIT_RESET) + { + return 1; + } + return 0; +} + +/*! + * @brief Read the can's last error code (LERRC) + * + * @param can: Select the CAN peripheral. + * + * @retval The Last Error Code. + * + * @note + */ +uint8_t CAN_ReadLastErrorCode(CAN_T* can) +{ + return can->ERRSTS_B.LERRC; +} + +/*! + * @brief Read the can Receive Error Counter(RXERRCNT) + * + * @param can: Select the CAN peripheral. + * + * @retval CAN Receive Error Counter. + * + * @note + */ +uint8_t CAN_ReadRxErrorCounter(CAN_T* can) +{ + return can->ERRSTS_B.RXERRCNT; +} + +/*! + * @brief Read the LSB of the 9-bit can Transmit Error Counter(TXERRCNT). + * + * @param can: Select the CAN peripheral. + * + * @retval Least Significant Byte Of The 9-Bit Transmit Error Counter. + * + * @note + */ +uint8_t CAN_ReadLSBTxErrorCounter(CAN_T* can) +{ + return can->ERRSTS_B.TXERRCNT; +} + +/*! + * @brief Enable the specified can interrupts. + * + * @param can: Select the CAN peripheral. + * + * @param interrupts: specifies the CAN interrupt sources + * This parameter can be any combination of the following values: + * @arg CAN_INT_TXME : Transmit mailbox empty Interrupt + * @arg CAN_INT_F0MP : FIFO 0 message pending Interrupt + * @arg CAN_INT_F0FULL : FIFO 0 full Interrupt + * @arg CAN_INT_F0OVR : FIFO 0 overrun Interrupt + * @arg CAN_INT_F1MP : FIFO 1 message pending Interrupt + * @arg CAN_INT_F1FULL : FIFO 1 full Interrupt + * @arg CAN_INT_F1OVR : FIFO 1 overrun Interrupt + * @arg CAN_INT_ERRW : Error warning Interrupt + * @arg CAN_INT_ERRP : Error passive Interrupt + * @arg CAN_INT_BOF : Bus-off Interrupt + * @arg CAN_INT_LEC : Last error record code Interrupt + * @arg CAN_INT_ERR : Error Interrupt + * @arg CAN_INT_WUP : Wake-up Interrupt + * @arg CAN_INT_SLEEP : Sleep acknowledge Interrupt + * + * @retval None + * + * @note + */ +void CAN_EnableInterrupt(CAN_T* can, uint32_t interrupts) +{ + can->INTEN |= interrupts; +} + +/*! + * @brief Disable the specified can interrupts. + * + * @param can: Select the CAN peripheral. + * + * @param interrupts: specifies the CAN interrupt sources + * This parameter can be any combination of the following values: + * @arg CAN_INT_TXME : Transmit mailbox empty Interrupt + * @arg CAN_INT_F0MP : FIFO 0 message pending Interrupt + * @arg CAN_INT_F0FULL : FIFO 0 full Interrupt + * @arg CAN_INT_F0OVR : FIFO 0 overrun Interrupt + * @arg CAN_INT_F1MP : FIFO 1 message pending Interrupt + * @arg CAN_INT_F1FULL : FIFO 1 full Interrupt + * @arg CAN_INT_F1OVR : FIFO 1 overrun Interrupt + * @arg CAN_INT_ERRW : Error warning Interrupt + * @arg CAN_INT_ERRP : Error passive Interrupt + * @arg CAN_INT_BOF : Bus-off Interrupt + * @arg CAN_INT_LEC : Last error record code Interrupt + * @arg CAN_INT_ERR : Error Interrupt + * @arg CAN_INT_WUP : Wake-up Interrupt + * @arg CAN_INT_SLEEP : Sleep acknowledge Interrupt + * + * @retval None + * + * @note + */ +void CAN_DisableInterrupt(CAN_T* can, uint32_t interrupts) +{ + can->INTEN &= ~interrupts; +} + +/*! + * @brief Read whether the specified CAN flag is set or not. + * + * @param can: Select the CAN peripheral. + * + * @param flag: specifies the CAN flag. + * This parameter can be one of the following values: + * @arg CAN_FLAG_ERRW : Error Warning Flag + * @arg CAN_FLAG_ERRP : Error Passive Flag + * @arg CAN_FLAG_BOF : Bus-Off Flag + * @arg CAN_FLAG_LERRC : Last error record code Flag + * @arg CAN_FLAG_WUPI : Wake up Flag + * @arg CAN_FLAG_SLEEP : Sleep acknowledge Flag + * @arg CAN_FLAG_F0MP : FIFO 0 Message Pending Flag + * @arg CAN_FLAG_F0FULL : FIFO 0 Full Flag + * @arg CAN_FLAG_F0OVR : FIFO 0 Overrun Flag + * @arg CAN_FLAG_F1MP : FIFO 1 Message Pending Flag + * @arg CAN_FLAG_F1FULL : FIFO 1 Full Flag + * @arg CAN_FLAG_F1OVR : FIFO 1 Overrun Flag + * @arg CAN_FLAG_REQC0 : Request MailBox0 Flag + * @arg CAN_FLAG_REQC1 : Request MailBox1 Flag + * @arg CAN_FLAG_REQC2 : Request MailBox2 Flag + * + * @retval flag staus: RESET or SET + */ +uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag) +{ + uint8_t status = 0; + + if ((flag & 0x00F00000) != RESET) + { + if ((can->ERRSTS & (flag & 0x000FFFFF)) != RESET) + { + status = SET; + } + else + { + status = RESET; + } + } + else if ((flag & 0x01000000) != RESET) + { + if ((can->MSTS & (flag & 0x000FFFFF)) != RESET) + { + status = SET; + } + else + { + status = RESET ; + } + } + else if ((flag & 0x08000000) != RESET) + { + if ((can->TXSTS & (flag & 0x000FFFFF)) != RESET) + { + status = SET; + } + else + { + status = RESET; + } + } + else if ((flag & 0x02000000) != RESET) + { + if ((can->RXF0 & (flag & 0x000FFFFF)) != RESET) + { + status = SET; + } + else + { + status = RESET; + } + } + else + { + if ((can->RXF1 & (flag & 0x000FFFFF)) != RESET) + { + status = SET; + } + else + { + status = RESET; + } + } + return status; +} + +/*! + * @brief Clear the CAN's pending flags. + * + * @param can: Select the CAN peripheral. + * + * @param flag: specifies the CAN flag. + * This parameter can be one of the following values: + * @arg CAN_FLAG_LERRC : Last error record code Flag + * @arg CAN_FLAG_WUPI : Wake up Flag + * @arg CAN_FLAG_SLEEP : Sleep acknowledge Flag + * @arg CAN_FLAG_F0FULL: FIFO 0 Full Flag + * @arg CAN_FLAG_F0OVR : FIFO 0 Overrun Flag + * @arg CAN_FLAG_F1FULL: FIFO 1 Full Flag + * @arg CAN_FLAG_F1OVR : FIFO 1 Overrun Flag + * @arg CAN_FLAG_REQC0 : Request MailBox0 Flag + * @arg CAN_FLAG_REQC1 : Request MailBox1 Flag + * @arg CAN_FLAG_REQC2 : Request MailBox2 Flag + * + * @retval None + */ +void CAN_ClearStatusFlag(CAN_T* can, CAN_FLAG_T flag) +{ + uint32_t flagtmp = 0; + + /* ERRSTS register */ + if (flag == 0x30F00070) + { + can->ERRSTS = RESET; + } + else + { + flagtmp = flag & 0x000FFFFF; + if ((flag & 0x02000000) != RESET) + { + can->RXF0 = flagtmp; + } + else if ((flag & 0x04000000) != RESET) + { + can->RXF1 = flagtmp; + } + else if ((flag & 0x08000000) != RESET) + { + can->TXSTS = flagtmp; + } + else + { + can->MSTS = flagtmp; + } + } +} + +/*! + * @brief Read whether the specified can interrupt has occurred or not. + * + * @param can: Select the CAN peripheral. + * + * @param flag: specifies the CAN interrupt sources + * This parameter can be one of the following values: + * @arg CAN_INT_TXME : Transmit mailbox empty Interrupt + * @arg CAN_INT_F0MP : FIFO 0 message pending Interrupt + * @arg CAN_INT_F0FULL : FIFO 0 full Interrupt + * @arg CAN_INT_F0OVR : FIFO 0 overrun Interrupt + * @arg CAN_INT_F1MP : FIFO 1 message pending Interrupt + * @arg CAN_INT_F1FULL : FIFO 1 full Interrupt + * @arg CAN_INT_F1OVR : FIFO 1 overrun Interrupt + * @arg CAN_INT_ERRW : Error warning Interrupt + * @arg CAN_INT_ERRP : Error passive Interrupt + * @arg CAN_INT_BOF : Bus-off Interrupt + * @arg CAN_INT_LEC : Last error record code Interrupt + * @arg CAN_INT_ERR : Error Interrupt + * @arg CAN_INT_WUP : Wake-up Interrupt + * @arg CAN_INT_SLEEP : Sleep acknowledge Interrupt + * + * @retval status : SET or RESET + */ +uint8_t CAN_ReadIntFlag(CAN_T* can, CAN_INT_T flag) +{ + uint8_t status = 0; + + if ((can->INTEN & flag) != RESET) + { + switch (flag) + { + case CAN_INT_TXME: + status = can->TXSTS_B.REQCFLG0; + status |= can->TXSTS_B.REQCFLG1; + status |= can->TXSTS_B.REQCFLG2; + break; + case CAN_INT_F0MP: + status = can->RXF0_B.FMNUM0; + break; + case CAN_INT_F0FULL: + status = can->RXF0_B.FFULLFLG0; + break; + case CAN_INT_F0OVR: + status = can->RXF0_B.FOVRFLG0; + break; + case CAN_INT_F1MP: + status = can->RXF1_B.FMNUM1; + break; + case CAN_INT_F1FULL: + status = can->RXF1_B.FFULLFLG1; + break; + case CAN_INT_F1OVR: + status = can->RXF1_B.FOVRFLG1; + break; + case CAN_INT_WUP: + status = can->MSTS_B.WUPIFLG; + break; + case CAN_INT_SLEEP: + status = can->MSTS_B.SLEEPIFLG; + break; + case CAN_INT_ERRW: + status = can->ERRSTS_B.ERRWFLG; + break; + case CAN_INT_ERRP: + status = can->ERRSTS_B.ERRPFLG; + break; + case CAN_INT_BOF: + status = can->ERRSTS_B.BOFLG; + break; + case CAN_INT_LEC: + status = can->ERRSTS_B.LERRC; + break; + case CAN_INT_ERR: + status = can->MSTS_B.ERRIFLG; + break; + default: + status = RESET; + break; + } + } + else + { + status = RESET; + } + return status; +} + +/*! + * @brief Clear the can's interrupt flag. + * + * @param can: Select the CAN peripheral. + * + * @param flag: Interrupt pending bit to clear + * This parameter can be one of the following values: + * @arg CAN_INT_TXME : Transmit mailbox empty Interrupt + * @arg CAN_INT_F0FULL : FIFO 0 full Interrupt + * @arg CAN_INT_F0OVR : FIFO 0 overrun Interrupt + * @arg CAN_INT_F1FULL : FIFO 1 full Interrupt + * @arg CAN_INT_F1OVR : FIFO 1 overrun Interrupt + * @arg CAN_INT_ERRW : Error warning Interrupt + * @arg CAN_INT_ERRP : Error passive Interrupt + * @arg CAN_INT_BOF : Bus-off Interrupt + * @arg CAN_INT_LEC : Last error record code Interrupt + * @arg CAN_INT_ERR : Error Interrupt + * @arg CAN_INT_WUP : Wake-up Interrupt + * @arg CAN_INT_SLEEP : Sleep acknowledge Interrupt + * + * @retval None + */ +void CAN_ClearIntFlag(CAN_T* can, CAN_INT_T flag) +{ + switch (flag) + { + case CAN_INT_TXME: + can->TXSTS_B.REQCFLG0 = BIT_SET; + can->TXSTS_B.REQCFLG1 = BIT_SET; + can->TXSTS_B.REQCFLG2 = BIT_SET; + break; + case CAN_INT_F0FULL: + can->RXF0_B.FFULLFLG0 = BIT_SET; + break; + case CAN_INT_F0OVR: + can->RXF0_B.FOVRFLG0 = BIT_SET; + break; + case CAN_INT_F1FULL: + can->RXF1_B.FFULLFLG1 = BIT_SET; + break; + case CAN_INT_F1OVR: + can->RXF1_B.FOVRFLG1 = BIT_SET; + break; + case CAN_INT_WUP: + can->MSTS_B.WUPIFLG = BIT_SET; + break; + case CAN_INT_SLEEP: + can->MSTS_B.SLEEPIFLG = BIT_SET; + break; + case CAN_INT_ERRW: + can->MSTS_B.ERRIFLG = BIT_SET; + break; + case CAN_INT_ERRP: + can->MSTS_B.ERRIFLG = BIT_SET; + break; + case CAN_INT_BOF: + can->MSTS_B.ERRIFLG = BIT_SET; + break; + case CAN_INT_LEC: + can->ERRSTS_B.LERRC = BIT_RESET; + can->MSTS_B.ERRIFLG = BIT_SET; + break; + case CAN_INT_ERR: + can->ERRSTS_B.LERRC = BIT_RESET; + can->MSTS_B.ERRIFLG = BIT_SET; + break; + default: + break; + } +} + +/**@} end of group CAN_Functions */ +/**@} end of group CAN_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_crc.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_crc.c new file mode 100644 index 0000000000..a1c52dd252 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_crc.c @@ -0,0 +1,125 @@ +/*! + * @file apm32s10x_crc.c + * + * @brief This file provides all the CRC firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_crc.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup CRC_Driver CRC Driver + @{ +*/ + +/** @defgroup CRC_Functions Functions + @{ +*/ + +/*! + * @brief Reset CRC data register. + * + * @param None + * + * @retval None + */ +void CRC_ResetDATA(void) +{ + CRC->CTRL_B.RST = BIT_SET; +} + +/*! + * @brief Calculate CRC of a 32bit data word. + * + * @param data: a data word to compute its CRC. + * This parameter can be a 32bit value: + * + * @retval A 32-bit CRC value + */ +uint32_t CRC_CalculateCRC(uint32_t data) +{ + CRC->DATA = data; + + return CRC->DATA; +} + +/*! + * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). + * + * @param buf: Pointer to the buffer containing the data to be computed. + * + * @param bufLen: The length of buffer which is computed. + * + * @retval A 32-bit CRC value + */ +uint32_t CRC_CalculateBlockCRC(uint32_t* buf, uint32_t bufLen) +{ + while (bufLen--) + { + CRC->DATA = *buf++; + } + + return CRC->DATA; +} + +/*! + * @brief Returns the current CRC value. + * + * @param None + * + * @retval A 32-bit CRC value + */ +uint32_t CRC_ReadCRC(void) +{ + return CRC->DATA; +} + +/*! + * @brief Saves a 8bit data in the Independent Data register(INDATA). + * + * @param inData: a 8-bit value to be stored in the ID register + * + * @retval None + */ +void CRC_WriteIDRegister(uint8_t inData) +{ + CRC->INDATA = inData; +} + +/*! + * @brief Reads a 8-bit data saved in the Independent Data register(INDATA). + * + * @param None + * + * @retval a 8-bit value from the INDATA register + */ +uint8_t CRC_ReadIDRegister(void) +{ + return CRC->INDATA; +} + +/**@} end of group CRC_Functions */ +/**@} end of group CRC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_dbgmcu.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_dbgmcu.c new file mode 100644 index 0000000000..587b360ea0 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_dbgmcu.c @@ -0,0 +1,131 @@ +/*! + * @file apm32s10x_dbgmcu.c + * + * @brief This file provides all the DEBUG firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_dbgmcu.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DBGMCU_Driver DBGMCU Driver + @{ +*/ + +/** @defgroup DBGMCU_Functions Functions + @{ +*/ + +/*! + * @brief Returns the device identifier. + * + * @param None + * + * @retval Device identifier + */ +uint32_t DBGMCU_ReadDEVID(void) +{ + return DBGMCU->IDCODE_B.EQR; +} + +/*! + * @brief Returns the device revision identifier. + * + * @param None + * + * @retval Device revision identifier + */ +uint32_t DBGMCU_ReadREVID(void) +{ + return DBGMCU->IDCODE_B.WVR; +} + +/*! + * @brief Enable the specified peripheral and low power mode behavior + * when the MCU under Debug mode + * + * @param periph: Specifies the peripheral and low power mode + * This parameter can be any combination of the following values: + * @arg DBGMCU_SLEEP : Keep debugger connection during SLEEP mode + * @arg DBGMCU_STOP : Keep debugger connection during STOP mode + * @arg DBGMCU_STANDBY : Keep debugger connection during STANDBY mode + * @arg DBGMCU_IOEN : Trace Debug Pin Enable + * @arg DBGMCU_IOMODE0 : Trace Debug Pin Mode Configure Asynchronization + * @arg DBGMCU_IOMODE1 : Trace Debug Pin Mode Configure Synchronizer data size one + * @arg DBGMCU_IOMODE2 : Trace Debug Pin Mode Configure Synchronizer data size two + * @arg DBGMCU_IOMODE3 : Trace Debug Pin Mode Configure Synchronizer data size four + * @arg DBGMCU_IWDT_STOP : Debug IWDT stopped when Core is halted + * @arg DBGMCU_WWDT_STOP : Debug WWDT stopped when Core is halted + * @arg DBGMCU_TMR1_STOP : TMR1 counter stopped when Core is halted + * @arg DBGMCU_TMR2_STOP : TMR2 counter stopped when Core is halted + * @arg DBGMCU_TMR3_STOP : TMR3 counter stopped when Core is halted + * @arg DBGMCU_TMR4_STOP : TMR4 counter stopped when Core is halted + * @arg DBGMCU_CAN1_STOP : Debug CAN1 stopped when Core is halted + * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_CAN2_STOP : Debug CAN2 stopped when Core is halted + * + * @retval None + */ +void DBGMCU_Enable(uint32_t periph) +{ + DBGMCU->CFG |= periph; +} + +/*! + * @brief Enable the specified peripheral and low power mode behavior + * when the MCU under Debug mode + * + * @param periph: Specifies the peripheral and low power mode + * This parameter can be any combination of the following values: + * @arg DBGMCU_SLEEP : Keep debugger connection during SLEEP mode + * @arg DBGMCU_STOP : Keep debugger connection during STOP mode + * @arg DBGMCU_STANDBY : Keep debugger connection during STANDBY mode + * @arg DBGMCU_IOEN : Trace Debug Pin Enable + * @arg DBGMCU_IOMODE0 : Trace Debug Pin Mode Configure Asynchronization + * @arg DBGMCU_IOMODE1 : Trace Debug Pin Mode Configure Synchronizer data size one + * @arg DBGMCU_IOMODE2 : Trace Debug Pin Mode Configure Synchronizer data size two + * @arg DBGMCU_IOMODE3 : Trace Debug Pin Mode Configure Synchronizer data size four + * @arg DBGMCU_IWDT_STOP : Debug IWDT stopped when Core is halted + * @arg DBGMCU_WWDT_STOP : Debug WWDT stopped when Core is halted + * @arg DBGMCU_TMR1_STOP : TMR1 counter stopped when Core is halted + * @arg DBGMCU_TMR2_STOP : TMR2 counter stopped when Core is halted + * @arg DBGMCU_TMR3_STOP : TMR3 counter stopped when Core is halted + * @arg DBGMCU_TMR4_STOP : TMR4 counter stopped when Core is halted + * @arg DBGMCU_CAN1_STOP : Debug CAN1 stopped when Core is halted + * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted + * @arg DBGMCU_CAN2_STOP : Debug CAN2 stopped when Core is halted + * + * @retval None + */ +void DBGMCU_Disable(uint32_t periph) +{ + DBGMCU->CFG &= ~periph; +} + +/**@} end of group DBGMCU_Functions */ +/**@} end of group DBGMCU_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_dma.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_dma.c new file mode 100644 index 0000000000..461aad641b --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_dma.c @@ -0,0 +1,399 @@ +/*! + * @file apm32s10x_dma.c + * + * @brief This file provides all the DMA firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_dma.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup DMA_Driver DMA Driver + @{ +*/ + +/** @defgroup DMA_Functions Functions + @{ +*/ + +/*! + * @brief Reset specified DMA Channel registers to their default reset + * + * @param channel:DMA1_channelx(x can be from 1 to 7). + * + * @retval None + */ +void DMA_Reset(DMA_Channel_T* channel) +{ + channel->CHCFG_B.CHEN = BIT_RESET; + channel->CHCFG = 0; + channel->CHNDATA = 0; + channel->CHMADDR = 0; + channel->CHPADDR = 0; + + if (channel == DMA1_Channel1) + { + DMA1->INTFCLR |= 0xFFFFFFF0; + } + else if (channel == DMA1_Channel2) + { + DMA1->INTFCLR |= 0xFFFFFF0F; + } + else if (channel == DMA1_Channel3) + { + DMA1->INTFCLR |= 0xFFFFF0FF; + } + else if (channel == DMA1_Channel4) + { + DMA1->INTFCLR |= 0xFFFF0FFF; + } + else if (channel == DMA1_Channel5) + { + DMA1->INTFCLR |= 0xFFF0FFFF; + } + else if (channel == DMA1_Channel6) + { + DMA1->INTFCLR |= 0xFF0FFFFF; + } + else if (channel == DMA1_Channel7) + { + DMA1->INTFCLR |= 0xF0FFFFFF; + } +} + +/*! + * @brief Configs specified DMA Channel through a structure. + * + * @param channel:DMA1_channelx(x can be from 1 to 7) + * + * @param dmaConfig: Point to a DMA_Config_T structure + * + * @retval None + */ +void DMA_Config(DMA_Channel_T* channel, DMA_Config_T* dmaConfig) +{ + channel->CHCFG_B.DIRCFG = dmaConfig->dir; + channel->CHCFG_B.CIRMODE = dmaConfig->loopMode; + channel->CHCFG_B.PERIMODE = dmaConfig->peripheralInc; + channel->CHCFG_B.MIMODE = dmaConfig->memoryInc; + channel->CHCFG_B.PERSIZE = dmaConfig->peripheralDataSize; + channel->CHCFG_B.MEMSIZE = dmaConfig->memoryDataSize; + channel->CHCFG_B.CHPL = dmaConfig->priority; + channel->CHCFG_B.M2MMODE = dmaConfig->M2M; + + channel->CHNDATA = dmaConfig->bufferSize; + channel->CHPADDR = dmaConfig->peripheralBaseAddr; + channel->CHMADDR = dmaConfig->memoryBaseAddr; +} + +/*! + * @brief Populate the structure with default values. + * + * @param dmaConfig: Point to a DMA_Config_T structure. + * + * @retval None + */ +void DMA_ConfigStructInit(DMA_Config_T* dmaConfig) +{ + dmaConfig->peripheralBaseAddr = 0; + dmaConfig->memoryBaseAddr = 0; + dmaConfig->dir = DMA_DIR_PERIPHERAL_SRC; + dmaConfig->bufferSize = 0; + dmaConfig->peripheralInc = DMA_PERIPHERAL_INC_DISABLE; + dmaConfig->memoryInc = DMA_MEMORY_INC_DISABLE; + dmaConfig->peripheralDataSize = DMA_PERIPHERAL_DATA_SIZE_BYTE; + dmaConfig->memoryDataSize = DMA_MEMORY_DATA_SIZE_BYTE; + dmaConfig->loopMode = DMA_MODE_NORMAL; + dmaConfig->priority = DMA_PRIORITY_LOW; + dmaConfig->M2M = DMA_M2MEN_DISABLE; +} + +/*! + * @brief Enable the specified DMA Channel + * + * @param channel:DMA1_channelx(x can be from 1 to 7) + * + * @retval None + */ +void DMA_Enable(DMA_Channel_T* channel) +{ + channel->CHCFG_B.CHEN = ENABLE; +} + +/*! + * @brief Disable the specified DMA Channel + * + * @param channel:DMA1_channelx(x can be from 1 to 7) + * + * @retval None + */ +void DMA_Disable(DMA_Channel_T* channel) +{ + channel->CHCFG_B.CHEN = DISABLE; +} + +/*! + * @brief Configs the number of data units in the channel. + * + * @param channel:DMA1_channelx(x can be from 1 to 7) + * + * @param dataNumber:The number of data units in the current DMA Channel transfer. + * + * @retval None + */ +void DMA_ConfigDataNumber(DMA_Channel_T* channel, uint16_t dataNumber) +{ + channel->CHNDATA = dataNumber; +} + +/*! + * @brief Read the number of data units in the channel + * + * @param channel:DMA1_channelx(x can be from 1 to 7) + * + * @retval The number of CHNDATA value + */ +uint16_t DMA_ReadDataNumber(DMA_Channel_T* channel) +{ + return channel->CHNDATA; +} + +/*! + * @brief Enables the specified DMA Channel interrupts. + * + * @param channel:DMA1_channelx(x can be from 1 to 7) + * + * @param interrupt: DMA interrupts sources to selsct + * This parameter can be any combination of the following values: + * @arg DMA_INT_TC : All Transfer Complete Interrupt + * @arg DMA_INT_HT : Half Transfer Complete Interrupt + * @arg DMA_INT_TERR : Transfer Error Occur Interrupt + * + * @retval None + */ +void DMA_EnableInterrupt(DMA_Channel_T* channel, uint32_t interrupt) +{ + channel->CHCFG |= interrupt; +} + +/*! + * @brief Disable the specified DMA Channel interrupts. + * + * @param channel:DMA1_channelx(x can be from 1 to 7) + * + * @param interrupt: DMA interrupts sources to selsct + * This parameter can be any combination of the following values: + * @arg DMA_INT_TC : All Transfer Complete Interrupt + * @arg DMA_INT_HT : Half Transfer Complete Interrupt + * @arg DMA_INT_TERR : Transfer Error Occur Interrupt + * + * @retval None + */ +void DMA_DisableInterrupt(DMA_Channel_T* channel, uint32_t interrupt) +{ + channel->CHCFG &= ~interrupt; +} + +/*! + * @brief Read whether the specifie DMA Channel flag is set or not. + * + * @param flag: the flag to check. + * This parameter can be one of the following values: + * @arg DMA1_FLAG_GINT1: DMA1 Channel 1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel 1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel 1 half transfer flag. + * @arg DMA1_FLAG_TERR1: DMA1 Channel 1 transfer error flag. + * @arg DMA1_FLAG_GINT2: DMA1 Channel 2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel 2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel 2 half transfer flag. + * @arg DMA1_FLAG_TERR2: DMA1 Channel 2 transfer error flag. + * @arg DMA1_FLAG_GINT3: DMA1 Channel 3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel 3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel 3 half transfer flag. + * @arg DMA1_FLAG_TERR3: DMA1 Channel 3 transfer error flag. + * @arg DMA1_FLAG_GINT4: DMA1 Channel 4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel 4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel 4 half transfer flag. + * @arg DMA1_FLAG_TERR4: DMA1 Channel 4 transfer error flag. + * @arg DMA1_FLAG_GINT5: DMA1 Channel 5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel 5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel 5 half transfer flag. + * @arg DMA1_FLAG_TERR5: DMA1 Channel 5 transfer error flag. + * @arg DMA1_FLAG_GINT6: DMA1 Channel 6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel 6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel 6 half transfer flag. + * @arg DMA1_FLAG_TERR6: DMA1 Channel 6 transfer error flag. + * @arg DMA1_FLAG_GINT7: DMA1 Channel 7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel 7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel 7 half transfer flag. + * @arg DMA1_FLAG_TERR7: DMA1 Channel 7 transfer error flag. + * + * @retval Flag State + */ +uint8_t DMA_ReadStatusFlag(DMA_FLAG_T flag) +{ + if ((DMA1->INTSTS & flag) != RESET) + { + return SET ; + } + else + { + return RESET ; + } +} + +/*! + * @brief Clears the specifie DMA Channel's flags. + * + * @param flag:the flag to Clear. + * This parameter can be any combination of the following values: + * @arg DMA1_FLAG_GINT1: DMA1 Channel 1 global flag. + * @arg DMA1_FLAG_TC1: DMA1 Channel 1 transfer complete flag. + * @arg DMA1_FLAG_HT1: DMA1 Channel 1 half transfer flag. + * @arg DMA1_FLAG_TERR1: DMA1 Channel 1 transfer error flag. + * @arg DMA1_FLAG_GINT2: DMA1 Channel 2 global flag. + * @arg DMA1_FLAG_TC2: DMA1 Channel 2 transfer complete flag. + * @arg DMA1_FLAG_HT2: DMA1 Channel 2 half transfer flag. + * @arg DMA1_FLAG_TERR2: DMA1 Channel 2 transfer error flag. + * @arg DMA1_FLAG_GINT3: DMA1 Channel 3 global flag. + * @arg DMA1_FLAG_TC3: DMA1 Channel 3 transfer complete flag. + * @arg DMA1_FLAG_HT3: DMA1 Channel 3 half transfer flag. + * @arg DMA1_FLAG_TERR3: DMA1 Channel 3 transfer error flag. + * @arg DMA1_FLAG_GINT4: DMA1 Channel 4 global flag. + * @arg DMA1_FLAG_TC4: DMA1 Channel 4 transfer complete flag. + * @arg DMA1_FLAG_HT4: DMA1 Channel 4 half transfer flag. + * @arg DMA1_FLAG_TERR4: DMA1 Channel 4 transfer error flag. + * @arg DMA1_FLAG_GINT5: DMA1 Channel 5 global flag. + * @arg DMA1_FLAG_TC5: DMA1 Channel 5 transfer complete flag. + * @arg DMA1_FLAG_HT5: DMA1 Channel 5 half transfer flag. + * @arg DMA1_FLAG_TERR5: DMA1 Channel 5 transfer error flag. + * @arg DMA1_FLAG_GINT6: DMA1 Channel 6 global flag. + * @arg DMA1_FLAG_TC6: DMA1 Channel 6 transfer complete flag. + * @arg DMA1_FLAG_HT6: DMA1 Channel 6 half transfer flag. + * @arg DMA1_FLAG_TERR6: DMA1 Channel 6 transfer error flag. + * @arg DMA1_FLAG_GINT7: DMA1 Channel 7 global flag. + * @arg DMA1_FLAG_TC7: DMA1 Channel 7 transfer complete flag. + * @arg DMA1_FLAG_HT7: DMA1 Channel 7 half transfer flag. + * @arg DMA1_FLAG_TERR7: DMA1 Channel 7 transfer error flag. + * + * @retval None + */ +void DMA_ClearStatusFlag(uint32_t flag) +{ + DMA1->INTFCLR = flag; +} + +/*! + * @brief Read whether the specified DMA Channel interrupts is set or not. + * + * @param interrupt: interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA1_INT_FLAG_GINT1 : DMA1 Channel 1 global interrupt. + * @arg DMA1_INT_FLAG_TC1 : DMA1 Channel 1 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT1 : DMA1 Channel 1 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR1 : DMA1 Channel 1 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT2 : DMA1 Channel 2 global interrupt. + * @arg DMA1_INT_FLAG_TC2 : DMA1 Channel 2 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT2 : DMA1 Channel 2 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR2 : DMA1 Channel 2 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT3 : DMA1 Channel 3 global interrupt. + * @arg DMA1_INT_FLAG_TC3 : DMA1 Channel 3 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT3 : DMA1 Channel 3 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR3 : DMA1 Channel 3 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT4 : DMA1 Channel 4 global interrupt. + * @arg DMA1_INT_FLAG_TC4 : DMA1 Channel 4 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT4 : DMA1 Channel 4 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR4 : DMA1 Channel 4 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT5 : DMA1 Channel 5 global interrupt. + * @arg DMA1_INT_FLAG_TC5 DMA1 Channel 5 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT5 DMA1 Channel 5 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR5 : DMA1 Channel 5 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT6 : DMA1 Channel 6 global interrupt. + * @arg DMA1_INT_FLAG_TC6 : DMA1 Channel 6 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT6 : DMA1 Channel 6 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR6 : DMA1 Channel 6 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT7 : DMA1 Channel 7 global interrupt. + * @arg DMA1_INT_FLAG_TC7 : DMA1 Channel 7 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT7 : DMA1 Channel 7 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR7 : DMA1 Channel 7 transfer error interrupt. + * + * @retval interrupt State + */ +uint8_t DMA_ReadIntFlag(DMA_INT_FLAG_T flag) +{ + if ((DMA1->INTSTS & flag) != RESET) + { + return SET ; + } + else + { + return RESET ; + } +} + +/*! + * @brief Clears the specified DMA Channel's interrupts. + * + * @param flag: the interrupt flag to Clear. + * This parameter can be any combination of the following values: + * @arg DMA1_INT_FLAG_GINT1 : DMA1 Channel 1 global interrupt. + * @arg DMA1_INT_FLAG_TC1 : DMA1 Channel 1 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT1 : DMA1 Channel 1 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR1 : DMA1 Channel 1 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT2 : DMA1 Channel 2 global interrupt. + * @arg DMA1_INT_FLAG_TC2 : DMA1 Channel 2 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT2 : DMA1 Channel 2 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR2 : DMA1 Channel 2 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT3 : DMA1 Channel 3 global interrupt. + * @arg DMA1_INT_FLAG_TC3 : DMA1 Channel 3 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT3 : DMA1 Channel 3 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR3 : DMA1 Channel 3 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT4 : DMA1 Channel 4 global interrupt. + * @arg DMA1_INT_FLAG_TC4 : DMA1 Channel 4 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT4 : DMA1 Channel 4 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR4 : DMA1 Channel 4 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT5 : DMA1 Channel 5 global interrupt. + * @arg DMA1_INT_FLAG_TC5 DMA1 Channel 5 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT5 DMA1 Channel 5 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR5 : DMA1 Channel 5 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT6 : DMA1 Channel 6 global interrupt. + * @arg DMA1_INT_FLAG_TC6 : DMA1 Channel 6 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT6 : DMA1 Channel 6 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR6 : DMA1 Channel 6 transfer error interrupt. + * @arg DMA1_INT_FLAG_GINT7 : DMA1 Channel 7 global interrupt. + * @arg DMA1_INT_FLAG_TC7 : DMA1 Channel 7 transfer complete interrupt. + * @arg DMA1_INT_FLAG_HT7 : DMA1 Channel 7 half transfer interrupt. + * @arg DMA1_INT_FLAG_TERR7 : DMA1 Channel 7 transfer error interrupt. + * + * @retval None + */ +void DMA_ClearIntFlag(uint32_t flag) +{ + DMA1->INTFCLR = flag; +} + +/**@} end of group DMA_Functions */ +/**@} end of group DMA_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_eint.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_eint.c new file mode 100644 index 0000000000..f6d45c43b1 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_eint.c @@ -0,0 +1,206 @@ +/*! + * @file apm32s10x_eint.c + * + * @brief This file provides all the EINT firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_eint.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup EINT_Driver EINT Driver + @{ +*/ + +/** @defgroup EINT_Functions Functions + @{ +*/ + +/*! + * @brief Reset the EINT peripheral registers to their default reset values. + * + * @param None + * + * @retval None + */ +void EINT_Reset(void) +{ + EINT->IMASK = 0x00000000; + EINT->EMASK = 0x00000000; + EINT->RTEN = 0x00000000; + EINT->FTEN = 0x00000000; + EINT->IPEND = 0x000FFFFF; +} + +/*! + * @brief Configure the EINT + * + * @param eintConfig: pointer to a EINT_Config_T structure. + * + * @retval None + */ +void EINT_Config(EINT_Config_T* eintConfig) +{ + uint32_t temp = 0; + temp = (uint32_t)EINT_BASE; + + if (eintConfig->lineCmd != DISABLE) + { + EINT->IMASK &= ~eintConfig->line; + EINT->EMASK &= ~eintConfig->line; + + temp += eintConfig->mode; + *(__IOM uint32_t*) temp |= eintConfig->line; + + EINT->RTEN &= ~eintConfig->line; + EINT->FTEN &= ~eintConfig->line; + + if (eintConfig->trigger == EINT_TRIGGER_RISING_FALLING) + { + EINT->RTEN |= eintConfig->line; + EINT->FTEN |= eintConfig->line; + } + else + { + temp = (uint32_t)EINT_BASE; + temp += eintConfig->trigger; + + *(__IOM uint32_t*) temp |= eintConfig->line; + } + } + else + { + temp += eintConfig->mode; + + *(__IOM uint32_t*) temp &= ~eintConfig->line; + } +} + +/*! + * @brief Fill each EINT_Config_T member with its reset value. + * + * @param eintConfig: pointer to a EINT_Config_T structure + * + * @retval None + */ +void EINT_ConfigStructInit(EINT_Config_T* eintConfig) +{ + eintConfig->line = EINT_LINENONE; + eintConfig->mode = EINT_MODE_INTERRUPT; + eintConfig->trigger = EINT_TRIGGER_FALLING; + eintConfig->lineCmd = DISABLE; +} + +/*! + * @brief Select Software interrupt on EINT line + * + * @param line: specifies the EINT lines. + * This parameter can be any combination of EINT_LINE_T(can be from 0 to 18) + * + * @retval None + */ +void EINT_SelectSWInterrupt(uint32_t line) +{ + EINT->SWINTE |= line; +} + +/*! + * @brief Read the specified EINT line flag + * + * @param line: Select the EINT lines. + * This parameter can be one of EINT_LINE_T(can be from 0 to 18) + * + * @retval status: The new state of flag (SET or RESET) + */ +uint8_t EINT_ReadStatusFlag(EINT_LINE_T line) +{ + uint8_t status = RESET; + + if ((EINT->IPEND & line) != (uint32_t)RESET) + { + status = SET; + } + else + { + status = RESET; + } + return status; +} + +/*! + * @brief Clears the EINT line pending bits + * + * @param line: Select the EINT lines. + * This parameter can be any combination of EINT_LINE_T(can be from 0 to 18) + * + * @retval None + */ +void EINT_ClearStatusFlag(uint32_t line) +{ + EINT->IPEND = line; +} + +/*! + * @brief Read the specified EINT line Interrupt Flag. + * + * @param line: Select the EINT lines. + * This parameter can be one of EINT_LINE_T(can be from 0 to 18) + * + * @retval None + */ +uint8_t EINT_ReadIntFlag(EINT_LINE_T line) +{ + uint8_t status = RESET; + uint32_t enablestatus = 0; + + enablestatus = EINT->IMASK & line; + + if ((EINT->IPEND & line) != ((uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + { + status = SET; + } + else + { + status = RESET; + } + return status; +} + +/*! + * @brief Clears the EINT line pending bits + * + * @param line: Select the EINT lines + * This parameter can be any combination of EINT_LINE_T(can be from 0 to 18) + * + * @retval None + */ +void EINT_ClearIntFlag(uint32_t line) +{ + EINT->IPEND = line; +} + +/**@} end of group EINT_Functions */ +/**@} end of group EINT_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_fmc.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_fmc.c new file mode 100644 index 0000000000..95d7754818 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_fmc.c @@ -0,0 +1,763 @@ +/*! + * @file apm32s10x_fmc.c + * + * @brief This file provides all the FMC firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_fmc.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup FMC_Driver FMC Driver + @{ +*/ + +/** @defgroup FMC_Functions Functions + @{ +*/ + +/*! + * @brief Configure the code latency value. + * + * @param latency: the FMC Latency value. + * + * @retval None + */ +void FMC_ConfigLatency(FMC_LATENCY_T latency) +{ + FMC->CTRL1_B.WS = latency; +} + +/*! + * @brief Enable the Half cycle flash access. + * + * @param None + * + * @retval None + */ +void FMC_EnableHalfCycleAccess(void) +{ + FMC->CTRL1_B.HCAEN = BIT_SET; +} + +/*! + * @brief Disable the Half cycle flash access. + * + * @param None + * + * @retval None + */ +void FMC_DisableHalfCycleAccess(void) +{ + FMC->CTRL1_B.HCAEN = BIT_RESET; +} + +/*! + * @brief Enable the Prefetch Buffer. + * + * @param None + * + * @retval None + */ +void FMC_EnablePrefetchBuffer(void) +{ + FMC->CTRL1_B.PBEN = ENABLE; +} + +/*! + * @brief Disable the Prefetch Buffer. + * + * @param None + * + * @retval None + */ +void FMC_DisablePrefetchBuffer(void) +{ + FMC->CTRL1_B.PBEN = DISABLE; +} + +/*! + * @brief Unlock the FMC Program Erase Controller + * + * @param None + * + * @retval None + */ +void FMC_Unlock(void) +{ + FMC->KEY = 0x45670123; + FMC->KEY = 0xCDEF89AB; +} + +/*! + * @brief Lock the FMC Program Erase Controller. + * + * @param None + * + * @retval None + */ +void FMC_Lock(void) +{ + FMC->CTRL2_B.LOCK = BIT_SET; +} + +/*! + * @brief Erase a specified FMC page. + * + * @param pageAddr: The page address to be erased. + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_BUSY + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + if (status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.PAGEERA = BIT_SET; + FMC->ADDR = pageAddr; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + FMC->CTRL2_B.PAGEERA = BIT_RESET; + } + return status; +} + +/*! + * @brief Erase all FMC pages. + * + * @param None + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_EraseAllPage(void) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + if (status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.MASSERA = BIT_SET; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + FMC->CTRL2_B.MASSERA = BIT_RESET; + } + return status; +} + +/*! + * @brief Erase the FMC option bytes. + * + * @param None + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_EraseOptionBytes(void) +{ + uint16_t rdtemp = 0x00A5; + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + if (FMC_GetReadProtectionStatus() != RESET) + { + rdtemp = 0x00; + } + status = FMC_WaitForLastOperation(0x000B0000); + if (status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + + FMC->CTRL2_B.OBE = BIT_SET; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.OBE = BIT_RESET; + FMC->CTRL2_B.OBP = BIT_SET; + OB->RDP = rdtemp; + status = FMC_WaitForLastOperation(0x000B0000); + if (status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + else if (status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Program a word at a specified address. + * + * @param address:the address to be programmed. + * + * @param data: the data to be programmed. + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + __IOM uint32_t temp = 0; + +#ifdef APM32S10X_HD + __set_PRIMASK(1); +#endif + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.PG = BIT_SET; + + *(__IOM uint16_t*)address = data; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + temp = address + 2; + + *(__IOM uint16_t*) temp = data >> 16; + + status = FMC_WaitForLastOperation(0x000B0000); + FMC->CTRL2_B.PG = BIT_RESET; + } + else + { + FMC->CTRL2_B.PG = BIT_RESET; + } + } + +#ifdef APM32S10X_HD + __set_PRIMASK(0); +#endif + + return status; +} + +/*! + * @brief Program a half word at a specified address. + * + * @param address:the address to be programmed. + * + * @param data: the data to be programmed. + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + +#ifdef APM32S10X_HD + __set_PRIMASK(1); +#endif + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.PG = BIT_SET; + *(__IOM uint16_t*)address = data; + status = FMC_WaitForLastOperation(0x000B0000); + FMC->CTRL2_B.PG = BIT_RESET; + } + +#ifdef APM32S10X_HD + __set_PRIMASK(0); +#endif + + return status; +} + +/*! + * @brief Program a half word at a specified Option Byte Data address. + * + * @param address:the address to be programmed. + * + * @param data: the data to be programmed. + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + + FMC->CTRL2_B.OBP = BIT_SET; + *(__IOM uint16_t*)address = data; + status = FMC_WaitForLastOperation(0x000B0000); + if (status == FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Write protects the desired pages + * + * @param page:the address of the pages to be write protection + * This parameter can be any combination of the following values: + * @arg FLASH_WRP_PAGE_0_3 to FLASH_WRP_PAGE_124_127 + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_EnableWriteProtection(uint32_t page) +{ + uint16_t WPP0_Data = 0xFFFF, WPP1_Data = 0xFFFF, WPP2_Data = 0xFFFF, WPP3_Data = 0xFFFF; + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + page = ~page; + WPP0_Data = (page & 0x000000FF); + WPP1_Data = (page & 0x0000FF00) >> 8; + WPP2_Data = (page & 0x00FF0000) >> 16; + WPP3_Data = (page & 0xFF000000) >> 24; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + FMC->CTRL2_B.OBP = BIT_SET; + + if (WPP0_Data != 0xFF) + { + OB->WRP0 = WPP0_Data; + status = FMC_WaitForLastOperation(0x000B0000); + } + if ((status == FMC_STATUS_COMPLETE) && (WPP1_Data != 0xFF)) + { + OB->WRP1 = WPP1_Data; + status = FMC_WaitForLastOperation(0x000B0000); + } + if ((status == FMC_STATUS_COMPLETE) && (WPP2_Data != 0xFF)) + { + OB->WRP2 = WPP2_Data; + status = FMC_WaitForLastOperation(0x000B0000); + } + if ((status == FMC_STATUS_COMPLETE) && (WPP3_Data != 0xFF)) + { + OB->WRP3 = WPP3_Data; + status = FMC_WaitForLastOperation(0x000B0000); + } + + if (status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Enable the read out protection. + * + * @param None + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_EnableReadOutProtection(void) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + + FMC->CTRL2_B.OBE = BIT_SET; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.OBE = BIT_RESET; + FMC->CTRL2_B.OBP = BIT_SET; + OB->RDP = 0x00; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + else if (status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBE = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Disable the read out protection. + * + * @param None + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_DisableReadOutProtection(void) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + FMC->CTRL2_B.OBE = BIT_SET; + FMC->CTRL2_B.STA = BIT_SET; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.OBE = BIT_RESET; + FMC->CTRL2_B.OBP = BIT_SET; + OB->RDP = 0xA5; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + else if (status != FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBE = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Program the FMC User Option Byte. + * + * @param userConfig: Point to a FMC_UserConfig_T structure. + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + FMC->OBKEY = 0x45670123; + FMC->OBKEY = 0xCDEF89AB; + + status = FMC_WaitForLastOperation(0x000B0000); + + if (status == FMC_STATUS_COMPLETE) + { + FMC->CTRL2_B.OBP = BIT_SET; + OB->USER = (uint32_t)userConfig->iwdtSet | \ + (uint32_t)userConfig->stopSet | \ + (uint32_t)userConfig->stdbySet | 0xF8; + status = FMC_WaitForLastOperation(0x000B0000); + if (status == FMC_STATUS_TIMEOUT) + { + FMC->CTRL2_B.OBP = BIT_RESET; + } + } + return status; +} + +/*! + * @brief Read the FMC User Option Bytes values. + * + * @param None + * + * @retval Return User Option Bytes values + */ +uint32_t FMC_ReadUserOptionByte(void) +{ + return (FMC->OBCS_B.UOB >> 2); +} + +/*! + * @brief Read the FMC Write Protection Option Bytes Register value. + * + * @param None + * + * @retval Return the value of Option Bytes Write Protection Register. + */ +uint32_t FMC_ReadOptionByteWriteProtection(void) +{ + return FMC->WRTPROT; +} + +/*! + * @brief Get the FMC Read Out Protection Status is set or not. + * + * @param None + * + * @retval status : set or reset. + */ +uint8_t FMC_GetReadProtectionStatus(void) +{ + uint8_t flagstatus = RESET; + + if (FMC->OBCS_B.READPROT != RESET) + { + flagstatus = SET; + } + else + { + flagstatus = RESET; + } + return flagstatus; +} + +/*! + * @brief FMC Prefetch Buffer status is set or not. + * + * @param None + * + * @retval status : set or reset. + */ +uint8_t FMC_ReadPrefetchBufferStatus(void) +{ + return FMC->CTRL1_B.PBSF; +} + +/*! + * @brief Enable the specified FMC interrupts. + * + * @param interrupt: Select the FMC interrupt sources + * This parameter can be one of the following values: + * @arg FMC_INT_ERR : Error Interrupt + * @arg FMC_INT_OC : Operation Complete Interrupt + * + * @retval None + */ +void FMC_EnableInterrupt(FMC_INT_T interrupt) +{ + if (interrupt == FMC_INT_ERR) + { + FMC->CTRL2_B.ERRIE = ENABLE; + } + else + { + FMC->CTRL2_B.OCIE = ENABLE; + } +} + +/*! + * @brief Disable the specified FMC interrupts. + * + * @param interrupt: Select the FMC interrupt sources + * This parameter can be one of the following values: + * @arg FMC_INT_ERR : Error Interrupt + * @arg FMC_INT_OC : Operation Complete Interrupt + * + * @retval None + */ +void FMC_DisableInterrupt(FMC_INT_T interrupt) +{ + if (interrupt == FMC_INT_ERR) + { + FMC->CTRL2_B.ERRIE = DISABLE; + } + else + { + FMC->CTRL2_B.OCIE = DISABLE; + } +} + +/*! + * @brief Read FMC flag is set or not + * + * @param flag: status flag of FMC + * This parameter can be one of the following values: + * @arg FMC_FLAG_BUSY : FMC Busy flag + * @arg FMC_FLAG_OC : FMC Operation Complete flag + * @arg FMC_FLAG_PE : FMC Program error flag + * @arg FMC_FLAG_WPE : FMC Write protected error flag + * @arg FMC_FLAG_OBE : FMC Option Byte error flag + * + * @retval flag status : set or reset + */ +uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag) +{ + if (flag == FMC_FLAG_OBE) + { + return FMC->OBCS_B.OBE; + } + else if ((FMC->STS & flag) != RESET) + { + return SET; + } + return RESET; +} + +/*! + * @brief Clear the FMC's flag. + * + * @param flag: status flag of FMC + * This parameter can be any combination of the following values: + * @arg FMC_FLAG_OC : FMC Operation Complete flag + * @arg FMC_FLAG_PE : FMC Program error flag + * @arg FMC_FLAG_WPE : FMC Write protected error flag + * + * @retval None + * + */ +void FMC_ClearStatusFlag(uint32_t flag) +{ + FMC->STS = flag; +} + +/*! + * @brief Read the FMC Status. + * + * @param None + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_BUSY + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + */ +FMC_STATUS_T FMC_ReadStatus(void) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + if (FMC->STS_B.BUSYF == BIT_SET) + { + status = FMC_STATUS_BUSY; + } + else if (FMC->STS_B.PEF == BIT_SET) + { + status = FMC_STATUS_ERROR_PG; + } + else if (FMC->STS_B.WPEF == BIT_SET) + { + status = FMC_STATUS_ERROR_WRP; + } + else + { + status = FMC_STATUS_COMPLETE; + } + return status; +} + +/*! + * @brief Wait for a Flash operation to complete or a TIMEOUT to occur. + * + * @param timeOut:FMC programming timeout value. + * + * @retval Return the flash state.It can be one of value: + * @arg FMC_STATUS_ERROR_PG + * @arg FMC_STATUS_ERROR_WRP + * @arg FMC_STATUS_COMPLETE + * @arg FMC_STATUS_TIMEOUT + */ +FMC_STATUS_T FMC_WaitForLastOperation(uint32_t timeOut) +{ + FMC_STATUS_T status = FMC_STATUS_COMPLETE; + + /* Check for the Flash Status */ + status = FMC_ReadStatus(); + + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while ((status == FMC_STATUS_BUSY) && (timeOut != 0)) + { + status = FMC_ReadStatus(); + timeOut--; + } + if (timeOut == 0x00) + { + status = FMC_STATUS_TIMEOUT; + } + return status; +} + +/**@} end of group FMC_Functions */ +/**@} end of group FMC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_gpio.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_gpio.c new file mode 100644 index 0000000000..8493f574ca --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_gpio.c @@ -0,0 +1,518 @@ +/*! + * @file apm32s10x_gpio.c + * + * @brief This file provides all the GPIO firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_gpio.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup GPIO_Driver GPIO Driver + @{ +*/ + +/** @defgroup GPIO_Functions Functions + @{ +*/ + +/*! + * @brief Reset GPIO peripheral registers to their default reset values + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @retval None + */ +void GPIO_Reset(GPIO_T* port) +{ + RCM_APB2_PERIPH_T APB2Periph; + + if (port == GPIOA) + { + APB2Periph = RCM_APB2_PERIPH_GPIOA; + } + else if (port == GPIOB) + { + APB2Periph = RCM_APB2_PERIPH_GPIOB; + } + else if (port == GPIOC) + { + APB2Periph = RCM_APB2_PERIPH_GPIOC; + } + else if (port == GPIOD) + { + APB2Periph = RCM_APB2_PERIPH_GPIOD; + } + else if (port == GPIOE) + { + APB2Periph = RCM_APB2_PERIPH_GPIOE; + } + + RCM_EnableAPB2PeriphReset(APB2Periph); + RCM_DisableAPB2PeriphReset(APB2Periph); +} + +/*! + * @brief Reset Alternate Functions registers to their default reset values + * + * @param None + * + * @retval None + */ +void GPIO_AFIOReset(void) +{ + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_AFIO); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_AFIO); +} + +/*! + * @brief Configure the GPIO peripheral according to the specified parameters in the gpioConfig + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @param gpioConfig: pointer to a GPIO_Config_T structure + * + * @retval None + */ +void GPIO_Config(GPIO_T* port, GPIO_Config_T* gpioConfig) +{ + uint8_t i; + uint32_t mode; + uint32_t CR; + uint32_t temp; + uint32_t shift; + + mode = gpioConfig->mode & 0x0f; + + if (gpioConfig->mode & 0x80) + { + mode |= gpioConfig->speed; + } + + if (gpioConfig->pin & 0xff) + { + CR = port->CFGLOW; + + for (i = 0, shift = 0x01; i < 8; i++, shift <<= 1) + { + if (gpioConfig->pin & shift) + { + temp = i << 2; + CR &= (uint32_t)~(0x0f << temp); + CR |= mode << temp; + + if (gpioConfig->mode == GPIO_MODE_IN_PD) + { + port->BC = shift; + } + else if (gpioConfig->mode == GPIO_MODE_IN_PU) + { + port->BSC = shift; + } + } + } + + port->CFGLOW = CR; + } + + if (gpioConfig->pin & 0xff00) + { + CR = port->CFGHIG; + + for (i = 8, shift = 0x100; i < 16; i++, shift <<= 1) + { + if (gpioConfig->pin & shift) + { + temp = (i - 8) << 2; + CR &= (uint32_t)~(0x0f << temp); + CR |= mode << temp; + + if (gpioConfig->mode == GPIO_MODE_IN_PD) + { + port->BC = shift; + } + else if (gpioConfig->mode == GPIO_MODE_IN_PU) + { + port->BSC = shift; + } + } + } + + port->CFGHIG = CR; + } +} + +/*! + * @brief Fill each gpioConfig member with its default value. + * + * @param gpioConfig : pointer to a GPIO_Config_T structure which will be initialized. + * + * @retval None + */ +void GPIO_ConfigStructInit(GPIO_Config_T* gpioConfig) +{ + gpioConfig->pin = GPIO_PIN_ALL; + gpioConfig->speed = GPIO_SPEED_2MHz; + gpioConfig->mode = GPIO_MODE_IN_FLOATING; +} + +/*! + * @brief Read the specified input port pin + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @param pin : specify pin to read. + * This parameter can be one of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval The input port pin value + */ +uint8_t GPIO_ReadInputBit(GPIO_T* port, uint16_t pin) +{ + uint8_t ret; + + ret = (port->IDATA & pin) ? BIT_SET : BIT_RESET; + + return ret; +} + +/*! + * @brief Read the specified GPIO input data port + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @retval GPIO input data port value + */ +uint16_t GPIO_ReadInputPort(GPIO_T* port) +{ + return (uint16_t)port->IDATA; +} + +/*! + * @brief Read the specified output data port bit + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @param pin : specify pin to read. + * This parameter can be one of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval The output port pin value + */ +uint8_t GPIO_ReadOutputBit(GPIO_T* port, uint16_t pin) +{ + + uint8_t ret; + + ret = (port->ODATA & pin) ? BIT_SET : BIT_RESET; + + return ret; +} + +/*! + * @brief Read the specified GPIO output data port + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @retval output data port value + */ +uint16_t GPIO_ReadOutputPort(GPIO_T* port) +{ + return (uint16_t)port->ODATA; +} + +/*! + * @brief Set the selected data port bits + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @param pin : specify pin to be written. + * This parameter can be any combination of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_SetBit(GPIO_T* port, uint16_t pin) +{ + port->BSC = (uint32_t)pin; +} + +/*! + * @brief Clear the selected data port bits + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @param pin : specify pin to be cleared. + * This parameter can be any combination of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_ResetBit(GPIO_T* port, uint16_t pin) +{ + port->BC = (uint32_t)pin; +} + +/*! + * @brief Write data to the specified GPIO data port bit + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @param pin : Select specifies pin. + * This parameter can be one of GPIO_PIN_x( x can be from 0 to 15). + * + * @param bitVal : specify the value to be written to the port output data register + * This parameter can be one of the following values: + * @arg BIT_RESET: Reset the port pin + * @arg BIT_SET : Set the port pin + * + * @retval None + */ +void GPIO_WriteBitValue(GPIO_T* port, uint16_t pin, uint8_t bitVal) +{ + if (bitVal != BIT_RESET) + { + port->BSC = pin; + } + else + { + port->BC = pin ; + } +} + +/*! + * @brief Write data to the specified GPIO data port + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @param portValue : specify the value to be written to the port output data register. + * + * @retval None + */ +void GPIO_WriteOutputPort(GPIO_T* port, uint16_t portValue) +{ + port->ODATA = (uint32_t)portValue; +} + +/*! + * @brief Lock GPIO Pins configuration registers + * + * @param port: Select the GPIO port. + * This parameter can be one of GPIOx( x can be from A to E). + * + * @param pin : Select specifies pin. + * This parameter can be any combination of GPIO_PIN_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_ConfigPinLock(GPIO_T* port, uint16_t pin) +{ + uint32_t val = 0x00010000; + + val |= pin; + /* Set LCKK bit */ + port->LOCK = val ; + /* Reset LCKK bit */ + port->LOCK = pin; + /* Set LCKK bit */ + port->LOCK = val; + /* Read LCKK bit */ + val = port->LOCK; + /* Read LCKK bit */ + val = port->LOCK; +} + +/*! + * @brief Select the GPIO pin used as Event output + * + * @param portSource: select the GPIO port to be used as source for Event output. + * This parameter can be one of GPIO_PORT_SOURCE_x( x can be from A to E). + * + * @param pinSource : specify the pin for the Event output + * This parameter can be GPIO_PIN_SOURCE_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_ConfigEventOutput(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource) +{ + AFIO->EVCTRL_B.PORTSEL = portSource; + AFIO->EVCTRL_B.PINSEL = pinSource; +} + +/*! + * @brief Enable the Event Output + * + * @param None + * + * @retval None + */ +void GPIO_EnableEventOutput(void) +{ + AFIO->EVCTRL_B.EVOEN = BIT_SET; +} + +/*! + * @brief Disable the Event Output + * + * @param None + * + * @retval None + */ +void GPIO_DisableEventOutput(void) +{ + AFIO->EVCTRL_B.EVOEN = BIT_RESET; +} + +/*! + * @brief Change the mapping of the specified pin + * + * @param remap : select the pin to remap + * This parameter can be one of the following values: + * @arg GPIO_NO_REMAP_SPI1 : No SPI1 Alternate Function mapping + * @arg GPIO_REMAP_SPI1 : SPI1 Alternate Function mapping + * @arg GPIO_NO_REMAP_I2C1 : No I2C1 Alternate Function mapping + * @arg GPIO_REMAP_I2C1 : I2C1 Alternate Function mapping + * @arg GPIO_NO_REMAP_USART1 : No USART1 Alternate Function mapping + * @arg GPIO_REMAP_USART1 : USART1 Alternate Function mapping + * @arg GPIO_NO_REMAP_USART2 : No USART2 Alternate Function mapping + * @arg GPIO_REMAP_USART2 : USART2 Alternate Function mapping + * @arg GPIO_NO_REMAP_USART3 : No USART3 Partial Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP_USART3 : USART3 Partial Alternate Function mapping + * @arg GPIO_FULL_REMAP_USART3 : USART3 Full Alternate Function mapping + * @arg GPIO_NO_REMAP_TMR1 : No TIM1 Partial Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP_TMR1 : TIM1 Partial Alternate Function mapping + * @arg GPIO_FULL_REMAP_TMR1 : TIM1 Full Alternate Function mapping + * @arg GPIO_NO_REMAP1_TMR2 : No TIM2 Partial1 Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP1_TMR2 : TIM2 Partial1 Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP2_TMR2 : TIM2 Partial2 Alternate Function mapping + * @arg GPIO_FULL_REMAP_TMR2 : TIM2 Full Alternate Function mapping + * @arg GPIO_NO_REMAP_TMR3 : No TIM3 Partial Alternate Function mapping + * @arg GPIO_PARTIAL_REMAP_TMR3 : TIM3 Partial Alternate Function mapping + * @arg GPIO_FULL_REMAP_TMR3 : TIM3 Full Alternate Function mapping + * @arg GPIO_NO_REMAP_TMR4 : No TIM4 Alternate Function mapping + * @arg GPIO_REMAP_TMR4 : TIM4 Alternate Function mapping + * @arg GPIO_NO_REMAP_CAN1 : No CAN1 Alternate Function mapping + * @arg GPIO_REMAP1_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_REMAP2_CAN1 : CAN1 Alternate Function mapping + * @arg GPIO_NO_REMAP_PD01 : No PD01 Alternate Function mapping + * @arg GPIO_REMAP_PD01 : PD01 Alternate Function mapping + * @arg GPIO_NO_REMAP_ADC1_ETRGINJ : No ADC1 External Trigger Injected Conversion remapping + * @arg GPIO_REMAP_ADC1_ETRGINJ : ADC1 External Trigger Injected Conversion remapping + * @arg GPIO_NO_REMAP_ADC1_ETRGREG : No ADC1 External Trigger Regular Conversion remapping + * @arg GPIO_REMAP_ADC1_ETRGREG : ADC1 External Trigger Regular Conversion remapping + * @arg GPIO_NO_REMAP_ADC2_ETRGINJ : No ADC2 External Trigger Injected Conversion remapping + * @arg GPIO_REMAP_ADC2_ETRGINJ : ADC2 External Trigger Injected Conversion remapping + * @arg GPIO_NO_REMAP_ADC2_ETRGREG : No ADC2 External Trigger Regular Conversion remapping + * @arg GPIO_REMAP_ADC2_ETRGREG : ADC2 External Trigger Regular Conversion remapping + * @arg GPIO_NO_REMAP_CAN2 : No CAN2 Alternate Function mapping + * @arg GPIO_REMAP_CAN2 : CAN2 Alternate Function mapping + * @arg GPIO_NO_REMAP_SWJ : Full SWJ Enabled (JTAG-DP + SW-DP) + * @arg GPIO_REMAP_SWJ_NOJTRST : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST + * @arg GPIO_REMAP_SWJ_JTAGDISABLE : JTAG-DP Disabled and SW-DP Enabled + * @arg GPIO_REMAP_SWJ_DISABLE : Full SWJ Disabled (JTAG-DP + SW-DP) + * + * @retval When you use GPIO_REMAP_CAN2, you must put this function last of all other ConfigPinRemap Function. + */ +void GPIO_ConfigPinRemap(GPIO_REMAP_T remap) +{ + uint32_t val, mask, bitOffset; + uint32_t regVal; + + val = remap & 0x0f; + mask = (remap >> 4) & 0x0f; + bitOffset = (remap >> 8) & 0xff; + regVal = AFIO->REMAP1; + + if (remap >> 8 == 0x18) + { + regVal &= 0xF0FFFFFF; + AFIO->REMAP1 &= 0xF0FFFFFF; + } + else + { + regVal |= 0x0F000000; + } + + mask <<= bitOffset; + regVal &= (uint32_t)~mask; + val <<= bitOffset; + regVal |= val; + AFIO->REMAP1 = regVal; +} + +/*! + * @brief Select the GPIO pin used as EINT Line + * + * @param portSource : select the GPIO port to be used as source for EINT line. + * This parameter can be one of GPIO_PORT_SOURCE_x( x can be from A to E). + * + * @param pinSource : Specify the EINT line to be configured. + * This parameter can be GPIO_PIN_SOURCE_x( x can be from 0 to 15). + * + * @retval None + */ +void GPIO_ConfigEINTLine(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource) +{ + uint32_t shift; + + if (pinSource <= GPIO_PIN_SOURCE_3) + { + shift = pinSource << 2; + AFIO->EINTSEL1 &= (uint32_t)~(0x0f << shift); + AFIO->EINTSEL1 |= portSource << shift; + } + + else if (pinSource <= GPIO_PIN_SOURCE_7) + { + shift = (pinSource - GPIO_PIN_SOURCE_4) << 2; + AFIO->EINTSEL2 &= (uint32_t)~(0x0f << shift); + AFIO->EINTSEL2 |= portSource << shift; + } + + else if (pinSource <= GPIO_PIN_SOURCE_11) + { + shift = (pinSource - GPIO_PIN_SOURCE_8) << 2; + AFIO->EINTSEL3 &= (uint32_t)~(0x0f << shift); + AFIO->EINTSEL3 |= portSource << shift; + } + + else if (pinSource <= GPIO_PIN_SOURCE_15) + { + shift = (pinSource - GPIO_PIN_SOURCE_12) << 2; + AFIO->EINTSEL4 &= (uint32_t)~(0x0f << shift); + AFIO->EINTSEL4 |= portSource << shift; + } +} + +/**@} end of group GPIO_Functions */ +/**@} end of group GPIO_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_i2c.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_i2c.c new file mode 100644 index 0000000000..a5a0622741 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_i2c.c @@ -0,0 +1,1027 @@ +/*! + * @file apm32s10x_i2c.c + * + * @brief This file provides all the I2C firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_i2c.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup I2C_Driver I2C Driver + @{ +*/ + +/** @defgroup I2C_Functions Functions + @{ +*/ + +/*! + * @brief Reset I2C + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_Reset(I2C_T* i2c) +{ + if (i2c == I2C1) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); + } + else + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_I2C2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_I2C2); + } +} + +/*! + * @brief Configure I2C by configuring the structure + * + * @param i2c: I2C selet 1 or 2 + * + * @param i2cConfig: pointer to a I2C_Config_T structure + * + * @retval None + */ +void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig) +{ + uint16_t tmpreg = 0, freqrange = 0; + uint32_t PCLK1 = 8000000, PCLK2 = 0; + uint16_t result = 0x04; + + i2c->SWITCH = 0; + + /* I2C CTRL2 Configuration */ + RCM_ReadPCLKFreq(&PCLK1, &PCLK2); + freqrange = PCLK1 / 1000000; + i2c->CTRL2_B.CLKFCFG = freqrange; + + /* I2C CLKCTRL Configuration */ + i2c->CTRL1_B.I2CEN = BIT_RESET; + + if (i2cConfig->clockSpeed <= 100000) + { + result = (PCLK1 / (i2cConfig->clockSpeed << 1)); + if (result < 0x04) + { + result = 0x04; + } + i2c->RISETMAX = freqrange + 1; + tmpreg |= result; + } + /* Configure speed in fast mode */ + else + { + if (i2cConfig->dutyCycle == I2C_DUTYCYCLE_2) + { + result = (PCLK1 / (i2cConfig->clockSpeed * 3)); + } + else + { + result = (PCLK1 / (i2cConfig->clockSpeed * 25)); + result |= I2C_DUTYCYCLE_16_9; + } + + if ((result & 0x0FFF) == 0) + { + result |= 0x0001; + } + + tmpreg |= (uint16_t)(result | 0x8000); + i2c->RISETMAX = ((((freqrange) * 300) / 1000) + 1); + } + i2c->CLKCTRL = tmpreg; + i2c->CTRL1_B.I2CEN = BIT_SET; + + /* i2c CTRL1 Configuration */ + i2c->CTRL1_B.ACKEN = BIT_RESET; + i2c->CTRL1_B.SMBTCFG = BIT_RESET; + i2c->CTRL1_B.SMBEN = BIT_RESET; + + i2c->CTRL1 |= i2cConfig->mode; + i2c->CTRL1_B.ACKEN = i2cConfig->ack; + + i2c->SADDR1 = i2cConfig->ackAddress | i2cConfig->ownAddress1; +} + +/*! + * @brief Fill each I2C_Config_T member with its default value. + * + * @param i2cConfig: pointer to a I2C_Config_T structure + * + * @retval None + */ +void I2C_ConfigStructInit(I2C_Config_T* i2cConfig) +{ + i2cConfig->clockSpeed = 5000; + i2cConfig->mode = I2C_MODE_I2C; + i2cConfig->dutyCycle = I2C_DUTYCYCLE_2; + i2cConfig->ownAddress1 = 0; + i2cConfig->ack = I2C_ACK_DISABLE; + i2cConfig->ackAddress = I2C_ACK_ADDRESS_7BIT; +} + +/*! + * @brief Enable I2C + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_Enable(I2C_T* i2c) +{ + i2c->CTRL1_B.I2CEN = ENABLE; +} + +/*! + * @brief Disable I2C + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_Disable(I2C_T* i2c) +{ + i2c->CTRL1_B.I2CEN = DISABLE; +} + +/*! + * @brief Enable Generates i2c communication START condition. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableGenerateStart(I2C_T* i2c) +{ + i2c->CTRL1_B.START = BIT_SET; +} + +/*! + * @brief Disable Generates i2c communication START condition. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableGenerateStart(I2C_T* i2c) +{ + i2c->CTRL1_B.START = BIT_RESET; +} + +/*! + * @brief Enable Generates i2c communication STOP condition. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableGenerateStop(I2C_T* i2c) +{ + i2c->CTRL1_B.STOP = BIT_SET; +} + +/*! + * @brief Disable Generates i2c communication STOP condition. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableGenerateStop(I2C_T* i2c) +{ + i2c->CTRL1_B.STOP = BIT_RESET; +} + +/*! + * @brief Enable the specified I2C acknowledge feature. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableAcknowledge(I2C_T* i2c) +{ + i2c->CTRL1_B.ACKEN = ENABLE; +} + +/*! + * @brief Disable the specified I2C acknowledge feature. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableAcknowledge(I2C_T* i2c) +{ + i2c->CTRL1_B.ACKEN = DISABLE; +} + +/*! + * @brief Configure the specified I2C own address2. + * + * @param i2c: I2C selet 1 or 2 + * + * @param address:specifies the 7bit I2C own address2. + * + * @retval None + */ +void I2C_ConfigOwnAddress2(I2C_T* i2c, uint8_t address) +{ + i2c->SADDR2_B.ADDR2 = address; +} + +/*! + * @brief Enable the specified I2C dual addressing mode. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableDualAddress(I2C_T* i2c) +{ + i2c->SADDR2_B.ADDRNUM = ENABLE; +} + +/*! + * @brief Disable the specified I2C dual addressing mode. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableDualAddress(I2C_T* i2c) +{ + i2c->SADDR2_B.ADDRNUM = DISABLE; +} + +/*! + * @brief Enable the specified I2C general call feature. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableGeneralCall(I2C_T* i2c) +{ + i2c->CTRL1_B.SRBEN = ENABLE; +} + +/*! + * @brief Disable the specified I2C general call feature. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableGeneralCall(I2C_T* i2c) +{ + i2c->CTRL1_B.SRBEN = DISABLE; +} + +/*! + * @brief Send one byte + * + * @param i2c: I2C selet 1 or 2 + * + * @param data: data to send + * + * @retval None + */ +void I2C_TxData(I2C_T* i2c, uint8_t data) +{ + i2c->DATA_B.DATA = data; +} + +/*! + * @brief Return the recevie data + * + * @param i2c: I2C selet 1 or 2 + * + * @retval received data + */ +uint8_t I2C_RxData(I2C_T* i2c) +{ + return i2c->DATA_B.DATA; +} + +/*! + * @brief Transmit the address byte to select the slave device. + * + * @param i2c: I2C selet 1 or 2 + * + * @param address: slave address which will be transmitted + * + * @param direction: Direction mode + * The parameter can be one of following values: + * @arg I2C_DIRECTION_TX: Transmitter mode + * @arg I2C_DIRECTION_RX: Receiver mode + * @retval None + */ +void I2C_Tx7BitAddress(I2C_T* i2c, uint8_t address, I2C_DIRECTION_T direction) +{ + if (direction != I2C_DIRECTION_TX) + { + i2c->DATA_B.DATA = address | 0x0001; + } + else + { + i2c->DATA_B.DATA = address & 0xFFFE; + } +} + +/*! + * @brief Reads the I2C register and returns its value. + * + * @param i2c: I2C selet 1 or 2 + * + * @param i2cRegister : register to read + * The parameter can be one of following values: + * @arg I2C_REGISTER_CTRL1: CTRL1 register + * @arg I2C_REGISTER_CTRL2: CTRL2 register + * @arg I2C_REGISTER_SADDR1: SADDR1 register + * @arg I2C_REGISTER_SADDR2: SADDR2 register + * @arg I2C_REGISTER_DATA: DATA register + * @arg I2C_REGISTER_STS1: STS1 register + * @arg I2C_REGISTER_STS2: STS2 register + * @arg I2C_REGISTER_CLKCTRL: CLKCTRL register + * @arg I2C_REGISTER_RISETMAX: RISETMAX register + * @arg I2C_REGISTER_SWITCH: SWITCH register + * + * @retval The value of the read register + */ +uint16_t I2C_ReadRegister(I2C_T* i2c, I2C_REGISTER_T i2cRegister) +{ + switch (i2cRegister) + { + case I2C_REGISTER_CTRL1: + return i2c->CTRL1; + case I2C_REGISTER_CTRL2: + return i2c->CTRL2; + case I2C_REGISTER_SADDR1: + return i2c->SADDR1; + case I2C_REGISTER_SADDR2: + return i2c->SADDR2; + case I2C_REGISTER_DATA: + return i2c->DATA; + case I2C_REGISTER_STS1: + return i2c->STS1; + case I2C_REGISTER_STS2: + return i2c->STS2; + case I2C_REGISTER_CLKCTRL: + return i2c->CLKCTRL; + case I2C_REGISTER_RISETMAX: + return i2c->RISETMAX; + case I2C_REGISTER_SWITCH: + return i2c->SWITCH; + default: + return 0; + } +} + +/*! + * @brief Enable the I2C software reset. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableSoftwareReset(I2C_T* i2c) +{ + i2c->CTRL1_B.SWRST = ENABLE; +} + +/*! + * @brief Disable the I2C software reset. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableSoftwareReset(I2C_T* i2c) +{ + i2c->CTRL1_B.SWRST = DISABLE; +} + +/*! + * @brief Select the specified I2C NACK position in master receiver mode. + * + * @param i2c: I2C selet 1 or 2 + * + * @param NACKPosition: specifies the NACK position. + * + * @retval None + */ +void I2C_ConfigNACKPosition(I2C_T* i2c, I2C_NACK_POSITION_T NACKPosition) +{ + if (NACKPosition == I2C_NACK_POSITION_NEXT) + { + i2c->CTRL1_B.ACKPOS = BIT_SET; + } + else + { + i2c->CTRL1_B.ACKPOS = BIT_RESET; + } +} + +/*! + * @brief Control the height of pin of SMBusAlert + * + * @param i2c: I2C selet 1 or 2 + * + * @param SMBusState: SMBAlert pin level. + * The parameter can be one of following values: + * @arg I2C_SMBUSALER_LOW: SMBus Alert pin low + * @arg I2C_SMBUSALER_HIGH: SMBus Alert pin high + * + * @retval None + */ +void I2C_ConfigSMBusAlert(I2C_T* i2c, I2C_SMBUSALER_T SMBusState) +{ + if (SMBusState == I2C_SMBUSALER_LOW) + { + i2c->CTRL1_B.ALERTEN = BIT_SET; + } + else + { + i2c->CTRL1_B.ALERTEN = BIT_RESET; + } +} + +/*! + * @brief Enable the I2C PEC transfer. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnablePECTransmit(I2C_T* i2c) +{ + i2c->CTRL1_B.PEC = BIT_SET; +} + +/*! + * @brief Disable the I2C PEC transfer. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisablePECTransmit(I2C_T* i2c) +{ + i2c->CTRL1_B.PEC = BIT_RESET; +} + +/*! + * @brief Select the I2C PEC position. + * + * @param i2c: I2C selet 1 or 2 + * + * @param PECPosition: PEC position + * The parameter can be one of following values: + * @arg I2C_PEC_POSITION_NEXT: indicates that the next byte is PEC + * @arg I2C_PEC_POSITION_CURRENT: indicates that current byte is PEC + * + * @retval None + */ +void I2C_ConfigPECPosition(I2C_T* i2c, I2C_PEC_POSITION_T PECPosition) +{ + if (PECPosition == I2C_PEC_POSITION_NEXT) + { + i2c->CTRL1_B.ACKPOS = BIT_SET; + } + else + { + i2c->CTRL1_B.ACKPOS = BIT_RESET; + } +} + +/*! + * @brief Enable the PEC value calculation of the transferred bytes. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnablePEC(I2C_T* i2c) +{ + i2c->CTRL1_B.PECEN = BIT_SET; +} + +/*! + * @brief Disable the PEC value calculation of the transferred bytes. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisablePEC(I2C_T* i2c) +{ + i2c->CTRL1_B.PECEN = BIT_RESET; +} + +/*! + * @brief Read the PEC value for the I2C. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval value of PEC + */ +uint8_t I2C_ReadPEC(I2C_T* i2c) +{ + return i2c->STS2_B.PECVALUE; +} + +/*! + * @brief Enable the I2C ARP. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableARP(I2C_T* i2c) +{ + i2c->CTRL1_B.ARPEN = BIT_SET; +} + +/*! +* @brief Disable the I2C ARP. +* +* @param i2c: I2C selet 1 or 2 +* +* @retval None +*/ +void I2C_DisableARP(I2C_T* i2c) +{ + i2c->CTRL1_B.ARPEN = BIT_RESET; +} + +/*! + * @brief Enable the I2C Clock stretching. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableStretchClock(I2C_T* i2c) +{ + i2c->CTRL1_B.CLKSTRETCHD = BIT_RESET; +} + +/*! + * @brief Disable the I2C Clock stretching. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableStretchClock(I2C_T* i2c) +{ + i2c->CTRL1_B.CLKSTRETCHD = BIT_SET; +} + +/*! + * @brief Select the specified I2C fast mode duty cycle. + * + * @param i2c: I2C selet 1 or 2 + * + * @param dutyCycle: the fast mode duty cycle. + * The parameter can be one of following values: + * @arg I2C_DUTYCYCLE_16_9: I2C fast mode Tlow/Thigh = 16/9 + * @arg I2C_DUTYCYCLE_2: I2C fast mode Tlow/Thigh = 2 + * + * @retval None + */ +void I2C_ConfigFastModeDutyCycle(I2C_T* i2c, I2C_DUTYCYCLE_T dutyCycle) +{ + if (dutyCycle == I2C_DUTYCYCLE_16_9) + { + i2c->CLKCTRL_B.FDUTYCFG = BIT_SET; + } + else + { + i2c->CLKCTRL_B.FDUTYCFG = BIT_RESET; + } +} + +/*! + * @brief Enable the specified I2C DMA requests. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableDMA(I2C_T* i2c) +{ + i2c->CTRL2_B.DMAEN = ENABLE; +} + +/*! + * @brief Disable the specified I2C DMA requests. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableDMA(I2C_T* i2c) +{ + i2c->CTRL2_B.DMAEN = DISABLE; +} + +/*! + * @brief Enable DMA to receive the last transfer + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_EnableDMALastTransfer(I2C_T* i2c) +{ + i2c->CTRL2_B.LTCFG = BIT_SET; +} + +/*! + * @brief Disable DMA to receive the last transfer + * + * @param i2c: I2C selet 1 or 2 + * + * @retval None + */ +void I2C_DisableDMALastTransfer(I2C_T* i2c) +{ + i2c->CTRL2_B.LTCFG = BIT_RESET; +} + +/*! + * @brief Enable the specified I2C interrupts. + * + * @param i2c: I2C selet 1 or 2 + * + * @param interrupt:I2C interrupts sources + * The parameter can be any combination of following values: + * @arg I2C_INT_BUF: Buffer interrupt + * @arg I2C_INT_EVT: Event interrupt + * @arg I2C_INT_ERR: Error interrupt + * + * @retval None + */ +void I2C_EnableInterrupt(I2C_T* i2c, uint16_t interrupt) +{ + i2c->CTRL2 |= interrupt; +} + +/*! + * @brief Disable the specified I2C interrupts. + * + * @param i2c: I2C selet 1 or 2 + * + * @param interrupt:I2C interrupts sources + * The parameter can be any combination of following values: + * @arg I2C_INT_BUF: Buffer interrupt + * @arg I2C_INT_EVT: Event interrupt + * @arg I2C_INT_ERR: Error interrupt + * + * @retval None + */ +void I2C_DisableInterrupt(I2C_T* i2c, uint16_t interrupt) +{ + i2c->CTRL2 &= ~interrupt; +} + +/*! + * @brief Check that the last event is equal to the last passed event + * + * @param i2c: I2C selet 1 or 2 + * + * @param i2cEvent: the event to be checked. + * The parameter can be one of the following values: + * @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2 + * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3 + * @arg I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2 + * @arg I2C_EVENT_SLAVE_STOP_DETECTED : EV4 + * @arg I2C_EVENT_MASTER_MODE_SELECT : EV5 + * @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6 + * @arg I2C_EVENT_MASTER_BYTE_RECEIVED : EV7 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8 + * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2 + * @arg I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9 + * + * @retval Status: SUCCESS or ERROR + */ +uint8_t I2C_ReadEventStatus(I2C_T* i2c, I2C_EVENT_T i2cEvent) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + flag1 = i2c->STS1 & 0x0000FFFF; + flag2 = i2c->STS2 & 0x0000FFFF; + flag2 = flag2 << 16; + + lastevent = (flag1 | flag2) & 0x00FFFFFF; + + if ((lastevent & i2cEvent) == i2cEvent) + { + return SUCCESS; + } + return ERROR; +} + +/*! + * @brief Read the last i2c Event. + * + * @param i2c: I2C selet 1 or 2 + * + * @retval The last event + */ +uint32_t I2C_ReadLastEvent(I2C_T* i2c) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + flag1 = i2c->STS1 & 0x0000FFFF; + flag2 = i2c->STS2 & 0x0000FFFF; + flag2 = flag2 << 16; + + lastevent = (flag1 | flag2) & 0x00FFFFFF; + + return lastevent; +} + +/*! + * @brief Check whether the I2C flag is set + * + * @param i2c: I2C selet 1 or 2 + * + * @param flag: specify the I2C flag + * The parameter can be one of the following values: + * @arg I2C_FLAG_DUALADDR: Dual flag (Slave mode) + * @arg I2C_FLAG_SMMHADDR: SMBus host header (Slave mode) + * @arg I2C_FLAG_SMBDADDR: SMBus default header (Slave mode) + * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode) + * @arg I2C_FLAG_TR: Transmitter/Receiver flag + * @arg I2C_FLAG_BUSBSY: Bus busy flag + * @arg I2C_FLAG_MS: Master/Slave flag + * @arg I2C_FLAG_SMBALT: SMBus Alert flag + * @arg I2C_FLAG_TTE: Timeout or Tlow error flag + * @arg I2C_FLAG_PECE: PEC error in reception flag + * @arg I2C_FLAG_OVRUR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AE: Acknowledge error flag + * @arg I2C_FLAG_AL: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * @arg I2C_FLAG_TXBE: Transmitter data register empty flag + * @arg I2C_FLAG_RXBNE: Receiver data register not empty flag + * @arg I2C_FLAG_STOP: Stop detection flag (Slave mode) + * @arg I2C_FLAG_ADDR10: 10-bit header sent flag (Master mode) + * @arg I2C_FLAG_BTC: Byte transfer complete flag + * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) + * @arg I2C_FLAG_START: Start bit flag (Master mode) + * + * @retval Status: flag SET or RESET + */ +uint8_t I2C_ReadStatusFlag(I2C_T* i2c, I2C_FLAG_T flag) +{ + uint8_t status = 0; + switch (flag) + { + case I2C_FLAG_DUALADDR: + status = i2c->STS2_B.DUALADDRFLG; + break; + case I2C_FLAG_SMMHADDR: + status = i2c->STS2_B.SMMHADDR; + break; + case I2C_FLAG_SMBDADDR: + status = i2c->STS2_B.SMBDADDRFLG; + break; + case I2C_FLAG_GENCALL: + status = i2c->STS2_B.GENCALLFLG; + break; + case I2C_FLAG_TR: + status = i2c->STS2_B.TRFLG; + break; + case I2C_FLAG_BUSBSY: + status = i2c->STS2_B.BUSBSYFLG; + break; + case I2C_FLAG_MS: + status = i2c->STS2_B.MSFLG; + break; + case I2C_FLAG_SMBALT: + status = i2c->STS1_B.SMBALTFLG; + break; + case I2C_FLAG_TTE: + status = i2c->STS1_B.TTEFLG; + break; + case I2C_FLAG_PECE: + status = i2c->STS1_B.PECEFLG; + break; + case I2C_FLAG_OVRUR: + status = i2c->STS1_B.OVRURFLG; + break; + case I2C_FLAG_AE: + status = i2c->STS1_B.AEFLG; + break; + case I2C_FLAG_AL: + status = i2c->STS1_B.ALFLG; + break; + case I2C_FLAG_BERR: + status = i2c->STS1_B.BERRFLG; + break; + case I2C_FLAG_TXBE: + status = i2c->STS1_B.TXBEFLG; + break; + case I2C_FLAG_RXBNE: + status = i2c->STS1_B.RXBNEFLG; + break; + case I2C_FLAG_STOP: + status = i2c->STS1_B.STOPFLG; + break; + case I2C_FLAG_ADDR10: + status = i2c->STS1_B.ADDR10FLG; + break; + case I2C_FLAG_BTC: + status = i2c->STS1_B.BTCFLG; + break; + case I2C_FLAG_ADDR: + status = i2c->STS1_B.ADDRFLG; + break; + case I2C_FLAG_START: + status = i2c->STS1_B.STARTFLG; + break; + default: + break; + } + return status; +} + +/*! + * @brief Clear the I2C flag + * + * @param i2c: I2C selet 1 or 2 + * + * @param flag: specify the I2C flag + * The parameter can be one of the following values: + * @arg I2C_FLAG_SMBALT: SMBus Alert flag + * @arg I2C_FLAG_TTE: Timeout or Tlow error flag + * @arg I2C_FLAG_PECE: PEC error in reception flag + * @arg I2C_FLAG_OVRUR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AE: Acknowledge error flag + * @arg I2C_FLAG_AL: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * + * @retval None + * + * @note 1)I2C_FLAG_STOP: Stop detection flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) + * followed by a write operation to I2C_CRTL1 register (I2C_Enable()). + * 2)I2C_FLAG_ADDR10: 10-bit header sent flag is cleared by software sequence: + * a read operation to I2C_STS1 (I2C_ReadStatusFlag()) + * followed by writing the second byte of the address in I2C_DATA register. + * 3)I2C_FLAG_BTC: Byte transfer complete flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) + * followed by a read/write to I2C_DATA register (I2C_TxData()). + * 4)I2C_FLAG_ADDR: Address sent flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) + * followed by a read operation to I2C_STS2 register ((void)(I2Cx->STS2)). + * 5)I2C_FLAG_START: Start bit flag is cleared software sequence: + * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) + * followed by a write operation to I2C_DATA register (I2C_TxData()). + */ +void I2C_ClearStatusFlag(I2C_T* i2c, I2C_FLAG_T flag) +{ + switch (flag) + { + case I2C_FLAG_SMBALT: + i2c->STS1_B.SMBALTFLG = BIT_RESET; + break; + case I2C_FLAG_TTE: + i2c->STS1_B.TTEFLG = BIT_RESET; + break; + case I2C_FLAG_PECE: + i2c->STS1_B.PECEFLG = BIT_RESET; + break; + case I2C_FLAG_OVRUR: + i2c->STS1_B.OVRURFLG = BIT_RESET; + break; + case I2C_FLAG_AE: + i2c->STS1_B.AEFLG = BIT_RESET; + break; + case I2C_FLAG_AL: + i2c->STS1_B.ALFLG = BIT_RESET; + break; + case I2C_FLAG_BERR: + i2c->STS1_B.BERRFLG = BIT_RESET; + break; + default: + break; + } +} + +/*! + * @brief Check whether the I2C interrupts is set + * + * @param i2c: I2C selet 1 or 2 + * + * @param flag: specify the I2C interrupts + * The parameter can be one of the following values: + * @arg I2C_INT_FLAG_SMBALT: SMBus Alert flag + * @arg I2C_INT_FLAG_TTE: Timeout or Tlow error flag + * @arg I2C_INT_FLAG_PECE: PEC error in reception flag + * @arg I2C_INT_FLAG_OVRUR: Overrun/Underrun flag (Slave mode) + * @arg I2C_INT_FLAG_AE: Acknowledge error flag + * @arg I2C_INT_FLAG_AL: Arbitration lost flag (Master mode) + * @arg I2C_INT_FLAG_BERR: Bus error flag + * @arg I2C_INT_FLAG_TXBE: Transmitter data register empty flag + * @arg I2C_INT_FLAG_RXBNE: Receiver data register not empty flag + * @arg I2C_INT_FLAG_STOP: Stop detection flag (Slave mode) + * @arg I2C_INT_FLAG_ADDR10: 10-bit header sent flag (Master mode) + * @arg I2C_INT_FLAG_BTC: Byte transfer complete flag + * @arg I2C_INT_FLAG_ADDR: Address sent flag (Master mode) + * @arg I2C_INT_FLAG_START: Start bit flag (Master mode) + * + * @retval Status: flag SET or RESET + */ +uint8_t I2C_ReadIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag) +{ + uint32_t enablestatus = 0; + + enablestatus = ((flag & 0x07000000) >> 16) & (i2c->CTRL2); + flag &= 0x00FFFFFF; + if (((i2c->STS1 & flag) != RESET) && enablestatus) + { + return SET; + } + return RESET; +} + +/*! + * @brief Clears the I2C interrupt flag bits. + * + * @param i2c: I2C selet 1 or 2 + * + * @param flag: specify the I2C flag + * The parameter can be any combination of the following values: + * @arg I2C_INT_FLAG_SMBALT: SMBus Alert flag + * @arg I2C_INT_FLAG_TTE: Timeout or Tlow error flag + * @arg I2C_INT_FLAG_PECE: PEC error in reception flag + * @arg I2C_INT_FLAG_OVRUR: Overrun/Underrun flag (Slave mode) + * @arg I2C_INT_FLAG_AE: Acknowledge error flag + * @arg I2C_INT_FLAG_AL: Arbitration lost flag (Master mode) + * @arg I2C_INT_FLAG_BERR: Bus error flag + * + * @retval None + * + * @note 1)I2C_INT_FLAG_STOP: Stop detection flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) + * followed by a write operation to I2C_CRTL1 register (I2C_Enable()). + * 2)I2C_INT_FLAG_ADDR10: 10-bit header sent flag is cleared by software sequence: + * a read operation to I2C_STS1 (I2C_ReadIntFlag()) + * followed by writing the second byte of the address in I2C_DATA register. + * 3)I2C_INT_FLAG_BTC: Byte transfer complete flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) + * followed by a read/write to I2C_DATA register (I2C_TxData()). + * 4)I2C_INT_FLAG_ADDR: Address sent flag is cleared by software sequence: + * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) + * followed by a read operation to I2C_STS2 register ((void)(I2Cx->STS2)). + * 5)I2C_INT_FLAG_START: Start bit flag is cleared software sequence: + * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) + * followed by a write operation to I2C_DATA register (I2C_TxData()). + */ +void I2C_ClearIntFlag(I2C_T* i2c, uint32_t flag) +{ + i2c->STS1 = (uint16_t)~(flag & 0x00FFFFFF); +} + +/**@} end of group I2C_Functions */ +/**@} end of group I2C_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_iwdt.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_iwdt.c new file mode 100644 index 0000000000..87bcdd19a1 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_iwdt.c @@ -0,0 +1,148 @@ +/*! + * @file apm32s10x_iwdt.c + * + * @brief This file provides all the IWDT firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_iwdt.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup IWDT_Driver IWDT Driver + @{ +*/ + +/** @defgroup IWDT_Functions Functions + @{ +*/ + +/*! + * @brief Enable IWDT + * + * @param None + * + * @retval None + */ +void IWDT_Enable(void) +{ + IWDT->KEY = IWDT_KEYWORD_ENABLE; +} + +/*! + * @brief Reload the IWDT counter with value + * + * @param None + * + * @retval None + */ +void IWDT_Refresh(void) +{ + IWDT->KEY = IWDT_KEYWORD_RELOAD; +} + +/*! + * @brief Set IWDT count reload values + * + * @param reload: IWDT count reload values + * + * @retval None + */ +void IWDT_ConfigReload(uint16_t reload) +{ + IWDT->CNTRLD = reload; +} + +/*! + * @brief Enable the IWDT write access + * + * @param None + * + * @retval None + */ +void IWDT_EnableWriteAccess(void) +{ + IWDT->KEY_B.KEY = IWDT_WRITEACCESS_ENABLE; +} + +/*! + * @brief Disable the IWDT write access + * + * @param None + * + * @retval None + */ +void IWDT_DisableWriteAccess(void) +{ + IWDT->KEY_B.KEY = IWDT_WRITEACCESS_DISABLE; +} + +/*! + * @brief Set IWDT frequency divider values + * + * @param div: IWDT frequency divider values + * This parameter can be one of the following values: + * @arg IWDT_DIVIDER_4 : prescaler divider equal to 4 + * @arg IWDT_DIVIDER_8 : prescaler divider equal to 8 + * @arg IWDT_DIVIDER_16 : prescaler divider equal to 16 + * @arg IWDT_DIVIDER_32 : prescaler divider equal to 32 + * @arg IWDT_DIVIDER_64 : prescaler divider equal to 64 + * @arg IWDT_DIVIDER_128: prescaler divider equal to 128 + * @arg IWDT_DIVIDER_256: prescaler divider equal to 256 + * + * @retval None + */ +void IWDT_ConfigDivider(uint8_t div) +{ + IWDT->PSC = div; +} + +/*! + * @brief Read the specified IWDT flag + * + * @param flag: specifies the flag to read + * This parameter can be one of the following values: + * @arg IWDT_FLAG_PSCU : Watchdog Prescaler Factor Update flag + * @arg IWDT_FLAG_CNTU : Watchdog Counter Reload Value Update flag + * + * @retval status of IWDT_FLAG (SET or RESET) + */ +uint8_t IWDT_ReadStatusFlag(uint16_t flag) +{ + uint8_t bitStatus = RESET; + + if ((IWDT->STS & flag) != (uint32_t)RESET) + { + bitStatus = SET; + } + else + { + bitStatus = RESET; + } + return bitStatus; +} + +/**@} end of group IWDT_Functions */ +/**@} end of group IWDT_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_misc.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_misc.c new file mode 100644 index 0000000000..838a36dd09 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_misc.c @@ -0,0 +1,220 @@ +/*! + * @file apm32s10x_misc.c + * + * @brief This file provides all the miscellaneous firmware functions. + * Include NVIC,SystemTick and Power management. + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_misc.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup MISC_Driver MISC Driver + @{ +*/ + +/** @defgroup MISC_Macros Macros + @{ +*/ + +#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) + +/**@} end of group MISC_Macros */ + +/** @defgroup MISC_Functions Functions + @{ +*/ + +/*! + * @brief Configure the priority grouping: pre-emption priority and subpriority. + * + * @param priorityGroup : specify the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITY_GROUP_0 + * @arg NVIC_PRIORITY_GROUP_1 + * @arg NVIC_PRIORITY_GROUP_2 + * @arg NVIC_PRIORITY_GROUP_3 + * @arg NVIC_PRIORITY_GROUP_4 + * + * @retval None + */ +void NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_T priorityGroup) +{ + SCB->AIRCR = AIRCR_VECTKEY_MASK | priorityGroup; +} + +/*! + * @brief Enable NVIC request + * + * @param irq: the NVIC interrupt request, detailed in IRQn_Type + * For the complete APM32 Devices IRQ Channels list,please refer to apm32s10x.h file + * + * @param preemptionPriority: the pre-emption priority needed to set + * + * @param subPriority: the subpriority needed to set + * + * @retval None + */ +void NVIC_EnableIRQRequest(IRQn_Type irq, uint8_t preemptionPriority, uint8_t subPriority) +{ + uint32_t tempPriority, tempPrePri, tempSubPri; + uint32_t priorityGrp; + + /* Get priority group */ + priorityGrp = (SCB->AIRCR) & (uint32_t)0x700U; + + /* get pre-emption priority and subpriority */ + switch (priorityGrp) + { + case NVIC_PRIORITY_GROUP_0: + tempPrePri = 0; + tempSubPri = 4; + break; + + case NVIC_PRIORITY_GROUP_1: + tempPrePri = 1; + tempSubPri = 3; + break; + + case NVIC_PRIORITY_GROUP_2: + tempPrePri = 2; + tempSubPri = 2; + break; + + case NVIC_PRIORITY_GROUP_3: + tempPrePri = 3; + tempSubPri = 1; + break; + + case NVIC_PRIORITY_GROUP_4: + tempPrePri = 4; + tempSubPri = 0; + break; + + default: + NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_0); + tempPrePri = 0; + tempSubPri = 4; + break; + } + + tempPrePri = 4 - tempPrePri; + tempSubPri = 4 - tempSubPri; + tempPriority = preemptionPriority << tempPrePri; + tempPriority |= subPriority & (0x0f >> tempSubPri); + tempPriority <<= 4; + NVIC->IP[irq] = (uint8_t)tempPriority; + + /* enable the selected IRQ */ + NVIC->ISER[irq >> 0x05U] = (uint32_t)0x01U << (irq & (uint8_t)0x1FU); +} + +/*! + * @brief Disable NVIC request + * + * @param irq: the NVIC interrupt request, detailed in IRQn_Type + * + * @retval None + */ +void NVIC_DisableIRQRequest(IRQn_Type irq) +{ + /* disable the selected IRQ.*/ + NVIC->ICER[irq >> 0x05U] = (uint32_t)0x01U << (irq & (uint8_t)0x1FU); +} + +/*! + * @brief Configure the vector table location and Offset. + * + * @param vectTab: specify whether the vector table is in RAM or FLASH memory + * This parameter can be one of the following values: + * @arg NVIC_VECT_TAB_RAM + * @arg NVIC_VECT_TAB_FLASH + * + * @param Offset Vector Table base offset field. This value must be a multiple of 0x200 + * + * @retval None + */ +void NVIC_ConfigVectorTable(NVIC_VECT_TAB_T vectTab, uint32_t offset) +{ + SCB->VTOR = vectTab | (offset & (uint32_t)0x1FFFFF80); +} + +/*! + * @brief Set the state of the low power mode + * + * @param lowPowerMode: the low power mode state + * This parameter can be one of the following values: + * @arg NVIC_LOWPOWER_SEVONPEND + * @arg NVIC_LOWPOWER_SLEEPDEEP + * @arg NVIC_LOWPOWER_SLEEPONEXIT + * + * @retval None + */ +void NVIC_SetSystemLowPower(NVIC_LOWPOWER_T lowPowerMode) +{ + SCB->SCR |= lowPowerMode; +} + +/*! + * @brief Reset the state of the low power mode + * + * @param lowPowerMode: the low power mode state + * This parameter can be one of the following values: + * @arg NVIC_LOWPOWER_SEVONPEND + * @arg NVIC_LOWPOWER_SLEEPDEEP + * @arg NVIC_LOWPOWER_SLEEPONEXIT + * + * @retval None + */ +void NVIC_ResetystemLowPower(NVIC_LOWPOWER_T lowPowerMode) +{ + SCB->SCR &= (uint32_t)(~(uint32_t)lowPowerMode); +} + +/*! + * @brief Configure the SysTick clock source + * + * @param clkSource: specify the SysTick clock source + * This parameter can be one of the following values: + * @arg SYSTICK_CLK_SOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SYSTICK_CLK_SOURCE_HCLK: AHB clock selected as SysTick clock source. + * + * @retval None + */ +void SysTick_ConfigCLKSource(SYSTICK_CLK_SOURCE_T clkSource) +{ + if (clkSource == SYSTICK_CLK_SOURCE_HCLK) + { + SysTick->CTRL |= (uint32_t)BIT2; + } + else + { + SysTick->CTRL &= (uint32_t)(~BIT2); + } +} + +/**@} end of group MISC_Functions */ +/**@} end of group MISC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_pmu.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_pmu.c new file mode 100644 index 0000000000..1e24a48d2f --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_pmu.c @@ -0,0 +1,268 @@ +/*! + * @file apm32s10x_pmu.c + * + * @brief This file provides all the PMU firmware functions. + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_pmu.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup PMU_Driver PMU Driver + @{ +*/ + +/** @defgroup PMU_Functions Functions + @{ +*/ + +/*! + * @brief Reset the PMU peripheral register. + * + * @param None + * + * @retval None + */ +void PMU_Reset(void) +{ + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_PMU); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_PMU); +} + +/*! + * @brief Enable access to the RTC and backup registers. + * + * @param None + * + * @retval None + */ +void PMU_EnableBackupAccess(void) +{ + PMU->CTRL_B.BPWEN = ENABLE ; +} + +/*! + * @brief Disable access to the RTC and backup registers. + * + * @param None + * + * @retval None + */ +void PMU_DisableBackupAccess(void) +{ + PMU->CTRL_B.BPWEN = DISABLE; +} + +/*! + * @brief Enable the Power Voltage Detector(PVD). + * + * @param None + * + * @retval None + */ +void PMU_EnablePVD(void) +{ + PMU->CTRL_B.PVDEN = ENABLE; +} + +/*! + * @brief Disable the Power Voltage Detector(PVD). + * + * @param None + * + * @retval None + */ +void PMU_DisablePVD(void) +{ + PMU->CTRL_B.PVDEN = DISABLE; +} + +/*! + * @brief Configure a voltage threshold detected by a power supply voltage detector (PVD). + * + * @param levelspecifies the PVD detection level + * This parameter can be one of the following values: + * @arg PMU_PVD_LEVEL_2V2 : Config PVD detection level to 2.2V + * @arg PMU_PVD_LEVEL_2V3 : Config PVD detection level to 2.3V + * @arg PMU_PVD_LEVEL_2V4 : Config PVD detection level to 2.4V + * @arg PMU_PVD_LEVEL_2V5 : Config PVD detection level to 2.5V + * @arg PMU_PVD_LEVEL_2V6 : Config PVD detection level to 2.6V + * @arg PMU_PVD_LEVEL_2V7 : Config PVD detection level to 2.7V + * @arg PMU_PVD_LEVEL_2V8 : Config PVD detection level to 2.8V + * @arg PMU_PVD_LEVEL_2V9 : Config PVD detection level to 2.9V + * + * @retval None + */ +void PMU_ConfigPVDLevel(PMU_PVD_LEVEL_T level) +{ + /* Clear PLS[7:5] bits */ + PMU->CTRL_B.PLSEL = 0x0000; + /* Store the new value */ + PMU->CTRL_B.PLSEL = level; +} + +/*! + * @brief Enable the WakeUp Pin functionality. + * + * @param None + * + * @retval None + */ +void PMU_EnableWakeUpPin(void) +{ + PMU->CSTS_B.WKUPCFG = ENABLE ; +} + +/*! + * @brief Disable the WakeUp Pin functionality. + * + * @param None + * + * @retval None + */ +void PMU_DisableWakeUpPin(void) +{ + PMU->CSTS_B.WKUPCFG = DISABLE ; +} + +/*! + * @brief Enter STOP mode. + * + * @param regulator: specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PMU_REGULATOR_ON : STOP mode with regulator ON + * @arg PMU_REGULATOR_LOWPOWER: STOP mode with regulator in low power mode + * + * @param entry: specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PMU_STOP_ENTRY_WFI: Enter STOP mode with WFI instruction + * @arg PMU_STOP_ENTRY_WFE: Enter STOP mode with WFE instruction + * + * @retval None + */ +void PMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry) +{ + /* Clear PDDSCFG and LPDSCFG bits */ + PMU->CTRL_B.PDDSCFG = 0x00; + PMU->CTRL_B.LPDSCFG = 0x00; + /* Set LPDSCFG bit according to regulator value */ + PMU->CTRL_B.LPDSCFG = regulator; + /* Set Cortex System Control Register */ + SCB->SCR |= (uint32_t)0x04; + /* Select STOP mode entry*/ + if (entry == PMU_STOP_ENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } + + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)0x04); +} + +/*! + * @brief Enter STANDBY mode. + * + * @param None + * + * @retval None + */ +void PMU_EnterSTANDBYMode(void) +{ + /* Clear Wake-up flag */ + PMU->CTRL_B.WUFLGCLR = BIT_SET; + /* Select STANDBY mode */ + PMU->CTRL_B.PDDSCFG = BIT_SET; + /* Set Cortex System Control Register */ + SCB->SCR |= (uint32_t)0x04; +#if defined ( __CC_ARM ) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); + +} + +/*! + * @brief Read the specified PWR flag is set or not. + * + * @param flagReads the status of specifies the flag. + * This parameter can be one of the following values: + * @arg PMU_FLAG_WUE : Wake Up flag + * @arg PMU_FLAG_SB : StandBy flag + * @arg PMU_FLAG_PVDO: PVD Output flag + * + * @retval The new state of PMU_FLAG (SET or RESET). + */ +uint8_t PMU_ReadStatusFlag(PMU_FLAG_T flag) +{ + uint8_t BitStatus = BIT_RESET; + + if (flag == PMU_FLAG_WUE) + { + BitStatus = PMU->CSTS_B.WUEFLG; + } + else if (flag == PMU_FLAG_SB) + { + BitStatus = PMU->CSTS_B.SBFLG; + } + else if (flag == PMU_FLAG_PVDO) + { + BitStatus = PMU->CSTS_B.PVDOFLG; + } + return BitStatus; +} + +/*! + * @brief Clears the PWR's pending flags. + * + * @param flagClears the status of specifies the flag. + * This parameter can be one of the following values: + * @arg PMU_FLAG_WUE : Wake Up flag + * @arg PMU_FLAG_SB : StandBy flag + * + * @retval None + */ +void PMU_ClearStatusFlag(PMU_FLAG_T flag) +{ + if (flag == PMU_FLAG_WUE) + { + PMU->CTRL_B.WUFLGCLR = BIT_SET; + } + else if (flag == PMU_FLAG_SB) + { + PMU->CTRL_B.SBFLGCLR = BIT_SET; + } +} + +/**@} end of group PMU_Functions */ +/**@} end of group PMU_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_qspi.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_qspi.c new file mode 100644 index 0000000000..23634f47ba --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_qspi.c @@ -0,0 +1,608 @@ +/*! + * @file qpm32f10x_qspi.c + * + * @brief This file contains all the functions for the QSPI peripheral + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_qspi.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup QSPI_Driver QSPI Driver + @{ +*/ + +/** @defgroup QSPI_Functions Functions + @{ +*/ + +/*! + * @brief Reset QSPI peripheral registers to their default values + * + * @param None + * + * @retval None + */ +void QSPI_Reset(void) +{ + volatile uint32_t dummy = 0; + + QSPI->IOSW = QSPI_IOSW_RESET_VALUE; + QSPI->SSIEN = QSPI_SSIEN_RESET_VALUE; + QSPI->INTEN = QSPI_INTEN_RESET_VALUE; + dummy = QSPI->ICF; + QSPI->CTRL1 = QSPI_CTRL1_RESET_VALUE; + QSPI->CTRL2 = QSPI_CTRL2_RESET_VALUE; + QSPI->CTRL3 = QSPI_CTRL3_RESET_VALUE; + QSPI->SLAEN = QSPI_SLAEN_RESET_VALUE; + QSPI->BR = QSPI_BR_RESET_VALUE; + QSPI->TFL = QSPI_TFL_RESET_VALUE; + QSPI->RFL = QSPI_RFL_RESET_VALUE; + QSPI->TFTL = QSPI_TFTL_RESET_VALUE; + QSPI->RFTL = QSPI_RFTL_RESET_VALUE; + QSPI->STS = QSPI_STS_RESET_VALUE; + QSPI->RSD = QSPI_RSD_RESET_VALUE; +} + +/*! + * @brief Configure the QSPI peripheral according to the specified parameters in the qspiConfig + * + * @param qspiConfig: Pointer to a QSPI_Config_T structure that contains the configuration information + * + * @retval None + */ +void QSPI_Config(QSPI_Config_T* qspiConfig) +{ + QSPI->CTRL1_B.CPHA = qspiConfig->clockPhase; + QSPI->CTRL1_B.CPOL = qspiConfig->clockPolarity; + QSPI->CTRL1_B.FRF = qspiConfig->frameFormat; + QSPI->CTRL1_B.DFS = qspiConfig->dataFrameSize;; + QSPI->CTRL1_B.SSTEN = qspiConfig->selectSlaveToggle; + + QSPI->BR = qspiConfig->clockDiv; +} + +/*! + * @brief Fill each qspiConfig member with its default value + * + * @param qspiConfig: Pointer to a QSPI_Config_T structure which will be initialized + * + * @retval None + */ +void QSPI_ConfigStructInit(QSPI_Config_T* qspiConfig) +{ + qspiConfig->clockPhase = QSPI_CLKPHA_2EDGE; + qspiConfig->clockPolarity = QSPI_CLKPOL_LOW; + qspiConfig->clockDiv = 0; + + qspiConfig->frameFormat = QSPI_FRF_STANDARD; + qspiConfig->dataFrameSize = QSPI_DFS_8BIT; + qspiConfig->selectSlaveToggle = QSPI_SST_DISABLE; +} + +/*! + * @brief Configure frame number + * + * @param num: Configs a 16bit frame number + * + * @retval None + */ +void QSPI_ConfigFrameNum(uint16_t num) +{ + QSPI->CTRL2_B.NDF = num; +} + +/*! + * @brief Configure data frame size + * + * @param dfs: Specifies the data frame size + * The parameter can be one of following values: + * @arg QSPI_DFS_4BIT : Specifies data frame size to 4bit + * @arg QSPI_DFS_5BIT : Specifies data frame size to 5bit + * @arg QSPI_DFS_6BIT : Specifies data frame size to 6bit + * @arg QSPI_DFS_7BIT : Specifies data frame size to 7bit + * @arg QSPI_DFS_8BIT : Specifies data frame size to 8bit + * @arg QSPI_DFS_9BIT : Specifies data frame size to 9bit + * @arg QSPI_DFS_10BIT : Specifies data frame size to 10bit + * @arg QSPI_DFS_11BIT : Specifies data frame size to 11bit + * @arg QSPI_DFS_12BIT : Specifies data frame size to 12bit + * @arg QSPI_DFS_13BIT : Specifies data frame size to 13bit + * @arg QSPI_DFS_14BIT : Specifies data frame size to 14bit + * @arg QSPI_DFS_15BIT : Specifies data frame size to 15bit + * @arg QSPI_DFS_16BIT : Specifies data frame size to 16bit + * @arg QSPI_DFS_17BIT : Specifies data frame size to 17bit + * @arg QSPI_DFS_18BIT : Specifies data frame size to 18bit + * @arg QSPI_DFS_19BIT : Specifies data frame size to 19bit + * @arg QSPI_DFS_20BIT : Specifies data frame size to 20bit + * @arg QSPI_DFS_21BIT : Specifies data frame size to 21bit + * @arg QSPI_DFS_22BIT : Specifies data frame size to 22bit + * @arg QSPI_DFS_23BIT : Specifies data frame size to 23bit + * @arg QSPI_DFS_24BIT : Specifies data frame size to 24bit + * @arg QSPI_DFS_25BIT : Specifies data frame size to 25bit + * @arg QSPI_DFS_26BIT : Specifies data frame size to 26bit + * @arg QSPI_DFS_27BIT : Specifies data frame size to 27bit + * @arg QSPI_DFS_28BIT : Specifies data frame size to 28bit + * @arg QSPI_DFS_29BIT : Specifies data frame size to 29bit + * @arg QSPI_DFS_30BIT : Specifies data frame size to 30bit + * @arg QSPI_DFS_31BIT : Specifies data frame size to 31bit + * @arg QSPI_DFS_32BIT : Specifies data frame size to 32bit + * + * @retval None + */ +void QSPI_ConfigDataFrameSize(QSPI_DFS_T dfs) +{ + QSPI->CTRL1_B.DFS = dfs; +} + +/*! + * @brief Configure frame format + * + * @param frameFormat + * + * @retval None + */ +void QSPI_ConfigFrameFormat(QSPI_FRF_T frameFormat) +{ + QSPI->CTRL1_B.FRF = frameFormat; +} + +/*! + * @brief Enable QSPI + * + * @param None + * + * @retval None + */ +void QSPI_Enable(void) +{ + QSPI->SSIEN_B.EN = BIT_SET; +} + +/*! + * @brief Disable QSPI + * + * @param None + * + * @retval None + */ +void QSPI_Disable(void) +{ + QSPI->SSIEN_B.EN = BIT_RESET; +} + +/*! + * @brief Read Tx FIFO number of data + * + * @param None + * + * @retval None + */ +uint8_t QSPI_ReadTxFifoDataNum(void) +{ + return (uint8_t)QSPI->TFL_B.TFL; +} + +/*! + * @brief Read Rx FIFO number of data + * + * @param None + * + * @retval Returns Rx FIFO number of data + */ +uint8_t QSPI_ReadRxFifoDataNum(void) +{ + return (uint8_t)QSPI->RFL_B.RFL; +} + +/*! + * @brief Configure rx FIFO threshold + * + * @param threshold: Speicifes rx FIFO threshold with a 3bit value + * + * @retval None + */ +void QSPI_ConfigRxFifoThreshold(uint8_t threshold) +{ + QSPI->RFTL_B.RFT = threshold; +} + +/*! + * @brief Congfigure Tx FIFO threshold + * + * @param threshold: Speicifes Tx FIFO threshold with a 3bit value + * + * @retval None + */ +void QSPI_ConfigTxFifoThreshold(uint8_t threshold) +{ + QSPI->TFTL_B.TFTH = threshold; +} + +/*! + * @brief Congfigure Tx FIFO empty threshold + * + * @param threshold: Speicifes Tx FIFO empty threshold with a 3bit value + * + * @retval None + */ +void QSPI_ConfigTxFifoEmptyThreshold(uint8_t threshold) +{ + QSPI->TFTL_B.TFT = threshold; +} + +/*! + * @brief Configure RX sample edge + * + * @param rse: Specifies the sample edge + * The parameter can be one of following values: + * @arg QSPI_RSE_RISING : rising edge sample + * @arg QSPI_RSE_FALLING: falling edge sample + * + * @retval None + */ +void QSPI_ConfigRxSampleEdge(QSPI_RSE_T rse) +{ + QSPI->RSD_B.RSE = rse; +} + +/*! + * @brief Set RX sample delay + * + * @param delay: Specifies the sample delay with a 8-bit value + * + * @retval None + */ +void QSPI_ConfigRxSampleDelay(uint8_t delay) +{ + QSPI->RSD_B.RSD = delay; +} + +/*! + * @brief Clock stretch enable + * + * @param None + * + * @retval None + */ +void QSPI_EnableClockStretch(void) +{ + QSPI->CTRL3_B.CSEN = BIT_SET; +} + +/*! + * @brief Clock stretch disable + * + * @param None + * + * @retval None + */ +void QSPI_DisableClockStretch(void) +{ + QSPI->CTRL3_B.CSEN = BIT_RESET; +} + +/*! + * @brief Configure instruction length + * + * @param len: Specifies the length of instruction + * The parameter can be one of following values: + * @arg QSPI_INST_LEN_0 : no instruction + * @arg QSPI_INST_LEN_4BIT : 4-bit instruction + * @arg QSPI_INST_LEN_8BIT : 8-bit instruction + * @arg QSPI_INST_LEN_16BIT : 16-bit instruction + * + * @retval None + */ +void QSPI_ConfigInstLen(QSPI_INST_LEN_T len) +{ + QSPI->CTRL3_B.INSLEN = len; +} + +/*! + * @brief Configure address length + * + * @param len: Specifies the address length + * The parameter can be one of following values: + * @arg QSPI_ADDR_LEN_0 : no address + * @arg QSPI_ADDR_LEN_4BIT : 4-bit address length + * @arg QSPI_ADDR_LEN_8BIT, : 8-bit address length + * @arg QSPI_ADDR_LEN_12BIT : 12-bit address length + * @arg QSPI_ADDR_LEN_16BIT : 16-bit address length + * @arg QSPI_ADDR_LEN_20BIT : 20-bit address length + * @arg QSPI_ADDR_LEN_24BIT : 24-bit address length + * @arg QSPI_ADDR_LEN_28BIT : 28-bit address length + * @arg QSPI_ADDR_LEN_32BIT : 32-bit address length + * @arg QSPI_ADDR_LEN_36BIT : 36-bit address length + * @arg QSPI_ADDR_LEN_40BIT : 40-bit address length + * @arg QSPI_ADDR_LEN_44BIT : 44-bit address length + * @arg QSPI_ADDR_LEN_48BIT : 48-bit address length + * @arg QSPI_ADDR_LEN_52BIT : 52-bit address length + * @arg QSPI_ADDR_LEN_56BIT : 56-bit address length + * @arg QSPI_ADDR_LEN_60BIT : 60-bit address length + * + * @retval None + */ +void QSPI_ConfigAddrLen(QSPI_ADDR_LEN_T len) +{ + QSPI->CTRL3_B.ADDRLEN = len; +} + +/*! + * @brief Configure instruction and address type + * + * @param type: Specifies the instruction and address type + * The parameter can be one of following values: + * @arg QSPI_INST_ADDR_TYPE_STANDARD : Tx instruction in standard SPI mode, + * Tx address in standard SPI mode + * @arg QSPI_INST_TYPE_STANDARD : Tx instruction in standard SPI mode, + * Tx address in mode of SPI_FRF + * @arg QSPI_INST_ADDR_TYPE_FRF : Tx instruction in mode of SPI_FRF, + * Tx address in mode of SPI_FRF + * + * @retval None + */ +void QSPI_ConfigInstAddrType(QSPI_INST_ADDR_TYPE_T type) +{ + QSPI->CTRL3_B.IAT = type; +} + +/*! + * @brief Configure wait cycle number + * + * @param cycle: Specifies the wait cycle number with a 5-bit value + * + * @retval None + */ +void QSPI_ConfigWaitCycle(uint8_t cycle) +{ + QSPI->CTRL3_B.WAITCYC = cycle; +} + +/*! + * @brief Open QSPI GPIO + * + * @param None + * + * @retval None + */ +void QSPI_OpenIO(void) +{ + QSPI->IOSW_B.IOSW = BIT_SET; +} + +/*! + * @brief Close QSPI GPIO + * + * @param None + * + * @retval None + */ +void QSPI_CloseIO(void) +{ + QSPI->IOSW_B.IOSW = BIT_RESET; +} + +/*! + * @brief Set transmission mode + * + * @param mode: Specifies the transmission mode + * The parameter can be one of following values: + * @arg QSPI_TRANS_MODE_TX_RX : TX and RX mode + * @arg QSPI_TRANS_MODE_TX : TX mode only + * @arg QSPI_TRANS_MODE_RX : RX mode only + * @arg QSPI_TRANS_MODE_EEPROM_READ : EEPROM read mode + * + * @retval None + */ +void QSPI_ConfigTansMode(QSPI_TRANS_MODE_T mode) +{ + QSPI->CTRL1_B.TXMODE = mode; +} + +/*! + * @brief Transmit data + * + * @param data: Data to be transmited + * + * @retval None + */ +void QSPI_TxData(uint32_t data) +{ + QSPI->DATA = data; +} + +/*! + * @brief Return the most recent received data + * + * @param None + * + * @retval The received data + */ +uint32_t QSPI_RxData(void) +{ + return (uint32_t)QSPI->DATA; +} + +/*! + * @brief Enable Slave + * + * @param None + * + * @retval None + */ +void QSPI_EnableSlave(void) +{ + QSPI->SLAEN_B.SLAEN = BIT_SET; +} + +/*! + * @brief Disable slave + * + * @param None + * + * @retval None + */ +void QSPI_DisableSlave(void) +{ + QSPI->SLAEN_B.SLAEN = BIT_RESET; +} + +/*! + * @brief Enable the specified QSPI interrupts + * + * @param interrupt: Specifies the QSPI interrupt sources + * The parameter can be combination of following values: + * @arg QSPI_INT_TFE: TX FIFO empty interrupt + * @arg QSPI_INT_TFO: TX FIFO overflow interrupt + * @arg QSPI_INT_RFU: RX FIFO underflow interrupt + * @arg QSPI_INT_RFO: RX FIFO overflow interrupt + * @arg QSPI_INT_RFF: RX FIFO full interrupt + * @arg QSPI_INT_MST: Master interrupt + * + * @retval None + */ +void QSPI_EnableInterrupt(uint32_t interrupt) +{ + QSPI->INTEN |= interrupt; +} + +/*! + * @brief Disable the specified QSPI interrupts + * + * @param interrupt: Specifies the QSPI interrupt sources + * The parameter can be combination of following values: + * @arg QSPI_INT_TFE: TX FIFO empty interrupt + * @arg QSPI_INT_TFO: TX FIFO overflow interrupt + * @arg QSPI_INT_RFU: RX FIFO underflow interrupt + * @arg QSPI_INT_RFO: RX FIFO overflow interrupt + * @arg QSPI_INT_RFF: RX FIFO full interrupt + * @arg QSPI_INT_MST: Master interrupt + * + * @retval None + */ +void QSPI_DisableInterrupt(uint32_t interrupt) +{ + QSPI->INTEN &= (uint32_t)~interrupt; +} + +/*! + * @brief Read specified QSPI flag + * + * @param flag: Specifies the flag to be checked + * The parameter can be one of following values: + * @arg QSPI_FLAG_BUSY: Busy flag + * @arg QSPI_FLAG_TFNF: TX FIFO not full flag + * @arg QSPI_FLAG_TFE: TX FIFO empty flag + * @arg QSPI_FLAG_RFNE: RX FIFO not empty flag + * @arg QSPI_FLAG_RFF: RX FIFO full flag + * @arg QSPI_FLAG_DCE: Data collision error + * + * @retval The new state of flag (SET or RESET) + */ +uint8_t QSPI_ReadStatusFlag(QSPI_FLAG_T flag) +{ + uint8_t ret = RESET; + + ret = QSPI->STS & flag ? SET : RESET; + + return ret; +} + +/*! + * @brief Clear specified QSPI flag + * + * @param None + * + * @retval None + * + * @note This funtion only clear Data collision error flag(QSPI_FLAG_DCE) + */ +void QSPI_ClearStatusFlag(void) +{ + volatile uint32_t dummy = 0; + + dummy = QSPI->STS; +} + +/*! + * @brief Read specified QSPI interrupt flag + * + * @param flag: Specifies the interrupt flag to be checked + * The parameter can be one of following values: + * @arg QSPI_INT_FLAG_TFE: TX FIFO empty interrupt flag + * @arg QSPI_INT_FLAG_TFO: TX FIFO overflow interrupt flag + * @arg QSPI_INT_FLAG_RFU: RX FIFO underflow interrupt flag + * @arg QSPI_INT_FLAG_RFO: RX FIFO overflow interrupt flag + * @arg QSPI_INT_FLAG_RFF: RX FIFO full interrupt flag + * @arg QSPI_INT_FLAG_MST: Master interrupt flag + * + * @retval The new state of flag (SET or RESET) + */ +uint8_t QSPI_ReadIntFlag(QSPI_INT_FLAG_T flag) +{ + uint8_t ret = RESET; + + ret = QSPI->ISTS & flag ? SET : RESET; + + return ret; +} + +/*! + * @brief Clear specified QSPI interrupt flag + * + * @param flag: Specifies the interrupt flag to be checked + * The parameter can be one of following values: + * @arg QSPI_INT_FLAG_TFO: TX FIFO overflow interrupt flag + * @arg QSPI_INT_FLAG_RFU: RX FIFO underflow interrupt flag + * @arg QSPI_INT_FLAG_RFO: RX FIFO overflow interrupt flag + * @arg QSPI_INT_FLAG_MST: Master interrupt flag + * + * @retval None + */ +void QSPI_ClearIntFlag(uint32_t flag) +{ + volatile uint32_t dummy = 0; + + if (flag & QSPI_INT_FLAG_TFO) + { + dummy = QSPI->TFOIC; + } + else if (flag & QSPI_INT_FLAG_RFO) + { + dummy = QSPI->RFOIC; + } + else if (flag & QSPI_INT_FLAG_RFU) + { + dummy = QSPI->RFUIC; + } + else if (flag & QSPI_INT_FLAG_MST) + { + dummy = QSPI->MIC; + } +} + +/**@} end of group QSPI_Functions */ +/**@} end of group QSPI_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_rcm.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_rcm.c new file mode 100644 index 0000000000..a7821c9e54 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_rcm.c @@ -0,0 +1,1027 @@ +/*! + * @file apm32s10x_rcm.c + * + * @brief This file provides all the RCM firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup RCM_Driver RCM Driver + @{ +*/ + +/** @defgroup RCM_Functions Functions + @{ +*/ + +/*! + * @brief Reset the clock configuration to the default state + * + * @param None + * + * @retval None + */ +void RCM_Reset(void) +{ + /* Open HSI clock */ + RCM->CTRL_B.HSIEN = BIT_SET; + /* Config HSI to system clock and Reset AHBPSC, APB1PSC, APB2PSC, ADCPSC and MCOSEL bits */ + RCM->CFG &= (uint32_t)0xF8FF0000; + /* Reset HSEEN, CSSEN and PLLEN bits */ + RCM->CTRL &= (uint32_t)0xFEF6FFFF; + /* Reset HSEBCFG bit */ + RCM->CTRL_B.HSEBCFG = BIT_RESET; + /* Reset PLLSRCSEL, PLLHSEPSC, PLLMULCFG and USBDIV bits */ + RCM->CFG &= (uint32_t)0xFF00FFFF; + /* Disable all interrupts and clear pending bits */ + RCM->INT = 0x009F0000; +} + +/*! + * @brief Configure the HSE oscillator + * + * @param state: state of the HSE + * This parameter can be one of the following values: + * @arg RCM_HSE_CLOSE: Turn off the HSE oscillator + * @arg RCM_HSE_OPEN: Turn on the HSE oscillator + * @arg RCM_HSE_BYPASS: HSE oscillator bypassed with external clock + * + * @retval None + * + * @note When HSE is not used directly or through the PLL as system clock, it can be stopped. + */ +void RCM_ConfigHSE(RCM_HSE_T state) +{ + /* Reset HSEEN bit */ + RCM->CTRL_B.HSEEN = BIT_RESET; + + /* Reset HSEBCFG bit */ + RCM->CTRL_B.HSEBCFG = BIT_RESET; + + if (state == RCM_HSE_OPEN) + { + RCM->CTRL_B.HSEEN = BIT_SET; + } + else if (state == RCM_HSE_BYPASS) + { + RCM->CTRL_B.HSEBCFG = BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; + } +} + +/*! + * @brief Wait for HSE to be ready + * + * @param None + * + * @retval SUCCESS: HSE oscillator is ready + * ERROR : HSE oscillator is not ready + */ +uint8_t RCM_WaitHSEReady(void) +{ + __IO uint32_t cnt; + + for (cnt = 0; cnt < HSE_STARTUP_TIMEOUT; cnt++) + { + if (RCM->CTRL_B.HSERDYFLG == BIT_SET) + { + return SUCCESS; + } + } + + return ERROR; +} + +/*! + * @brief Configure HSI trimming value + * + * @param HSITrim: HSI trimming value + * This parameter must be a number between 0 and 0x1F. + * + * @retval None + */ +void RCM_ConfigHSITrim(uint8_t HSITrim) +{ + RCM->CTRL_B.HSITRIM = HSITrim; +} + +/*! + * @brief Enable the HSI + * + * @param None + * + * @retval None + */ +void RCM_EnableHSI(void) +{ + RCM->CTRL_B.HSIEN = BIT_SET; +} + +/*! + * @brief Disable the HSI + * + * @param None + * + * @retval None + * + * @note When HSI is not used directly or through the PLL as system clock, it can be stopped. + */ + +void RCM_DisableHSI(void) +{ + RCM->CTRL_B.HSIEN = BIT_RESET; +} + +/*! + * @brief Configure the External Low Speed oscillator (LSE) + * + * @param state : Specify the new state of the LSE + * This parameter can be one of the following values: + * @arg RCM_LSE_CLOSE : Close the LSE + * @arg RCM_LSE_OPEN : Open the LSE + * @arg RCM_LSE_BYPASS : LSE bypass + * + * @retval None + */ +void RCM_ConfigLSE(RCM_LSE_T state) +{ + RCM->BDCTRL_B.LSEEN = BIT_RESET; + RCM->BDCTRL_B.LSEBCFG = BIT_RESET; + + if (state == RCM_LSE_OPEN) + { + RCM->BDCTRL_B.LSEEN = BIT_SET; + } + else if (state == RCM_LSE_BYPASS) + { + RCM->BDCTRL_B.LSEBCFG = BIT_SET; + RCM->BDCTRL_B.LSEEN = BIT_SET; + } +} + +/*! + * @brief Enable the Internal Low Speed oscillator (LSI) + * + * @param None + * + * @retval None + */ +void RCM_EnableLSI(void) +{ + RCM->CSTS_B.LSIEN = BIT_SET; +} + +/*! + * @brief Disable the Internal Low Speed oscillator (LSI) + * + * @param None + * + * @retval None + */ +void RCM_DisableLSI(void) +{ + RCM->CSTS_B.LSIEN = BIT_RESET; +} + +/*! + * @brief Configure the PLL clock source and multiplication factor + * + * @param pllSelect : PLL entry clock source select + * This parameter can be one of the following values: + * @arg RCM_PLLSEL_HSI_DIV_2: HSI clock divided by 2 selected as PLL clock source + * @arg RCM_PLLSEL_HSE: HSE clock selected as PLL clock source + * @arg RCM_PLLSEL_HSE_DIV2: HSE clock divided by 2 selected as PLL clock source + * + * @param pllMf : PLL multiplication factor + * This parameter can be RCM_PLLMF_x where x can be a value from 2 to 16. + * + * @retval None + * + * @note PLL should be disabled while use this function. + */ +void RCM_ConfigPLL(RCM_PLLSEL_T pllSelect, RCM_PLLMF_T pllMf) +{ + RCM->CFG_B.PLLMULCFG = pllMf; + RCM->CFG_B.PLLSRCSEL = pllSelect & 0x01; + RCM->CFG_B.PLLHSEPSC = (pllSelect >> 1) & 0x01; +} + +/*! + * @brief Enable the PLL + * + * @param None + * + * @retval None + */ +void RCM_EnablePLL(void) +{ + RCM->CTRL_B.PLLEN = BIT_SET; +} + +/*! +* @brief Disable the PLL +* +* @param None +* +* @retval None +* +* @note When PLL is not used as system clock, it can be stopped. +*/ +void RCM_DisablePLL(void) +{ + RCM->CTRL_B.PLLEN = BIT_RESET; +} + +/*! + * @brief Enable the Clock Security System + * + * @param None + * + * @retval None + */ +void RCM_EnableCSS(void) +{ + RCM->CTRL_B.CSSEN = BIT_SET; +} + +/*! + * @brief Disable the Clock Security System + * + * @param None + * + * @retval None + */ +void RCM_DisableCSS(void) +{ + RCM->CTRL_B.CSSEN = BIT_RESET; +} + +/*! + * @brief Select the MCO pin clock ouput source + * + * @param mcoClock: specify the clock source to output + * This parameter can be one of the following values: + * @arg RCM_MCOCLK_NO_CLOCK : No clock selected. + * @arg RCM_MCOCLK_SYSCLK : System clock selected. + * @arg RCM_MCOCLK_HSI : HSI oscillator clock selected. + * @arg RCM_MCOCLK_HSE : HSE oscillator clock selected. + * @arg RCM_MCOCLK_PLLCLK_DIV_2 : PLL clock divided by 2 selected. + * + * @retval None + */ +void RCM_ConfigMCO(RCM_MCOCLK_T mcoClock) +{ + RCM->CFG_B.MCOSEL = mcoClock; +} + +/*! + * @brief Configure the system clock source + * + * @param sysClkSelect: specify the clock source used as system clock + * This parameter can be one of the following values: + * @arg RCM_SYSCLK_SEL_HSI: HSI is selected as system clock source + * @arg RCM_SYSCLK_SEL_HSE: HSE is selected as system clock source + * @arg RCM_SYSCLK_SEL_PLL: PLL is selected as system clock source + * + * @retva None + */ +void RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_T sysClkSelect) +{ + RCM->CFG_B.SCLKSEL = sysClkSelect; +} + +/*! + * @brief Return the clock source which is used as system clock + * + * @param None + * + * @retval The clock source used as system clock + */ +RCM_SYSCLK_SEL_T RCM_ReadSYSCLKSource(void) +{ + return (RCM_SYSCLK_SEL_T)RCM->CFG_B.SCLKSELSTS; +} + +/*! + * @brief Configure the AHB clock prescaler. + * + * @param AHBDiv : Specify the AHB clock prescaler from the system clock. + * This parameter can be one of the following values: + * @arg RCM_AHB_DIV_1 : HCLK = SYSCLK + * @arg RCM_AHB_DIV_2 : HCLK = SYSCLK / 2 + * @arg RCM_AHB_DIV_4 : HCLK = SYSCLK / 4 + * @arg RCM_AHB_DIV_8 : HCLK = SYSCLK / 8 + * @arg RCM_AHB_DIV_16 : HCLK = SYSCLK / 16 + * @arg RCM_AHB_DIV_64 : HCLK = SYSCLK / 64 + * @arg RCM_AHB_DIV_128 : HCLK = SYSCLK / 128 + * @arg RCM_AHB_DIV_256 : HCLK = SYSCLK / 256 + * @arg RCM_AHB_DIV_512 : HCLK = SYSCLK / 512 + * + * @retval None + */ +void RCM_ConfigAHB(RCM_AHB_DIV_T AHBDiv) +{ + RCM->CFG_B.AHBPSC = AHBDiv; +} + +/*! + * @brief Configure the APB1 clock prescaler. + * + * @param APB1Div: Specify the APB1 clock prescaler from the AHB clock. + * This parameter can be one of the following values: + * @arg RCM_APB_DIV_1 : PCLK1 = HCLK + * @arg RCM_APB_DIV_2 : PCLK1 = HCLK / 2 + * @arg RCM_APB_DIV_4 : PCLK1 = HCLK / 4 + * @arg RCM_APB_DIV_8 : PCLK1 = HCLK / 8 + * @arg RCM_APB_DIV_16 : PCLK1 = HCLK / 16 + * + * @retval None + */ +void RCM_ConfigAPB1(RCM_APB_DIV_T APB1Div) +{ + RCM->CFG_B.APB1PSC = APB1Div; +} + +/*! + * @brief Configure the APB2 clock prescaler + * + * @param APB2Div: Specify the APB2 clock prescaler from the AHB clock. + * This parameter can be one of the following values: + * @arg RCM_APB_DIV_1 : PCLK2 = HCLK + * @arg RCM_APB_DIV_2 : PCLK2 = HCLK / 2 + * @arg RCM_APB_DIV_4 : PCLK2 = HCLK / 4 + * @arg RCM_APB_DIV_8 : PCLK2 = HCLK / 8 + * @arg RCM_APB_DIV_16 : PCLK2 = HCLK / 16 + * + * @retval None + */ +void RCM_ConfigAPB2(RCM_APB_DIV_T APB2Div) +{ + RCM->CFG_B.APB2PSC = APB2Div; +} + +/*! + * @brief Configure the USB clock prescaler + * + * @param USBDiv: Specify the USB clock prescaler from the PLL clock. + * This parameter can be one of the following values: + * @arg RCM_USB_DIV_1_5 : USBCLK = PLL clock /1.5 + * @arg RCM_USB_DIV_1 : USBCLK = PLL clock + * @arg RCM_USB_DIV_2 : USBCLK = PLL clock / 2 + * + * @retval None + */ +void RCM_ConfigUSBCLK(RCM_USB_DIV_T USBDiv) +{ + RCM->CFG_B.USBDPSC = USBDiv; +} + +/*! + * @brief Configure the FPU clock prescaler + * + * @param FPUDiv: Specify the FPU clock prescaler from the AHB clock. + * This parameter can be one of the following values: + * @arg RCM_FPU_DIV_1 : FPUCLK = HCLK + * @arg RCM_FPU_DIV_2 : FPUCLK = HCLK /2 + * + * @retval None + */ +void RCM_ConfigFPUCLK(RCM_FPU_DIV_T FPUDiv) +{ + RCM->CFG_B.FPUPSC = FPUDiv; +} + +/*! + * @brief Configure the ADC clock prescaler + * + * @param ADCDiv : Specify the ADC clock prescaler from the APB2 clock. + * This parameter can be one of the following values: + * @arg RCM_PCLK2_DIV_2: ADCCLK = PCLK2 / 2 + * @arg RCM_PCLK2_DIV_4: ADCCLK = PCLK2 / 4 + * @arg RCM_PCLK2_DIV_6: ADCCLK = PCLK2 / 6 + * @arg RCM_PCLK2_DIV_8: ADCCLK = PCLK2 / 8 + * + * @retval None + */ +void RCM_ConfigADCCLK(RCM_PCLK2_DIV_T ADCDiv) +{ + RCM->CFG_B.ADCPSC = ADCDiv; +} + +/*! + * @brief Configure the RTC clock source + * + * @param rtcClkSelect : specify the RTC clock source. + * This parameter can be one of the following values: + * @arg RCM_RTCCLK_LSE : RTCCLK = LSE clock + * @arg RCM_RTCCLK_LSI : RTCCLK = LSI clock + * @arg RCM_RTCCLK_HSE_DIV_128: RTCCLK = HSE clock / 128 + * + * @retval None + * + * @note Once the RTC clock is configed it can't be changed unless reset the Backup domain. + */ +void RCM_ConfigRTCCLK(RCM_RTCCLK_T rtcClkSelect) +{ + RCM->BDCTRL_B.RTCSRCSEL = rtcClkSelect; +} + +/*! + * @brief Enable the RTC clock + * + * @param None + * + * @retval None + */ +void RCM_EnableRTCCLK(void) +{ + RCM->BDCTRL_B.RTCCLKEN = BIT_SET; +} + +/*! + * @brief Disable the RTC clock + * + * @param None + * + * @retval None + */ +void RCM_DisableRTCCLK(void) +{ + RCM->BDCTRL_B.RTCCLKEN = BIT_RESET; +} + +/*! + * @brief Reads the frequency of SYSCLK + * + * @param None + * + * @retval Return the frequency of SYSCLK + */ +uint32_t RCM_ReadSYSCLKFreq(void) +{ + uint32_t sysClock, pllMull, pllSource; + + /* get sys clock */ + sysClock = RCM->CFG_B.SCLKSEL; + + switch (sysClock) + { + /* sys clock is HSI */ + case RCM_SYSCLK_SEL_HSI: + sysClock = HSI_VALUE; + break; + + /* sys clock is HSE */ + case RCM_SYSCLK_SEL_HSE: + sysClock = HSE_VALUE; + break; + + /* sys clock is PLL */ + case RCM_SYSCLK_SEL_PLL: + pllMull = RCM->CFG_B.PLLMULCFG + 2; + pllSource = RCM->CFG_B.PLLSRCSEL; + + /* PLL entry clock source is HSE */ + if (pllSource == BIT_SET) + { + sysClock = HSE_VALUE * pllMull; + + /* HSE clock divided by 2 */ + if (pllSource == RCM->CFG_B.PLLHSEPSC) + { + sysClock >>= 1; + } + } + /* PLL entry clock source is HSI/2 */ + else + { + sysClock = (HSI_VALUE >> 1) * pllMull; + } + + break; + + default: + sysClock = HSI_VALUE; + break; + } + + return sysClock; +} + +/*! + * @brief Read the frequency of HCLK(AHB) + * + * @param None + * + * @retval Return the frequency of HCLK + */ +uint32_t RCM_ReadHCLKFreq(void) +{ + uint32_t divider; + uint32_t sysClk, hclk; + uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + + sysClk = RCM_ReadSYSCLKFreq(); + divider = AHBPrescTable[RCM->CFG_B.AHBPSC]; + hclk = sysClk >> divider; + + return hclk; +} + +/*! + * @brief Read the frequency of PCLK1 And PCLK2 + * + * @param PCLK1 : Return the frequency of PCLK1 + * + * @param PCLK1 : Return the frequency of PCLK2 + * + * @retval None + */ +void RCM_ReadPCLKFreq(uint32_t* PCLK1, uint32_t* PCLK2) +{ + uint32_t hclk, divider; + uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + hclk = RCM_ReadHCLKFreq(); + + if (PCLK1) + { + divider = APBPrescTable[RCM->CFG_B.APB1PSC]; + *PCLK1 = hclk >> divider; + } + + if (PCLK2) + { + divider = APBPrescTable[RCM->CFG_B.APB2PSC]; + *PCLK2 = hclk >> divider; + } +} + +/*! + * @brief Read the frequency of ADCCLK + * + * @param None + * + * @retval Return the frequency of ADCCLK + */ +uint32_t RCM_ReadADCCLKFreq(void) +{ + uint32_t adcClk, pclk2, divider; + uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; + + RCM_ReadPCLKFreq(NULL, &pclk2); + + /** Get ADC CLK */ + divider = ADCPrescTable[RCM->CFG_B.ADCPSC]; + adcClk = pclk2 / divider; + + return adcClk; +} + +/*! + * @brief Enables AHB peripheral clock. + * + * @param AHBPeriph : Enable the specified clock of AHB peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_AHB_PERIPH_DMA1 : Enable DMA1 clock + * @arg RCM_AHB_PERIPH_SRAM : Enable SRAM clock + * @arg RCM_AHB_PERIPH_FPU : Enable FPU clock + * @arg RCM_AHB_PERIPH_FMC : Enable FMC clock + * @arg RCM_AHB_PERIPH_QSPI : Enable QSPI clock + * @arg RCM_AHB_PERIPH_CRC : Enable CRC clock + * + * @retval None + */ +void RCM_EnableAHBPeriphClock(uint32_t AHBPeriph) +{ + RCM->AHBCLKEN |= AHBPeriph; +} + +/*! + * @brief Disable AHB peripheral clock. + * + * @param AHBPeriph : Disable the specified clock of AHB peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_AHB_PERIPH_DMA1 : Disable DMA1 clock + * @arg RCM_AHB_PERIPH_SRAM : Disable SRAM clock + * @arg RCM_AHB_PERIPH_FPU : Disable FPU clock + * @arg RCM_AHB_PERIPH_FMC : Disable FMC clock + * @arg RCM_AHB_PERIPH_QSPI : Disable QSPI clock + * @arg RCM_AHB_PERIPH_CRC : Disable CRC clock + * + * @retval None + */ +void RCM_DisableAHBPeriphClock(uint32_t AHBPeriph) +{ + RCM->AHBCLKEN &= (uint32_t)~AHBPeriph; +} + +/*! + * @brief Enable the High Speed APB (APB2) peripheral clock + * + * @param APB2Periph : Enable the specified clock of the APB2 peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_APB2_PERIPH_AFIO : Enable AFIO clock + * @arg RCM_APB2_PERIPH_GPIOA : Enable GPIOA clock + * @arg RCM_APB2_PERIPH_GPIOB : Enable GPIOB clock + * @arg RCM_APB2_PERIPH_GPIOC : Enable GPIOC clock + * @arg RCM_APB2_PERIPH_GPIOD : Enable GPIOD clock + * @arg RCM_APB2_PERIPH_GPIOE : Enable GPIOE clock + * @arg RCM_APB2_PERIPH_ADC1 : Enable ADC1 clock + * @arg RCM_APB2_PERIPH_ADC2 : Enable ADC2 clock + * @arg RCM_APB2_PERIPH_TMR1 : Enable TMR1 clock + * @arg RCM_APB2_PERIPH_SPI1 : Enable SPI1 clock + * @arg RCM_APB2_PERIPH_USART1 : Enable USART1 clock + * + * @retval None + */ +void RCM_EnableAPB2PeriphClock(uint32_t APB2Periph) +{ + RCM->APB2CLKEN |= APB2Periph; +} + +/*! + * @brief Disable the High Speed APB (APB2) peripheral clock + * + * @param APB2Periph : Disable the specified clock of the APB2 peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_APB2_PERIPH_AFIO : Disable AFIO clock + * @arg RCM_APB2_PERIPH_GPIOA : Disable GPIOA clock + * @arg RCM_APB2_PERIPH_GPIOB : Disable GPIOB clock + * @arg RCM_APB2_PERIPH_GPIOC : Disable GPIOC clock + * @arg RCM_APB2_PERIPH_GPIOD : Disable GPIOD clock + * @arg RCM_APB2_PERIPH_GPIOE : Disable GPIOE clock + * @arg RCM_APB2_PERIPH_ADC1 : Disable ADC1 clock + * @arg RCM_APB2_PERIPH_ADC2 : Disable ADC2 clock + * @arg RCM_APB2_PERIPH_TMR1 : Disable TMR1 clock + * @arg RCM_APB2_PERIPH_SPI1 : Disable SPI1 clock + * @arg RCM_APB2_PERIPH_USART1 : Disable USART1 clock + * + * @retval None + */ +void RCM_DisableAPB2PeriphClock(uint32_t APB2Periph) +{ + RCM->APB2CLKEN &= (uint32_t)~APB2Periph; +} + +/*! + * @brief Enable the Low Speed APB (APB1) peripheral clock + * + * @param APB1Periph : Enable the specified clock of the APB1 peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_APB1_PERIPH_TMR2 : Enable TMR2 clock + * @arg RCM_APB1_PERIPH_TMR3 : Enable TMR3 clock + * @arg RCM_APB1_PERIPH_TMR4 : Enable TMR4 clock + * @arg RCM_APB1_PERIPH_WWDT : Enable WWDT clock + * @arg RCM_APB1_PERIPH_SPI2 : Enable SPI2 clock + * @arg RCM_APB1_PERIPH_USART2 : Enable USART2 clock + * @arg RCM_APB1_PERIPH_USART3 : Enable USART3 clock + * @arg RCM_APB1_PERIPH_I2C1 : Enable I2C1 clock + * @arg RCM_APB1_PERIPH_I2C2 : Enable I2C2 clock + * @arg RCM_APB1_PERIPH_USB : Enable USB clock + * @arg RCM_APB1_PERIPH_CAN1 : Enable CAN1 clock + * @arg RCM_APB1_PERIPH_CAN2 : Enable CAN2 clock + * @arg RCM_APB1_PERIPH_BAKR : Enable BAKR clock + * @arg RCM_APB1_PERIPH_PMU : Enable PMU clock + * + * @retval None + */ +void RCM_EnableAPB1PeriphClock(uint32_t APB1Periph) +{ + RCM->APB1CLKEN |= APB1Periph; +} + +/*! + * @brief Disable the Low Speed APB (APB1) peripheral clock + * + * @param APB1Periph : Disable the specified clock of the APB1 peripheral. + * This parameter can be any combination of the following values: + * @arg RCM_APB1_PERIPH_TMR2 : Disable TMR2 clock + * @arg RCM_APB1_PERIPH_TMR3 : Disable TMR3 clock + * @arg RCM_APB1_PERIPH_TMR4 : Disable TMR4 clock + * @arg RCM_APB1_PERIPH_WWDT : Disable WWDT clock + * @arg RCM_APB1_PERIPH_SPI2 : Disable SPI2 clock + * @arg RCM_APB1_PERIPH_USART2 : Disable USART2 clock + * @arg RCM_APB1_PERIPH_USART3 : Disable USART3 clock + * @arg RCM_APB1_PERIPH_I2C1 : Disable I2C1 clock + * @arg RCM_APB1_PERIPH_I2C2 : Disable I2C2 clock + * @arg RCM_APB1_PERIPH_USB : Disable USB clock + * @arg RCM_APB1_PERIPH_CAN1 : Disable CAN1 clock + * @arg RCM_APB1_PERIPH_CAN2 : Disable CAN2 clock + * @arg RCM_APB1_PERIPH_BAKR : Disable BAKR clock + * @arg RCM_APB1_PERIPH_PMU : Disable PMU clock + * + * @retval None + */ +void RCM_DisableAPB1PeriphClock(uint32_t APB1Periph) +{ + RCM->APB1CLKEN &= (uint32_t)~APB1Periph; +} + +/*! + * @brief Enable High Speed APB (APB2) peripheral reset + * + * @param APB2Periph : Enable the specified APB2 peripheral reset. + * This parameter can be any combination of the following values: + * @arg RCM_APB2_PERIPH_AFIO : Enable AFIO reset + * @arg RCM_APB2_PERIPH_GPIOA : Enable GPIOA reset + * @arg RCM_APB2_PERIPH_GPIOB : Enable GPIOB reset + * @arg RCM_APB2_PERIPH_GPIOC : Enable GPIOC reset + * @arg RCM_APB2_PERIPH_GPIOD : Enable GPIOD reset + * @arg RCM_APB2_PERIPH_GPIOE : Enable GPIOE reset + * @arg RCM_APB2_PERIPH_ADC1 : Enable ADC1 reset + * @arg RCM_APB2_PERIPH_ADC2 : Enable ADC2 reset + * @arg RCM_APB2_PERIPH_TMR1 : Enable TMR1 reset + * @arg RCM_APB2_PERIPH_SPI1 : Enable SPI1 reset + * @arg RCM_APB2_PERIPH_USART1 : Enable USART1 reset + * + * @retval None + */ +void RCM_EnableAPB2PeriphReset(uint32_t APB2Periph) +{ + RCM->APB2RST |= APB2Periph; +} + +/*! + * @brief Disable High Speed APB (APB2) peripheral reset + * + * @param APB2Periph : Disable the specified APB2 peripheral reset. + * This parameter can be any combination of the following values: + * @arg RCM_APB2_PERIPH_AFIO : Disable AFIO reset + * @arg RCM_APB2_PERIPH_GPIOA : Disable GPIOA reset + * @arg RCM_APB2_PERIPH_GPIOB : Disable GPIOB reset + * @arg RCM_APB2_PERIPH_GPIOC : Disable GPIOC reset + * @arg RCM_APB2_PERIPH_GPIOD : Disable GPIOD reset + * @arg RCM_APB2_PERIPH_GPIOE : Disable GPIOE reset + * @arg RCM_APB2_PERIPH_ADC1 : Disable ADC1 reset + * @arg RCM_APB2_PERIPH_ADC2 : Disable ADC2 reset + * @arg RCM_APB2_PERIPH_TMR1 : Disable TMR1 reset + * @arg RCM_APB2_PERIPH_SPI1 : Disable SPI1 reset + * @arg RCM_APB2_PERIPH_USART1 : Disable USART1 reset + * + * @retval None + */ +void RCM_DisableAPB2PeriphReset(uint32_t APB2Periph) +{ + RCM->APB2RST &= (uint32_t)~APB2Periph; +} + +/*! + * @brief Enable Low Speed APB (APB1) peripheral reset + * + * @param APB1Periph : Enable the specified APB1 peripheral reset. + * This parameter can be any combination of the following values: + * @arg RCM_APB1_PERIPH_TMR2 : Enable TMR2 reset + * @arg RCM_APB1_PERIPH_TMR3 : Enable TMR3 reset + * @arg RCM_APB1_PERIPH_TMR4 : Enable TMR4 reset + * @arg RCM_APB1_PERIPH_WWDT : Enable WWDT reset + * @arg RCM_APB1_PERIPH_SPI2 : Enable SPI2 reset + * @arg RCM_APB1_PERIPH_USART2 : Enable USART2 reset + * @arg RCM_APB1_PERIPH_USART3 : Enable USART3 reset + * @arg RCM_APB1_PERIPH_I2C1 : Enable I2C1 reset + * @arg RCM_APB1_PERIPH_I2C2 : Enable I2C2 reset + * @arg RCM_APB1_PERIPH_USB : Enable USB reset + * @arg RCM_APB1_PERIPH_CAN1 : Enable CAN1 reset + * @arg RCM_APB1_PERIPH_CAN2 : Enable CAN2 reset + * @arg RCM_APB1_PERIPH_BAKR : Enable BAKR reset + * @arg RCM_APB1_PERIPH_PMU : Enable PMU reset + * + * @retval None + */ +void RCM_EnableAPB1PeriphReset(uint32_t APB1Periph) +{ + RCM->APB1RST |= APB1Periph; +} + +/*! + * @brief Disable Low Speed APB (APB1) peripheral reset + * + * @param APB1Periph : Disable the specified APB1 peripheral reset. + * This parameter can be any combination of the following values: + * @arg RCM_APB1_PERIPH_TMR2 : Disable TMR2 reset + * @arg RCM_APB1_PERIPH_TMR3 : Disable TMR3 reset + * @arg RCM_APB1_PERIPH_TMR4 : Disable TMR4 reset + * @arg RCM_APB1_PERIPH_WWDT : Disable WWDT reset + * @arg RCM_APB1_PERIPH_SPI2 : Disable SPI2 reset + * @arg RCM_APB1_PERIPH_USART2 : Disable USART2 reset + * @arg RCM_APB1_PERIPH_USART3 : Disable USART3 reset + * @arg RCM_APB1_PERIPH_I2C1 : Disable I2C1 reset + * @arg RCM_APB1_PERIPH_I2C2 : Disable I2C2 reset + * @arg RCM_APB1_PERIPH_USB : Disable USB reset + * @arg RCM_APB1_PERIPH_CAN1 : Disable CAN1 reset + * @arg RCM_APB1_PERIPH_CAN2 : Disable CAN2 reset + * @arg RCM_APB1_PERIPH_BAKR : Disable BAKR reset + * @arg RCM_APB1_PERIPH_PMU : Disable PMU reset + * + * @retval None + */ +void RCM_DisableAPB1PeriphReset(uint32_t APB1Periph) +{ + RCM->APB1RST &= (uint32_t)~APB1Periph; +} + +/*! + * @brief Enable the Backup domain reset + * + * @param None + * + * @retval None + * + */ +void RCM_EnableBackupReset(void) +{ + RCM->BDCTRL_B.BDRST = BIT_SET; +} + +/*! + * @brief Disable the Backup domain reset + * + * @param None + * + * @retval None + */ +void RCM_DisableBackupReset(void) +{ + RCM->BDCTRL_B.BDRST = BIT_RESET; +} + +/*! + * @brief Enable RCM interrupts + * + * @param interrupt : Enable the specified RCM interrupt sources. + * This parameter can be any combination of the following values: + * @arg RCM_INT_LSIRDY : LSI ready interrupt + * @arg RCM_INT_LSERDY : LSE ready interrupt + * @arg RCM_INT_HSIRDY : HSI ready interrupt + * @arg RCM_INT_HSERDY : HSE ready interrupt + * @arg RCM_INT_PLLRDY : PLL ready interrupt + * + * @retval None + */ +void RCM_EnableInterrupt(uint32_t interrupt) +{ + uint32_t temp; + + temp = interrupt << 8; + + RCM->INT |= temp; +} + +/*! + * @brief Disable RCM interrupts + * + * @param interrupt : Disable the specified RCM interrupt sources. + * This parameter can be any combination of the following values: + * @arg RCM_INT_LSIRDY : LSI ready interrupt + * @arg RCM_INT_LSERDY : LSE ready interrupt + * @arg RCM_INT_HSIRDY : HSI ready interrupt + * @arg RCM_INT_HSERDY : HSE ready interrupt + * @arg RCM_INT_PLLRDY : PLL ready interrupt + * + * @retval None + */ +void RCM_DisableInterrupt(uint32_t interrupt) +{ + uint32_t temp; + + temp = interrupt << 8; + + RCM->INT &= (uint32_t)~temp; +} + +/*! + * @brief Read the specified RCM flag status + * + * @param flag : Return the specified flag status. + * This parameter can be one of the following values: + * @arg RCM_FLAG_HSIRDY : HSI ready flag + * @arg RCM_FLAG_HSERDY : HSE ready flag + * @arg RCM_FLAG_PLLRDY : PLL ready flag + * @arg RCM_FLAG_LSERDY : LSE ready flag + * @arg RCM_FLAG_LSIRDY : LSI ready flag + * @arg RCM_FLAG_PINRST : NRST PIN Reset Occur Flag + * @arg RCM_FLAG_PORRST : POR/PDR Reset Occur Flag + * @arg RCM_FLAG_SWRST : Software Reset Occur Flag + * @arg RCM_FLAG_IWDTRST : Independent Watchdog Reset Occur Flag + * @arg RCM_FLAG_WWDTRST : Window Watchdog Reset Occur Flag + * @arg RCM_FLAG_LPRRST : Low Power Reset Occur Flag + * + * @retval The new state of flag (SET or RESET) + */ +uint8_t RCM_ReadStatusFlag(RCM_FLAG_T flag) +{ + uint32_t reg, bit; + + bit = (uint32_t)(1 << (flag & 0xff)); + + reg = (flag >> 8) & 0xff; + + switch (reg) + { + case 0: + reg = RCM->CTRL; + break; + + case 1: + reg = RCM->BDCTRL; + break; + + case 2: + reg = RCM->CSTS; + break; + + default: + break; + } + + if (reg & bit) + { + return SET; + } + + return RESET; +} + +/*! + * @brief Clear all the RCM reset flags + * + * @param None + * + * @retval None + * + * @note The reset flags are: + * RCM_FLAG_PINRST, RCM_FLAG_PWRST, RCM_FLAG_SWRST, + * RCM_FLAG_IWDTRST, RCM_FLAG_WWDTRST, RCM_FLAG_LPRRST + */ +void RCM_ClearStatusFlag(void) +{ + RCM->CSTS_B.RSTFLGCLR = BIT_SET; +} + +/*! + * @brief Read the specified RCM interrupt Flag + * + * @param flag : Read the specified RCM interrupt flag. + * This parameter can be one of the following values: + * @arg RCM_INT_LSIRDY : LSI ready interrupt flag + * @arg RCM_INT_LSERDY : LSE ready interrupt flag + * @arg RCM_INT_HSIRDY : HSI ready interrupt flag + * @arg RCM_INT_HSERDY : HSE ready interrupt flag + * @arg RCM_INT_PLLRDY : PLL ready interrupt flag + * @arg RCM_INT_CSS : Clock Security System interrupt flag + * + * @retval The new state of intFlag (SET or RESET) + */ +uint8_t RCM_ReadIntFlag(RCM_INT_T flag) +{ + return (RCM->INT& flag) ? SET : RESET; +} + +/*! + * @brief Clear the interrupt flag + * + * @param flag : Clear the specified interrupt flag. + * @arg RCM_INT_LSIRDY : Clear LSI ready interrupt flag + * @arg RCM_INT_LSERDY : Clear LSE ready interrupt flag + * @arg RCM_INT_HSIRDY : Clear HSI ready interrupt flag + * @arg RCM_INT_HSERDY : Clear HSE ready interrupt flag + * @arg RCM_INT_PLLRDY : Clear PLL ready interrupt flag + * @arg RCM_INT_CSS : Clear Clock Security System interrupt flag + * + * @retval None + */ +void RCM_ClearIntFlag(uint32_t flag) +{ + uint32_t temp; + + temp = flag << 16; + RCM->INT |= temp; +} + +/**@} end of group RCM_Functions */ +/**@} end of group RCM_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_rtc.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_rtc.c new file mode 100644 index 0000000000..da19710075 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_rtc.c @@ -0,0 +1,265 @@ +/*! + * @file apm32s10x_rtc.c + * + * @brief This file provides all the RTC firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_rtc.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup RTC_Driver RTC Driver + @{ +*/ + +/** @defgroup RTC_Functions Functions + @{ +*/ + +/*! + * @brief Enter RTC configuration mode. + * + * @param None + * + * @retval None + */ +void RTC_EnableConfigMode(void) +{ + RTC->CSTS_B.CFGMFLG = BIT_SET; +} + +/*! + * @brief Exit RTC configuration mode. + * + * @param None + * + * @retval None + */ +void RTC_DisableConfigMode(void) +{ + RTC->CSTS_B.CFGMFLG = BIT_RESET; +} + +/*! + * @brief Read the RTC counter value. + * + * @param None + * + * @retval RTC counter value. + */ +uint32_t RTC_ReadCounter(void) +{ + uint32_t reg = 0; + reg = (RTC->CNTH_B.CNTH) << 16; + reg |= (RTC->CNTL_B.CNTL); + return reg; +} + +/*! + * @brief Configure the RTC counter value. + * + * @param value: RTC counter new value. + * + * @retval None + */ +void RTC_ConfigCounter(uint32_t value) +{ + RTC_EnableConfigMode(); + RTC->CNTH_B.CNTH = value >> 16; + RTC->CNTL_B.CNTL = value & 0x0000FFFF; + RTC_DisableConfigMode(); +} + +/*! + * @brief Configure the RTC prescaler value. + * + * @param value: RTC prescaler new value. + * + * @retval None + */ +void RTC_ConfigPrescaler(uint32_t value) +{ + RTC_EnableConfigMode(); + RTC->PSCRLDH_B.PSCRLDH = value >> 16; + RTC->PSCRLDL_B.PSCRLDL = value & 0x0000FFFF; + RTC_DisableConfigMode(); +} + +/*! + * @brief Configure the RTC alarm value. + * + * @param value: RTC alarm new value. + * + * @retval None + */ +void RTC_ConfigAlarm(uint32_t value) +{ + RTC_EnableConfigMode(); + RTC->ALRH_B.ALRH = value >> 16; + RTC->ALRL_B.ALRL = value & 0x0000FFFF; + RTC_DisableConfigMode(); +} + +/*! + * @brief Read the RTC divider value. + * + * @param None + * + * @retval RTC Divider value. + */ +uint32_t RTC_ReadDivider(void) +{ + uint32_t reg = 0; + reg = (RTC->PSCH_B.PSCH & 0x000F) << 16; + reg |= (RTC->PSCL_B.PSCL); + return reg; +} + +/*! + * @brief Wait until last write operation on RTC registers has finished. + * + * @param None + * + * @retval None + */ +void RTC_WaitForLastTask(void) +{ + while (RTC->CSTS_B.OCFLG == BIT_RESET) + { + } +} + +/*! + * @brief Wait until the RTC registers + * + * @param None + * + * @retval None + */ +void RTC_WaitForSynchro(void) +{ + RTC->CSTS_B.RSYNCFLG = BIT_RESET; + while (RTC->CSTS_B.RSYNCFLG == BIT_RESET); +} + +/*! + * @brief Enable RTC interrupts. + * + * @param interrupt: specify the RTC interrupt sources to be enabled + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt + */ +void RTC_EnableInterrupt(uint16_t interrupt) +{ + RTC->CTRL |= interrupt; +} + +/*! + * @brief Disable RTC interrupts. + * + * @param interrupt: specify the RTC interrupt sources to be disabled + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt + * + * @retval None + */ +void RTC_DisableInterrupt(uint16_t interrupt) +{ + RTC->CTRL &= (uint32_t)~interrupt; +} + +/*! + * @brief Read flag bit + * + * @param flag: specify the flag to check. + * This parameter can be one of the following values: + * @arg RTC_FLAG_OC : RTC Operation Complete flag + * @arg RTC_FLAG_RSYNC : Registers Synchronized flag + * @arg RTC_FLAG_OVR : Overflow flag + * @arg RTC_FLAG_ALR : Alarm flag + * @arg RTC_FLAG_SEC : Second flag + * + * @retval SET or RESET + */ +uint8_t RTC_ReadStatusFlag(RTC_FLAG_T flag) +{ + return (RTC->CSTS & flag) ? SET : RESET; +} + +/*! + * @brief Clear flag bit + * + * @param flag: specify the flag to clear. + * This parameter can be any combination of the following values: + * @arg RTC_FLAG_OVR : Overflow flag + * @arg RTC_FLAG_ALR : Alarm flag + * @arg RTC_FLAG_SEC : Second flag + * + * @retval None + */ +void RTC_ClearStatusFlag(uint16_t flag) +{ + RTC->CSTS &= (uint32_t)~flag; +} + +/*! + * @brief Read interrupt flag bit is set + * + * @param flag: specify the flag to check. + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt + * + * @retval None + */ +uint8_t RTC_ReadIntFlag(RTC_INT_T flag) +{ + return (RTC->CSTS & flag) ? SET : RESET; +} + +/*! + * @brief Clear RTC interrupt flag bit + * + * @param flag: specify the flag to clear. + * This parameter can be one of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt + * + * @retval None + */ +void RTC_ClearIntFlag(uint16_t flag) +{ + RTC->CSTS &= (uint32_t)~flag; +} + +/**@} end of group RTC_Functions */ +/**@} end of group RTC_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_spi.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_spi.c new file mode 100644 index 0000000000..62e1b690c1 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_spi.c @@ -0,0 +1,507 @@ +/*! + * @file apm32s10x_spi.c + * + * @brief This file provides all the SPI firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_spi.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup SPI_Driver SPI Driver + @{ +*/ + +/** @defgroup SPI_Functions Functions + @{ +*/ + +/*! + * @brief Reset the specified SPIx peripheral + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_Reset(SPI_T* spi) +{ + if (spi == SPI1) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_SPI1); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_SPI1); + } + else if (spi == SPI2) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_SPI2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_SPI2); + } +} + +/*! + * @brief Configure the SPI peripheral according to the specified parameters in the spiConfig + * + * @param spi: The SPIx can be 1,2 + * + * @param spiConfig: pointer to a SPI_Config_T structure + * + * @retval None + */ +void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig) +{ + spi->CTRL1 &= 0x3040; + spi->CTRL1 |= (uint16_t)((uint32_t)spiConfig->direction | spiConfig->mode | + spiConfig->length | spiConfig->polarity | + spiConfig->phase | spiConfig->nss | + spiConfig->baudrateDiv | spiConfig->firstBit); + spi->CRCPOLY = spiConfig->crcPolynomial; +} + +/*! + * @brief Fill each SPI_Config_T member with its default value + * + * @param spiConfig: pointer to a SPI_Config_T structure + * + * @retval None + */ +void SPI_ConfigStructInit(SPI_Config_T* spiConfig) +{ + spiConfig->direction = SPI_DIRECTION_2LINES_FULLDUPLEX; + spiConfig->mode = SPI_MODE_SLAVE; + spiConfig->length = SPI_DATA_LENGTH_8B; + spiConfig->polarity = SPI_CLKPOL_LOW; + spiConfig->phase = SPI_CLKPHA_1EDGE; + spiConfig->nss = SPI_NSS_HARD; + spiConfig->baudrateDiv = SPI_BAUDRATE_DIV_2; + spiConfig->firstBit = SPI_FIRSTBIT_MSB; + spiConfig->crcPolynomial = 7; +} + +/*! + * @brief Enable the specified SPI peripheral + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_Enable(SPI_T* spi) +{ + spi->CTRL1_B.SPIEN = BIT_SET; +} + +/*! + * @brief Disable the specified SPI peripheral + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_Disable(SPI_T* spi) +{ + spi->CTRL1_B.SPIEN = BIT_RESET; +} + +/*! + * @brief Enable the SPIx DMA interface. + * + * @param spi: The SPIx can be 1,2 + * + * @param dmaReq: specify the SPI DMA transfer request + * The parameter can be one of following values: + * @arg SPI_DMA_REQ_TX: Tx buffer DMA transfer request + * @arg SPI_DMA_REQ_RX: Rx buffer DMA transfer request + * @retval None + */ +void SPI_EnableDMA(SPI_T* spi, SPI_DMA_REQ_T dmaReq) +{ + if (dmaReq == SPI_DMA_REQ_TX) + { + spi->CTRL2_B.TXDEN = ENABLE; + } + else + { + spi->CTRL2_B.RXDEN = ENABLE; + } +} + +/*! + * @brief Disable the SPIx DMA interface. + * + * @param spi: The SPIx can be 1,2 + * + * @param dmaReq: specify the SPI DMA transfer request + * The parameter can be one of following values: + * @arg SPI_DMA_REQ_TX: Tx buffer DMA transfer request + * @arg SPI_DMA_REQ_RX: Rx buffer DMA transfer request + * @retval None + */ +void SPI_DisableDMA(SPI_T* spi, SPI_DMA_REQ_T dmaReq) +{ + if (dmaReq == SPI_DMA_REQ_TX) + { + spi->CTRL2_B.TXDEN = DISABLE; + } + else + { + spi->CTRL2_B.RXDEN = DISABLE; + } +} + +/*! + * @brief Transmit a Data through the SPIx peripheral. + * + * @param spi: The SPIx can be 1,2 + * + * @param data: Data to be transmitted + * + * @retval None + */ +void SPI_TxData(SPI_T* spi, uint16_t data) +{ + spi->DATA = data; +} + +/*! + * @brief Return the most recent received data by the SPIx peripheral. + * + * @param spi: The SPIx can be 1,2 + * + * @retval data :The value of the received data + * + * @retval None + */ +uint16_t SPI_RxData(SPI_T* spi) +{ + return spi->DATA; +} + +/*! + * @brief Set the SPI NSS internal by Software + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_SetSoftwareNSS(SPI_T* spi) +{ + spi->CTRL1_B.ISSEL = BIT_SET; +} + +/*! + * @brief Reset the SPI NSS internal by Software + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_ResetSoftwareNSS(SPI_T* spi) +{ + spi->CTRL1_B.ISSEL = BIT_RESET; +} + +/*! + * @brief Enable the specified SPI SS output + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_EnableSSOutput(SPI_T* spi) +{ + spi->CTRL2_B.SSOEN = BIT_SET; +} + +/*! + * @brief Disable the specified SPI SS output + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_DisableSSOutput(SPI_T* spi) +{ + spi->CTRL2_B.SSOEN = BIT_RESET; +} + +/*! + * @brief Configure the specified SPI data size + * + * @param spi: The SPIx can be 1,2 + * + * @param length: specify the SPI data size. + * This parameter can be one of the following values: + * @arg SPI_DATA_LENGTH_16B: Set data frame format to 16bit + * @arg SPI_DATA_LENGTH_8B : Set data frame format to 8bit + * + * @retval None + */ +void SPI_ConfigDataSize(SPI_T* spi, SPI_DATA_LENGTH_T length) +{ + spi->CTRL1_B.DFLSEL = BIT_RESET; + spi->CTRL1 |= length; +} + +/*! + * @brief Transmit CRC value + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_TxCRC(SPI_T* spi) +{ + spi->CTRL1_B.CRCNXT = BIT_SET; +} + +/*! + * @brief Enable the specified SPI CRC value calculation of the transferred bytes + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_EnableCRC(SPI_T* spi) +{ + spi->CTRL1_B.CRCEN = BIT_SET; +} + +/*! + * @brief Disable the specified SPI CRC value calculation of the transferred bytes + * + * @param spi: The SPIx can be 1,2 + * + * @retval None + */ +void SPI_DisableCRC(SPI_T* spi) +{ + spi->CTRL1_B.CRCEN = BIT_RESET; +} + +/*! + * @brief Read the specified SPI transmit CRC register value + * + * @param spi: The SPIx can be 1,2 + * + * @retval The SPI transmit CRC register value + */ +uint16_t SPI_ReadTxCRC(SPI_T* spi) +{ + return spi->TXCRC_B.TXCRC; +} + +/*! + * @brief Read the specified SPI receive CRC register value + * + * @param spi: The SPIx can be 1,2 + * + * @retval The SPI receive CRC register value + */ +uint16_t SPI_ReadRxCRC(SPI_T* spi) +{ + return spi->RXCRC_B.RXCRC; +} + +/*! + * @brief Read the specified SPI CRC Polynomial register value + * + * @param spi: The SPIx can be 1,2 + * + * @retval The SPI CRC Polynomial register value + */ +uint16_t SPI_ReadCRCPolynomial(SPI_T* spi) +{ + return spi->CRCPOLY_B.CRCPOLY; +} + +/*! + * @brief Configure the specified SPI data transfer direction + * + * @param spi: The SPIx can be 1,2 + * + * @param direction: Select the SPI data transfer direction + * The parameter can be one of following values: + * @arg SPI_DIRECTION_RX: Selects Rx receive direction + * @arg SPI_DIRECTION_TX: Selects Tx transmission direction + * + * @retval None + */ +void SPI_ConfigBiDirectionalLine(SPI_T* spi, SPI_DIRECTION_SELECT_T direction) +{ + if (direction == SPI_DIRECTION_TX) + { + spi->CTRL1 |= SPI_DIRECTION_TX; + } + else + { + spi->CTRL1 &= SPI_DIRECTION_RX; + } +} + +/*! + * @brief Enable the specified SPI interrupts. + * + * @param spi: The SPIx can be 1,2 + * + * @param interrupt: specify the TMR interrupts sources + * The parameter can be one of following values: + * @arg SPI_INT_TXBE: Tx buffer empty interrupt + * @arg SPI_INT_RXBNE: Rx buffer not empty interrupt + * @arg SPI_INT_ERR: Error interrupt + * + * @retval None + */ +void SPI_EnableInterrupt(SPI_T* spi, SPI_INT_T interrupt) +{ + spi->CTRL2 |= (interrupt >> 8); +} + +/*! + * @brief Disable the specified SPI interrupts. + * + * @param spi: The SPIx can be 1,2 + * + * @param interrupt: specify the TMR interrupts sources + * The parameter can be one of following values: + * @arg SPI_INT_TXBE: Tx buffer empty interrupt + * @arg SPI_INT_RXBNE: Rx buffer not empty interrupt + * @arg SPI_INT_ERR: Error interrupt + * @retval None + */ +void SPI_DisableInterrupt(SPI_T* spi, SPI_INT_T interrupt) +{ + spi->CTRL2 &= ~(interrupt >> 8); +} + +/*! + * @brief Check whether the specified SPI flag is set or not. + * + * @param spi: The SPIx can be 1,2 + * + * @param flag: specify the SPI flag to check + * The parameter can be one of following values: + * @arg SPI_FLAG_RXBNE: Receive buffer not empty flag + * @arg SPI_FLAG_TXBE: Transmit buffer empty flag + * @arg SPI_FLAG_SCHDIR: Side Channel flag + * @arg SPI_FLAG_UDR: Underrun Error flag + * @arg SPI_FLAG_CRCE: CRC Error flag + * @arg SPI_FLAG_ME: Mode Error flag + * @arg SPI_FLAG_OVR: Overrun flag + * @arg SPI_FLAG_BSY: Busy flag + * + * @retval SET or RESET + */ +uint8_t SPI_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag) +{ + if ((spi->STS & flag) != RESET) + { + return SET; + } + else + { + return RESET; + } +} + +/*! + * @brief Clear the SPIx CRC Error flag + * + * @param spi: The SPIx can be 1,2 + * + * @param flag: only clear SPI_FLAG_CRCE(CRC Error flag) + * + * @retval None + * + * @note 1)SPI_FLAG_OVR: (OverRun error) flag is cleared by software sequence: + * a read operation to SPI_DATA register (SPI_RxData()) + * followed by a read operation to SPI_STS register (SPI_ReadStatusFlag()). + * 2)SPI_FLAG_UDR: (UnderRun error) flag is cleared: + * a read operation to SPI_STS register (SPI_ReadStatusFlag()). + * 3)SPI_FLAG_ME: (Mode Fault) flag is cleared by software sequence: + * a read/write operation to SPI_STS register (SPI_ReadStatusFlag()) + * followed by a write operation to SPI_CTRL1 register (SPI_Enable()). + */ +void SPI_ClearStatusFlag(SPI_T* spi, SPI_FLAG_T flag) +{ + spi->STS_B.CRCEFLG = BIT_RESET; +} + +/*! + * @brief Check whether the specified SPI interrupt has occurred or not. + * + * @param spi: The SPIx can be 1,2 + * + * @param flag: specify the SPI interrupt flag to check. + * The parameter can be one of following values: + * @arg SPI_INT_RXBNE : Receive buffer not empty interrupt flag + * @arg SPI_INT_TXBE : Transmit buffer empty interrupt flag + * @arg SPI_INT_OVR : Overrun interrupt flag + * @arg SPI_INT_CRCE : CRC Error interrupt flag + * @arg SPI_INT_ME : Mode Error interrupt flag + * @arg SPI_INT_UDR : Underrun Error interrupt flag + * + * @retval SET or RESET + */ +uint8_t SPI_ReadIntFlag(SPI_T* spi, SPI_INT_T flag) +{ + uint32_t intEnable; + uint32_t intStatus; + + intEnable = (uint32_t)(spi->CTRL2 & (flag >> 8)); + intStatus = (uint32_t)(spi->STS & flag); + + if (intEnable && intStatus) + { + return SET; + } + + return RESET; +} + +/*! + * @brief Clear the SPIx CRC Error interrupt flag + * + * @param spi: The SPIx can be 1,2 + * + * @param flag: only clear SPI_INT_CRCE(CRC Error interrupt flag) + * + * @retval None + * + * @note 1)SPI_INT_OVR: (OverRun interrupt error) flag is cleared by software sequence: + * a read operation to SPI_DATA register (SPI_RxData()) + * followed by a read operation to SPI_STS register (SPI_ReadIntFlag()). + * 2)SPI_INT_UDR: (UnderRun interrupt error) flag is cleared: + * a read operation to SPI_STS register (SPI_ReadIntFlag()). + * 3)SPI_INT_ME: (Mode interrupt Fault) flag is cleared by software sequence: + * a read/write operation to SPI_STS register (SPI_ReadIntFlag()) + * followed by a write operation to SPI_CTRL1 register (SPI_Enable()). + */ +void SPI_ClearIntFlag(SPI_T* spi, SPI_INT_T flag) +{ + spi->STS_B.CRCEFLG = BIT_RESET; +} + +/**@} end of group SPI_Functions */ +/**@} end of group SPI_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_tmr.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_tmr.c new file mode 100644 index 0000000000..4ad94038e4 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_tmr.c @@ -0,0 +1,2140 @@ +/*! + * @file apm32s10x_tmr.c + * + * @brief This file provides all the TMR firmware functions. + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_tmr.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup TMR_Driver TMR Driver + @{ +*/ + +/** @defgroup TMR_Functions Functions + @{ +*/ + +static void TI1Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI2Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI3Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI4Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); + +/*! + * @brief Deinitialize the TMRx peripheral registers to their default reset values. + * + * @param tmr: Select TMRx peripheral, The x can be 1 to 8 + * + * @retval None + */ +void TMR_Reset(TMR_T* tmr) +{ + if (tmr == TMR1) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_TMR1); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_TMR1); + } + else if (tmr == TMR2) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR2); + } + else if (tmr == TMR3) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR3); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR3); + } + else if (tmr == TMR4) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_TMR4); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_TMR4); + } +} + +/*! + * @brief Initialize the base timer through the structure + * + * @param tmr: Select TMRx peripheral, The x can be 1 to 4 + * + * @param baseConfig: Pointer to a TMR_BaseConfig_T structure + * + * @retval None + */ +void TMR_ConfigTimeBase(TMR_T* tmr, TMR_BaseConfig_T* baseConfig) +{ + uint16_t temp; + + if ((tmr == TMR1) || (tmr == TMR2) || (tmr == TMR3) || (tmr == TMR4)) + { + temp = tmr->CTRL1; + temp &= 0x038F; + temp |= baseConfig->countMode; + tmr->CTRL1 = temp; + } + + tmr->AUTORLD = baseConfig->period; + tmr->PSC = baseConfig->division; + + if (tmr == TMR1) + { + tmr->REPCNT = baseConfig->repetitionCounter; + } + tmr->CEG_B.UEG = 0x01; +} + +/*! + * @brief Configure channel 1 according to parameters + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCConfig: Pointer to a TMR_OCConfig_T structure + * + * @retval None + */ +void TMR_ConfigOC1(TMR_T* tmr, TMR_OCConfig_T* OCConfig) +{ + tmr->CCEN_B.CC1EN = BIT_RESET; + + tmr->CCM1_COMPARE_B.CC1SEL = BIT_RESET; + tmr->CCM1_COMPARE_B.OC1MOD = OCConfig->mode; + + tmr->CCEN_B.CC1POL = OCConfig->polarity; + tmr->CCEN_B.CC1EN = OCConfig->outputState; + + if (tmr == TMR1) + { + tmr->CCEN_B.CC1NPOL = OCConfig->nPolarity; + tmr->CCEN_B.CC1NEN = OCConfig->outputNState; + + tmr->CTRL2_B.OC1OIS = BIT_RESET; + tmr->CTRL2_B.OC1NOIS = BIT_RESET; + tmr->CTRL2_B.OC1OIS = OCConfig->idleState; + tmr->CTRL2_B.OC1NOIS = OCConfig->nIdleState; + } + tmr->CC1 = OCConfig->pulse; +} + +/*! + * @brief Configure channel 2 according to parameters + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCConfig: Pointer to a TMR_OCConfig_T structure + * + * @retval None + */ +void TMR_ConfigOC2(TMR_T* tmr, TMR_OCConfig_T* OCConfig) +{ + tmr->CCEN_B.CC2EN = BIT_RESET; + + tmr->CCM1_COMPARE_B.OC2MOD = BIT_RESET; + tmr->CCM1_COMPARE_B.CC2SEL = BIT_RESET; + tmr->CCM1_COMPARE_B.OC2MOD = OCConfig->mode; + + tmr->CCEN_B.CC2POL = BIT_RESET; + tmr->CCEN_B.CC2POL = OCConfig->polarity; + tmr->CCEN_B.CC2EN = OCConfig->outputState; + + if (tmr == TMR1) + { + tmr->CCEN_B.CC2NPOL = BIT_RESET; + tmr->CCEN_B.CC2NPOL = OCConfig->nPolarity; + + tmr->CCEN_B.CC2NEN = BIT_RESET; + tmr->CCEN_B.CC2NEN = OCConfig->outputNState; + + tmr->CTRL2_B.OC2OIS = BIT_RESET; + tmr->CTRL2_B.OC2NOIS = BIT_RESET; + tmr->CTRL2_B.OC2OIS = OCConfig->idleState; + tmr->CTRL2_B.OC2NOIS = OCConfig->nIdleState; + } + tmr->CC2 = OCConfig->pulse; +} + +/*! + * @brief Configure channel 3 according to parameters + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCConfig: Pointer to a TMR_OCConfig_T structure + * + * @retval None + */ +void TMR_ConfigOC3(TMR_T* tmr, TMR_OCConfig_T* OCConfig) +{ + tmr->CCEN_B.CC3EN = BIT_RESET; + + tmr->CCM2_COMPARE_B.OC3MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.CC3SEL = BIT_RESET; + tmr->CCM2_COMPARE_B.OC3MOD = OCConfig->mode; + + tmr->CCEN_B.CC3POL = BIT_RESET; + tmr->CCEN_B.CC3POL = OCConfig->polarity; + tmr->CCEN_B.CC3EN = OCConfig->outputState; + + if (tmr == TMR1) + { + tmr->CCEN_B.CC3NPOL = BIT_RESET; + tmr->CCEN_B.CC3NPOL = OCConfig->nPolarity; + tmr->CCEN_B.CC3NEN = BIT_RESET; + tmr->CCEN_B.CC3NEN = OCConfig->outputNState; + + tmr->CTRL2_B.OC3OIS = BIT_RESET; + tmr->CTRL2_B.OC3NOIS = BIT_RESET; + tmr->CTRL2_B.OC3OIS = OCConfig->idleState; + tmr->CTRL2_B.OC3NOIS = OCConfig->nIdleState; + } + tmr->CC3 = OCConfig->pulse; +} + +/*! + * @brief Configure channel 4 according to parameters + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCConfig: Pointer to a TMR_OCConfig_T structure + * + * @retval None + */ +void TMR_ConfigOC4(TMR_T* tmr, TMR_OCConfig_T* OCConfig) +{ + tmr->CCEN_B.CC4EN = BIT_RESET; + + tmr->CCM2_COMPARE_B.OC4MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.CC4SEL = BIT_RESET; + tmr->CCM2_COMPARE_B.OC4MOD = OCConfig->mode; + + tmr->CCEN_B.CC4POL = BIT_RESET; + tmr->CCEN_B.CC4POL = OCConfig->polarity; + tmr->CCEN_B.CC4EN = OCConfig->outputState; + + if (tmr == TMR1) + { + tmr->CTRL2_B.OC4OIS = BIT_RESET; + tmr->CTRL2_B.OC4OIS = OCConfig->idleState; + } + tmr->CC4 = OCConfig->pulse; +} + +/*! + * @brief Configure Peripheral equipment + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param ICConfig: Pointer to a TMR_ICConfig_T structure + * + * @retval None + */ +void TMR_ConfigIC(TMR_T* tmr, TMR_ICConfig_T* ICConfig) +{ + if (ICConfig->channel == TMR_CHANNEL_1) + { + TI1Config(tmr, ICConfig->polarity, ICConfig->selection, ICConfig->filter); + TMR_ConfigIC1Prescal(tmr, ICConfig->prescaler); + } + else if (ICConfig->channel == TMR_CHANNEL_2) + { + TI2Config(tmr, ICConfig->polarity, ICConfig->selection, ICConfig->filter); + TMR_ConfigIC2Prescal(tmr, ICConfig->prescaler); + } + else if (ICConfig->channel == TMR_CHANNEL_3) + { + TI3Config(tmr, ICConfig->polarity, ICConfig->selection, ICConfig->filter); + TMR_ConfigIC3Prescal(tmr, ICConfig->prescaler); + } + else if (ICConfig->channel == TMR_CHANNEL_4) + { + TI4Config(tmr, ICConfig->polarity, ICConfig->selection, ICConfig->filter); + TMR_ConfigIC4Prescal(tmr, ICConfig->prescaler); + } +} + +/*! + * @brief Configure the Break feature, dead time, Lock level, the IMOS + * + * @param tmr: The TMRx it can be TMR1 + * + * @param BDTConfig: Pointer to a TMR_BDTConfig_T structure + * + * @retval None + */ +void TMR_ConfigBDT(TMR_T* tmr, TMR_BDTConfig_T* BDTConfig) +{ + tmr->BDT = (BDTConfig->IMOS) << 10 | \ + (BDTConfig->RMOS) << 11 | \ + (BDTConfig->lockLevel) << 8 | \ + (BDTConfig->deadTime) | \ + (BDTConfig->BRKState) << 12 | \ + (BDTConfig->BRKPolarity) << 13 | \ + (BDTConfig->automaticOutput) << 14; +} + +/*! + * @brief Initialize the Base timer with its default value. + * + * @param baseConfig: pointer to a TMR_BaseConfig_T + * + * @retval None + */ +void TMR_ConfigTimeBaseStructInit(TMR_BaseConfig_T* baseConfig) +{ + baseConfig->period = 0xFFFF; + baseConfig->division = 0x0000; + baseConfig->clockDivision = TMR_CLOCK_DIV_1; + baseConfig->countMode = TMR_COUNTER_MODE_UP; + baseConfig->repetitionCounter = 0x0000; +} + +/*! + * @brief Initialize the OC timer with its default value. + * + * @param OCConfig: pointer to a TMR_OCConfig_T + * + * @retval None + */ +void TMR_ConfigOCStructInit(TMR_OCConfig_T* OCConfig) +{ + OCConfig->mode = TMR_OC_MODE_TMRING; + OCConfig->outputState = TMR_OC_STATE_DISABLE; + OCConfig->outputNState = TMR_OC_NSTATE_DISABLE; + OCConfig->pulse = 0x0000; + OCConfig->polarity = TMR_OC_POLARITY_HIGH; + OCConfig->nPolarity = TMR_OC_NPOLARITY_HIGH; + OCConfig->idleState = TMR_OC_IDLE_STATE_RESET; + OCConfig->nIdleState = TMR_OC_NIDLE_STATE_RESET; +} + +/*! + * @brief Initialize the IC timer with its default value. + * + * @param ICConfig: pointer to a TMR_ICConfig_T + * + * @retval None + */ +void TMR_ConfigICStructInit(TMR_ICConfig_T* ICConfig) +{ + ICConfig->channel = TMR_CHANNEL_1; + ICConfig->polarity = TMR_IC_POLARITY_RISING; + ICConfig->selection = TMR_IC_SELECTION_DIRECT_TI; + ICConfig->prescaler = TMR_IC_PSC_1; + ICConfig->filter = 0x00; +} + +/*! + * @brief Initialize the BDT timer with its default value. + * + * @param BDTConfig: pointer to a TMR_BDTConfig_T + * + * @retval None + */ +void TMR_ConfigBDTStructInit(TMR_BDTConfig_T* BDTConfig) +{ + BDTConfig->RMOS = TMR_RMOS_STATE_DISABLE; + BDTConfig->IMOS = TMR_IMOS_STATE_DISABLE; + BDTConfig->lockLevel = TMR_LOCK_LEVEL_OFF; + BDTConfig->deadTime = 0x00; + BDTConfig->BRKState = TMR_BRK_STATE_DISABLE; + BDTConfig->BRKPolarity = TMR_BRK_POLARITY_LOW; + BDTConfig->automaticOutput = TMR_AUTOMATIC_OUTPUT_DISABLE; +} + +/*! + * @brief Enable the specified TMR peripheral + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_Enable(TMR_T* tmr) +{ + tmr->CTRL1_B.CNTEN = ENABLE; +} + +/*! + * @brief Disable the specified TMR peripheral + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_Disable(TMR_T* tmr) +{ + tmr->CTRL1_B.CNTEN = DISABLE; +} + +/*! + * @brief Configure of TMR to PWM + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param PWMConfig: pointer to a TMR_ICConfig_T + * + * @retval None + */ +void TMR_ConfigPWM(TMR_T* tmr, TMR_ICConfig_T* PWMConfig) +{ + uint16_t icpolarity = TMR_IC_POLARITY_RISING; + uint16_t icselection = TMR_IC_SELECTION_DIRECT_TI; + + if (PWMConfig->polarity == TMR_IC_POLARITY_RISING) + { + icpolarity = TMR_IC_POLARITY_FALLING; + } + else + { + icpolarity = TMR_IC_POLARITY_RISING; + } + + if (PWMConfig->selection == TMR_IC_SELECTION_DIRECT_TI) + { + icselection = TMR_IC_SELECTION_INDIRECT_TI; + } + else + { + icselection = TMR_IC_SELECTION_DIRECT_TI; + } + + if (PWMConfig->channel == TMR_CHANNEL_1) + { + TI1Config(tmr, PWMConfig->polarity, PWMConfig->selection, PWMConfig->filter); + TMR_ConfigIC1Prescal(tmr, PWMConfig->prescaler); + TI2Config(tmr, icpolarity, icselection, PWMConfig->filter); + TMR_ConfigIC2Prescal(tmr, PWMConfig->prescaler); + } + else + { + TI2Config(tmr, PWMConfig->polarity, PWMConfig->selection, PWMConfig->filter); + TMR_ConfigIC2Prescal(tmr, PWMConfig->prescaler); + TI1Config(tmr, icpolarity, icselection, PWMConfig->filter); + TMR_ConfigIC1Prescal(tmr, PWMConfig->prescaler); + } +} + +/*! + * @brief Enable TMRx PWM output + * + * @param tmr: The TMRx it can be TMR1 + * + * @retval None + */ +void TMR_EnablePWMOutputs(TMR_T* tmr) +{ + tmr->BDT_B.MOEN = ENABLE; +} + +/*! + * @brief Disable TMRx PWM output. + * + * @param tmr: The TMRx it can be TMR1 + * + * @retval None + */ +void TMR_DisablePWMOutputs(TMR_T* tmr) +{ + tmr->BDT_B.MOEN = DISABLE; +} + +/*! + * @brief Configure the TMRx's DMA interface. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param baseAddress: pointer to a TMR_DMA_BASE_T + * + * @param burstLength: pointer to a TMR_DMA_BURSTLENGTH_T + * + * @retval None + */ +void TMR_ConfigDMA(TMR_T* tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T burstLength) +{ + tmr->DCTRL = (uint32_t)baseAddress | (uint32_t)burstLength; +} + +/*! + * @brief Enable TMRx Requests. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param souces: specify the TMR DMA souces + * The parameter can be any combination of following values: + * @arg TMR_DMA_SOURCE_UPDATE: TMR update DMA souces + * @arg TMR_DMA_SOURCE_CC1: TMR Capture Compare 1 DMA souces + * @arg TMR_DMA_SOURCE_CC2: TMR Capture Compare 2 DMA souces + * @arg TMR_DMA_SOURCE_CC3: TMR Capture Compare 3 DMA souces + * @arg TMR_DMA_SOURCE_CC4: TMR Capture Compare 4 DMA souces + * @arg TMR_DMA_SOURCE_COM: TMR Commutation DMA souces + * @arg TMR_DMA_SOURCE_TRG: TMR Trigger DMA souces + * + * @retval None + * + */ +void TMR_EnableDMASoure(TMR_T* tmr, uint16_t dmaSource) +{ + tmr->DIEN |= dmaSource; +} + +/*! + * @brief Disable TMRx Requests. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param souces: specify the TMR DMA souces + * The parameter can be any combination of following values: + * @arg TMR_DMA_SOURCE_UPDATE: TMR update DMA souces + * @arg TMR_DMA_SOURCE_CC1: TMR Capture Compare 1 DMA souces + * @arg TMR_DMA_SOURCE_CC2: TMR Capture Compare 2 DMA souces + * @arg TMR_DMA_SOURCE_CC3: TMR Capture Compare 3 DMA souces + * @arg TMR_DMA_SOURCE_CC4: TMR Capture Compare 4 DMA souces + * @arg TMR_DMA_SOURCE_COM: TMR Commutation DMA souces + * @arg TMR_DMA_SOURCE_TRG: TMR Trigger DMA souces + * + * @retval None + * + */ +void TMR_DisableDMASoure(TMR_T* tmr, uint16_t dmaSource) +{ + tmr->DIEN &= ~dmaSource; +} + +/*! + * @brief Configure the TMRx internal Clock + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_ConfigInternalClock(TMR_T* tmr) +{ + tmr->SMCTRL_B.SMFSEL = DISABLE; +} + +/*! + * @brief Configure the TMRx Internal Trigger as External Clock + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param triggerSource: specify the TMR trigger souces + * The parameter can be one of following values: + * @arg TMR_TRIGGER_SOURCE_ITR0: TMR Internal Trigger 0 + * @arg TMR_TRIGGER_SOURCE_ITR1: TMR Internal Trigger 1 + * @arg TMR_TRIGGER_SOURCE_ITR2: TMR Internal Trigger 2 + * @arg TMR_TRIGGER_SOURCE_ITR3: TMR Internal Trigger 3 + * + * @retval None + */ +void TMR_ConfigIntTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource) +{ + TMR_SelectInputTrigger(tmr, triggerSource); + tmr->SMCTRL_B.SMFSEL = 0x07; +} + +/*! + * @brief Configure the TMRx Trigger as External Clock + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param triggerSource: specify the TMR trigger souces + * The parameter can be one of following values: + * @arg TMR_TRIGGER_SOURCE_TI1F_ED: TI1 Edge Detector + * @arg TMR_TRIGGER_SOURCE_TI1FP1: Filtered Timer Input 1 + * @arg TMR_TRIGGER_SOURCE_TI2FP2: Filtered Timer Input 2 + * + * @param ICpolarity: specify the TMR IC polarity + * The parameter can be one of following values: + * @arg TMR_IC_POLARITY_RISING: TMR IC polarity rising + * @arg TMR_IC_POLARITY_FALLING: TMR IC polarity falling + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F. + * + * @retval None + */ +void TMR_ConfigTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource, + TMR_IC_POLARITY_T ICpolarity, uint16_t ICfilter) +{ + if (triggerSource == 0x06) + { + TI2Config(tmr, ICpolarity, TMR_IC_SELECTION_DIRECT_TI, ICfilter); + } + else + { + TI1Config(tmr, ICpolarity, TMR_IC_SELECTION_DIRECT_TI, ICfilter); + } + + TMR_SelectInputTrigger(tmr, triggerSource); + tmr->SMCTRL_B.SMFSEL = 0x07; +} + +/*! + * @brief Configure the External clock Mode1 + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param prescaler: specify the external Trigger Prescaler + * The parameter can be one of following values: + * @arg TMR_EXTTRG_PSC_OFF: ETRP Prescaler OFF + * @arg TMR_EXTTRG_PSC_DIV2: ETRP frequency divided by 2 + * @arg TMR_EXTTRG_PSC_DIV4: ETRP frequency divided by 4 + * @arg TMR_EXTTRG_PSC_DIV8: ETRP frequency divided by 8 + * + * @param polarity: specify the TMR IC polarity + * The parameter can be one of following values: + * @arg TMR_EXTTRG_POL_INVERTED: Active low or falling edge active + * @arg TMR_EXTTGR_POL_NONINVERTED: Active high or rising edge active + * + * @param filter: This parameter must be a value between 0x00 and 0x0F. + * + * @retval None + */ +void TMR_ConfigETRClockMode1(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter) +{ + TMR_ConfigETR(tmr, prescaler, polarity, filter); + tmr->SMCTRL_B.SMFSEL = BIT_RESET; + tmr->SMCTRL_B.SMFSEL = 0x07; + tmr->SMCTRL_B.TRGSEL = 0x07; +} + +/*! + * @brief Configure the External clock Mode2 + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param prescaler: specify the external Trigger Prescaler + * The parameter can be one of following values: + * @arg TMR_EXTTRG_PSC_OFF: ETRP Prescaler OFF + * @arg TMR_EXTTRG_PSC_DIV2: ETRP frequency divided by 2 + * @arg TMR_EXTTRG_PSC_DIV4: ETRP frequency divided by 4 + * @arg TMR_EXTTRG_PSC_DIV8: ETRP frequency divided by 8 + * + * @param polarity: specify the TMR IC polarity + * The parameter can be one of following values: + * @arg TMR_EXTTRG_POL_INVERTED: Active low or falling edge active + * @arg TMR_EXTTGR_POL_NONINVERTED: Active high or rising edge active + * + * @param filter: This parameter must be a value between 0x00 and 0x0F. + * + * @retval None + */ +void TMR_ConfigETRClockMode2(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter) +{ + TMR_ConfigETR(tmr, prescaler, polarity, filter); + tmr->SMCTRL_B.ECEN = ENABLE; +} +/*! + * @brief Configure the TMRx External Trigger (ETR). + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param prescaler: specify the external Trigger Prescaler + * The parameter can be one of following values: + * @arg TMR_EXTTRG_PSC_OFF: ETRP Prescaler OFF + * @arg TMR_EXTTRG_PSC_DIV2: ETRP frequency divided by 2 + * @arg TMR_EXTTRG_PSC_DIV4: ETRP frequency divided by 4 + * @arg TMR_EXTTRG_PSC_DIV8: ETRP frequency divided by 8 + * + * @param polarity: specify the TMR IC polarity + * The parameter can be one of following values: + * @arg TMR_EXTTRG_POL_INVERTED: Active low or falling edge active + * @arg TMR_EXTTGR_POL_NONINVERTED: Active high or rising edge active + * + * @param filter: This parameter must be a value between 0x00 and 0x0F. + * + * @retval None + */ +void TMR_ConfigETR(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, + TMR_EXTTRG_POL_T polarity, uint16_t filter) +{ + tmr->SMCTRL &= 0x00FF; + tmr->SMCTRL_B.ETPCFG = prescaler; + tmr->SMCTRL_B.ETPOL = polarity; + tmr->SMCTRL_B.ETFCFG = filter; +} + +/*! + * @brief Configure the TMRx prescaler. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param prescaler: specify the prescaler Register value + * + * @param pscReloadMode: specify the TMR prescaler Reload mode + * The parameter can be one of following values: + * @arg TMR_PSC_RELOAD_UPDATE: The Prescaler is loaded at the update event + * @arg TMR_PSC_RELOAD_IMMEDIATE: The Prescaler is loaded immediately + * + * @retval None + */ +void TMR_ConfigPrescaler(TMR_T* tmr, uint16_t prescaler, TMR_PSC_RELOAD_T pscReloadMode) +{ + tmr->PSC = prescaler; + tmr->CEG_B.UEG = pscReloadMode; +} + +/*! + * @brief Configure counter mode + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param countMode:specify the Counter Mode to be used + * The parameter can be one of following values: + * @arg TMR_COUNTER_MODE_UP: Timer Up Counting Mode + * @arg TMR_COUNTER_MODE_DOWN: Timer Down Counting Mode + * @arg TMR_COUNTER_MODE_CENTERALIGNED1: Timer Center Aligned Mode1 + * @arg TMR_COUNTER_MODE_CENTERALIGNED2: Timer Center Aligned Mode2 + * @arg TMR_COUNTER_MODE_CENTERALIGNED3: Timer Center Aligned Mode3 + * + * @retval None + */ +void TMR_ConfigCounterMode(TMR_T* tmr, TMR_COUNTER_MODE_T countMode) +{ + tmr->CTRL1_B.CNTDIR = BIT_RESET; + tmr->CTRL1_B.CAMSEL = BIT_RESET; + tmr->CTRL1 |= countMode; +} + +/*! + * @brief Select the Input Trigger source + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param triggerSource: specify the Input Trigger source + * The parameter can be one of following values: + * @arg TMR_TRIGGER_SOURCE_ITR0: Internal Trigger 0 + * @arg TMR_TRIGGER_SOURCE_ITR1: Internal Trigger 1 + * @arg TMR_TRIGGER_SOURCE_ITR2: Internal Trigger 2 + * @arg TMR_TRIGGER_SOURCE_ITR3: Internal Trigger 3 + * @arg TMR_TRIGGER_SOURCE_TI1F_ED: TI1 Edge Detector + * @arg TMR_TRIGGER_SOURCE_TI1FP1: Filtered Timer Input 1 + * @arg TMR_TRIGGER_SOURCE_TI2FP2: Filtered Timer Input 2 + * @arg TMR_TRIGGER_SOURCE_ETRF: External Trigger input + * + * @retval None + */ +void TMR_SelectInputTrigger(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource) +{ + tmr->SMCTRL_B.TRGSEL = BIT_RESET; + tmr->SMCTRL_B.TRGSEL = triggerSource; +} + +/*! + * @brief Configure the Encoder Interface. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param encodeMode: specify the Encoder Mode + * The parameter can be one of following values: + * @arg TMR_ENCODER_MODE_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level + * @arg TMR_ENCODER_MODE_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level + * @arg TMR_ENCODER_MODE_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending + * on the level of the other input + * + * @param IC1Polarity: specify the TMR IC1 polarity + * The parameter can be one of following values: + * @arg TMR_IC_POLARITY_RISING: TMR IC polarity rising + * @arg TMR_IC_POLARITY_FALLING: TMR IC polarity falling + * + * @param IC2Polarity: specify the TMR IC2 polarity + * The parameter can be one of following values: + * @arg TMR_IC_POLARITY_RISING: TMR IC polarity rising + * @arg TMR_IC_POLARITY_FALLING: TMR IC polarity falling + * + * @retval None + */ +void TMR_ConfigEncodeInterface(TMR_T* tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC_POLARITY_T IC1Polarity, + TMR_IC_POLARITY_T IC2Polarity) +{ + tmr->SMCTRL_B.SMFSEL = BIT_RESET; + tmr->SMCTRL_B.SMFSEL = encodeMode; + + tmr->CCM1_CAPTURE_B.CC1SEL = BIT_RESET ; + tmr->CCM1_CAPTURE_B.CC2SEL = BIT_RESET ; + tmr->CCM1_CAPTURE_B.CC1SEL = 0x01 ; + tmr->CCM1_CAPTURE_B.CC2SEL = 0x01 ; + + tmr->CCEN_B.CC1POL = BIT_RESET; + tmr->CCEN_B.CC2POL = BIT_RESET; + tmr->CCEN |= ((IC1Polarity | (IC2Polarity << 4))); +} + +/*! + * @brief Force the output 1 waveform to active or inactive level. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param forcesAction: specify the forced Action to be set to the output waveform + * The parameter can be one of following values: + * @arg TMR_FORCED_ACTION_ACTIVE: Force active level on OC1REF + * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF + * + * @retval None + */ +void TMR_ConfigForcedOC1(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +{ + tmr->CCM1_COMPARE_B.OC1MOD = BIT_RESET; + tmr->CCM1_COMPARE_B.OC1MOD = forcesAction; +} + +/*! + * @brief Force the output 2 waveform to active or inactive level. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param forcesAction: specify the forced Action to be set to the output waveform + * The parameter can be one of following values: + * @arg TMR_FORCED_ACTION_ACTIVE: Force active level on OC1REF + * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF + * + * @retval None + */ +void TMR_ConfigForcedOC2(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +{ + tmr->CCM1_COMPARE_B.OC2MOD = BIT_RESET; + tmr->CCM1_COMPARE_B.OC2MOD = forcesAction; +} + +/*! + * @brief Force the output 3 waveform to active or inactive level. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param forcesAction: specify the forced Action to be set to the output waveform + * The parameter can be one of following values: + * @arg TMR_FORCED_ACTION_ACTIVE: Force active level on OC1REF + * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF + * + * @retval None + */ +void TMR_ConfigForcedOC3(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +{ + tmr->CCM2_COMPARE_B.OC3MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.OC3MOD = forcesAction; +} + +/*! + * @brief Force the output 4 waveform to active or inactive level. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param forcesAction: specify the forced Action to be set to the output waveform + * The parameter can be one of following values: + * @arg TMR_FORCED_ACTION_ACTIVE: Force active level on OC1REF + * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF + * + * @retval None + */ +void TMR_ConfigForcedOC4(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +{ + tmr->CCM2_COMPARE_B.OC4MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.OC4MOD = forcesAction; +} + +/*! + * @brief Enable peripheral Preload register on AUTORLD. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_EnableAutoReload(TMR_T* tmr) +{ + tmr->CTRL1_B.ARPEN = ENABLE; +} + +/*! + * @brief Disable peripheral Preload register on AUTORLD. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_DisableAutoReload(TMR_T* tmr) +{ + tmr->CTRL1_B.ARPEN = DISABLE; +} + +/*! + * @brief Enable the specified TMR peripheral Commutation event. + * + * @param tmr: The TMRx it can be TMR1 + * + * @retval None + */ +void TMR_EnableSelectCOM(TMR_T* tmr) +{ + tmr->CTRL2_B.CCUSEL = ENABLE; +} +/*! + * @brief Disable the specified TMR peripheral Commutation event. + * + * @param tmr: The TMRx it can be TMR1 + * + * @retval None + */ +void TMR_DisableSelectCOM(TMR_T* tmr) +{ + tmr->CTRL2_B.CCUSEL = DISABLE; +} + +/*! + * @brief Enable the Capture Compare DMA source. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_EnableCCDMA(TMR_T* tmr) +{ + tmr->CTRL2_B.CCDSEL = ENABLE; +} + +/*! + * @brief Disable the Capture Compare DMA source. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_DisableCCDMA(TMR_T* tmr) +{ + tmr->CTRL2_B.CCDSEL = DISABLE; +} + +/*! + * @brief Enable the Capture Compare Preload Control bit. + * + * @param tmr: The TMRx it can be TMR1 + * + * @retval None + */ +void TMR_EnableCCPreload(TMR_T* tmr) +{ + tmr->CTRL2_B.CCPEN = ENABLE; +} + +/*! + * @brief Disable the Capture Compare Preload Control bit. + * + * @param tmr: The TMRx it can be TMR1 + * + * @retval None + */ +void TMR_DisableCCPreload(TMR_T* tmr) +{ + tmr->CTRL2_B.CCPEN = DISABLE; +} + +/*! + * @brief Enable or disable the peripheral Preload register on CCM1. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCPreload: specify the Output Compare Channel Preload + * The parameter can be one of following values: + * @arg TMR_OC_PRELOAD_DISABLE + * @arg TMR_OC_PRELOAD_ENABLE + * + * @retval None + */ +void TMR_ConfigOC1Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +{ + tmr->CCM1_COMPARE_B.OC1PEN = OCPreload; +} + +/*! + * @brief Enable or disable the peripheral Preload register on CCM2. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCPreload: specify the Output Compare Channel Preload + * The parameter can be one of following values: + * @arg TMR_OC_PRELOAD_DISABLE + * @arg TMR_OC_PRELOAD_ENABLE + * + * @retval None + */ +void TMR_ConfigOC2Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +{ + tmr->CCM1_COMPARE_B.OC2PEN = OCPreload; +} + +/*! + * @brief Enable or disable the peripheral Preload register on CCM3. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCPreload: specify the Output Compare Channel Preload + * The parameter can be one of following values: + * @arg TMR_OC_PRELOAD_DISABLE + * @arg TMR_OC_PRELOAD_ENABLE + * + * @retval None + */ +void TMR_ConfigOC3Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +{ + tmr->CCM2_COMPARE_B.OC3PEN = OCPreload; +} + +/*! + * @brief Enable or disable the peripheral Preload register on CCM4. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCPreload: specify the Output Compare Channel Preload + * The parameter can be one of following values: + * @arg TMR_OC_PRELOAD_DISABLE + * @arg TMR_OC_PRELOAD_ENABLE + * + * @retval Nonee + */ +void TMR_ConfigOC4Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +{ + tmr->CCM2_COMPARE_B.OC4PEN = OCPreload; +} + +/*! + * @brief Configure the Output Compare 1 Fast feature. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCFast: specify the Output Compare Channel Fast + * The parameter can be one of following values: + * @arg TMR_OC_FAST_DISABLE + * @arg TMR_OC_FAST_ENABLE + * + * @retval None + */ +void TMR_ConfigOC1Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +{ + tmr->CCM1_COMPARE_B.OC1FEN = OCFast; +} + +/*! + * @brief Configure the Output Compare 2 Fast feature. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCFast: specify the Output Compare Channel Fast + * The parameter can be one of following values: + * @arg TMR_OC_FAST_DISABLE + * @arg TMR_OC_FAST_ENABLE + * + * @retval None + */ +void TMR_ConfigOC2Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +{ + tmr->CCM1_COMPARE_B.OC2FEN = OCFast; +} + +/*! + * @brief Configure the Output Compare 2 Fast feature. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCFast: specify the Output Compare Channel Fast + * The parameter can be one of following values: + * @arg TMR_OC_FAST_DISABLE + * @arg TMR_OC_FAST_ENABLE + * + * @retval None + */ +void TMR_ConfigOC3Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +{ + tmr->CCM2_COMPARE_B.OC3FEN = OCFast; +} + +/*! + * @brief Configure the Output Compare 4 Fast feature. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCFast: specify the Output Compare Channel Fast + * The parameter can be one of following values: + * @arg TMR_OC_FAST_DISABLE + * @arg TMR_OC_FAST_ENABLE + * + * @retval None + */ +void TMR_ConfigOC4Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +{ + tmr->CCM2_COMPARE_B.OC4FEN = OCFast; +} + +/*! + * @brief Clear or safeguard the OCREF1 signal on an external event + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCClear: specify the Output Compare Channel1 Clear + * The parameter can be one of following values: + * @arg TMR_OC_CLEAR_DISABLE + * @arg TMR_OC_CLEAR_ENABLE + * + * @retval None + */ +void TMR_ClearOC1Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +{ + tmr->CCM1_COMPARE_B.OC1CEN = OCClear; +} + +/*! + * @brief Clear or safeguard the OCREF2 signal on an external event + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCClear: specify the Output Compare Channel1 Clear + * The parameter can be one of following values: + * @arg TMR_OC_CLEAR_DISABLE + * @arg TMR_OC_CLEAR_ENABLE + * + * @retval None + */ +void TMR_ClearOC2Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +{ + tmr->CCM1_COMPARE_B.OC2CEN = OCClear; +} + +/*! + * @brief Clear or safeguard the OCREF3 signal on an external event + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCClear: specify the Output Compare Channel1 Clear + * The parameter can be one of following values: + * @arg TMR_OC_CLEAR_DISABLE + * @arg TMR_OC_CLEAR_ENABLE + * + * @retval None + */ +void TMR_ClearOC3Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +{ + tmr->CCM2_COMPARE_B.OC3CEN = OCClear; +} + +/*! + * @brief Clear or safeguard the OCREF4 signal on an external event + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param OCClear: specify the Output Compare Channel1 Clear + * The parameter can be one of following values: + * @arg TMR_OC_CLEAR_DISABLE + * @arg TMR_OC_CLEAR_ENABLE + * + * @retval None + */ +void TMR_ClearOC4Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +{ + tmr->CCM2_COMPARE_B.OC4CEN = OCClear; +} + +/*! + * @brief Configure the channel 1 polarity. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param polarity: specify the OC1 Polarity + * The parameter can be one of following values: + * @arg TMR_OC_POLARITY_HIGH: Output Compare active high + * @arg TMR_OC_POLARITY_LOW: Output Compare active low + * + * @retval Nonee + */ +void TMR_ConfigOC1Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +{ + tmr->CCEN_B.CC1POL = polarity; +} + +/*! + * @brief Configure the channel 1 nPolarity. + * + * @param tmr: The TMRx it can be TMR1 + * + * @param nPolarity: specify the OC1 nPolarity + * The parameter can be one of following values: + * @arg TMR_OC_NPOLARITY_HIGH: Output Compare active high + * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low + * + * @retval None + */ +void TMR_ConfigOC1NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +{ + tmr->CCEN_B.CC1NPOL = nPolarity; +} + +/*! + * @brief Configure the channel 2 polarity. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param polarity: specify the OC2 Polarity + * The parameter can be one of following values: + * @arg TMR_OC_POLARITY_HIGH: Output Compare active high + * @arg TMR_OC_POLARITY_LOW: Output Compare active low + * + * @retval None + */ +void TMR_ConfigOC2Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +{ + tmr->CCEN_B.CC2POL = polarity; +} + +/*! + * @brief Configure the channel 2 nPolarity. + * + * @param tmr: The TMRx it can be TMR1 + * + * @param nPolarity: specify the OC2 nPolarity + * The parameter can be one of following values: + * @arg TMR_OC_NPOLARITY_HIGH: Output Compare active high + * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low + * + * @retval None + */ +void TMR_ConfigOC2NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +{ + tmr->CCEN_B.CC2NPOL = nPolarity; +} + +/*! + * @brief Configure the channel 3 polarity. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param polarity: specify the OC3 Polarity + * The parameter can be one of following values: + * @arg TMR_OC_POLARITY_HIGH: Output Compare active high + * @arg TMR_OC_POLARITY_LOW: Output Compare active low + * + * @retval None + */ +void TMR_ConfigOC3Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +{ + tmr->CCEN_B.CC3POL = polarity; +} + +/*! + * @brief Configure the channel 3 nPolarity. + * + * @param tmr: The TMRx it can be TMR1 + * + * @param nPolarity: specify the OC3 nPolarity + * The parameter can be one of following values: + * @arg TMR_OC_NPOLARITY_HIGH: Output Compare active high + * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low + * + * @retval None + */ +void TMR_ConfigOC3NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +{ + tmr->CCEN_B.CC3NPOL = nPolarity; +} + +/*! + * @brief Configure the channel 4 polarity. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param polarity: specify the OC4 Polarity + * The parameter can be one of following values: + * @arg TMR_OC_POLARITY_HIGH: Output Compare active high + * @arg TMR_OC_POLARITY_LOW: Output Compare active low + * + * @retval None + */ +void TMR_ConfigOC4Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +{ + tmr->CCEN_B.CC4POL = polarity; +} + +/*! + * @brief Enable the Capture Compare Channel x. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param channel: specify the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * @arg TMR_CHANNEL_4: Timer Channel 4 + * + * @retval None + */ +void TMR_EnableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +{ + tmr->CCEN |= BIT_SET << channel; +} + +/*! + * @brief Disable the Capture Compare Channel x. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param channel: specify the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * @arg TMR_CHANNEL_4: Timer Channel 4 + * @retval None + */ +void TMR_DisableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +{ + tmr->CCEN &= ~(BIT_SET << channel); +} + +/*! + * @brief Enable the Capture Compare Channelx N. + * + * @param tmr: The TMRx it can be TMR1 + * + * @param channel: specify the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * + * @retval None + */ +void TMR_EnableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +{ + tmr->CCEN |= 0x04 << channel; +} + +/*! + * @brief Disable the Capture Compare Channelx N. + * + * @param tmr: The TMRx it can be TMR1 + * + * @param channel: specify the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * + * @retval None + */ +void TMR_DisableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +{ + tmr->CCEN &= ~(0x04 << channel); +} + +/*! + * @brief Select the Output Compare Mode. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param channel: specify the Channel + * The parameter can be one of following values: + * @arg TMR_CHANNEL_1: Timer Channel 1 + * @arg TMR_CHANNEL_2: Timer Channel 2 + * @arg TMR_CHANNEL_3: Timer Channel 3 + * @arg TMR_CHANNEL_4: Timer Channel 4 + * + * @param mode: specify the Output Compare Mode + * The parameter can be one of following values: + * @arg TMR_OC_MODE_TMRING + * @arg TMR_OC_MODE_ACTIVE + * @arg TMR_OC_MODE_INACTIVE + * @arg TMR_OC_MODE_TOGGEL + * @arg TMR_OC_MODE_LOWLEVEL + * @arg TMR_OC_MODE_HIGHLEVEL + * @arg TMR_OC_MODE_PWM1 + * @arg TMR_OC_MODE_PWM2 + * + * @retval None + */ +void TMR_SelectOCxMode(TMR_T* tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T mode) +{ + tmr->CCEN &= BIT_RESET << channel; + + if (channel == TMR_CHANNEL_1) + { + tmr->CCM1_COMPARE_B.OC1MOD = mode; + } + else if (channel == TMR_CHANNEL_2) + { + tmr->CCM1_COMPARE_B.OC2MOD = mode; + } + else if (channel == TMR_CHANNEL_3) + { + tmr->CCM2_COMPARE_B.OC3MOD = mode; + } + else if (channel == TMR_CHANNEL_4) + { + tmr->CCM2_COMPARE_B.OC4MOD = mode; + } +} + +/*! + * @brief Enable the TMRx update event + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_EnableUpdate(TMR_T* tmr) +{ + tmr->CTRL1_B.UD = DISABLE; +} + +/*! + * @brief Disable the TMRx update event + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_DisableUpdate(TMR_T* tmr) +{ + tmr->CTRL1_B.UD = ENABLE; +} + +/*! + * @brief Configure the Update Request Interrupt source + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param updateSource: Config the Update source + * The parameter can be one of following values: + * @arg TMR_UPDATE_SOURCE_GLOBAL + * @arg TMR_UPDATE_SOURCE_REGULAR + * + * @retval None + */ +void TMR_ConfigUpdateRequest(TMR_T* tmr, TMR_UPDATE_SOURCE_T updateSource) +{ + if (updateSource != TMR_UPDATE_SOURCE_GLOBAL) + { + tmr->CTRL1_B.URSSEL = BIT_SET; + } + else + { + tmr->CTRL1_B.URSSEL = BIT_RESET; + } +} + +/*! + * @brief Enable Hall sensor interface. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_EnableHallSensor(TMR_T* tmr) +{ + tmr->CTRL2_B.TI1SEL = ENABLE; +} + +/*! + * @brief Disable Hall sensor interface. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_DisableHallSensor(TMR_T* tmr) +{ + tmr->CTRL2_B.TI1SEL = DISABLE; +} + +/*! + * @brief Configure the Sing pulse Mode. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param singlePulseMode: specify the Single Pulse Mode + * The parameter can be one of following values: + * @arg TMR_SPM_REPETITIVE + * @arg TMR_SPM_SINGLE + * + * @retval None + */ +void TMR_ConfigSinglePulseMode(TMR_T* tmr, TMR_SPM_T singlePulseMode) +{ + tmr->CTRL1_B.SPMEN = singlePulseMode; +} + +/*! + * @brief Select the Trigger Output Mode. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param TRGOSource: specify the Trigger Output source + * The parameter can be one of following values: + * @arg TMR_TRGO_SOURCE_RESET + * @arg TMR_TRGO_SOURCE_ENABLE + * @arg TMR_TRGO_SOURCE_UPDATE + * @arg TMR_TRGO_SOURCE_OC1 + * @arg TMR_TRGO_SOURCE_OC1REF + * @arg TMR_TRGO_SOURCE_OC2REF + * @arg TMR_TRGO_SOURCE_OC3REF + * @arg TMR_TRGO_SOURCE_OC4REF + * + * @retval None + */ +void TMR_SelectOutputTrigger(TMR_T* tmr, TMR_TRGO_SOURCE_T TRGOSource) +{ + tmr->CTRL2_B.MMSEL = TRGOSource; +} + +/*! + * @brief Select the Slave Mode. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param slaveMode: specify the Timer Slave Mode. + * The parameter can be one of following values: + * @arg TMR_SLAVE_MODE_RESET + * @arg TMR_SLAVE_MODE_GATED + * @arg TMR_SLAVE_MODE_TRIGGER + * @arg TMR_SLAVE_MODE_EXTERNAL1 + * + * @retval None + */ +void TMR_SelectSlaveMode(TMR_T* tmr, TMR_SLAVE_MODE_T slaveMode) +{ + tmr->SMCTRL_B.SMFSEL = slaveMode; +} + +/*! + * @brief Enable the Master Slave Mode + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_EnableMasterSlaveMode(TMR_T* tmr) +{ + tmr->SMCTRL_B.MSMEN = ENABLE; +} + +/*! + * @brief Disable the Master Slave Mode + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval None + */ +void TMR_DisableMasterSlaveMode(TMR_T* tmr) +{ + tmr->SMCTRL_B.MSMEN = DISABLE; +} + +/*! + * @brief Configure the Counter Register value + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param counter: Counter register new value + * + * @retval None + */ +void TMR_ConfigCounter(TMR_T* tmr, uint16_t counter) +{ + tmr->CNT = counter; +} + +/*! + * @brief Configure the AutoReload Register value + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param autoReload: autoReload register new value + * + * @retval None + */ +void TMR_ConfigAutoreload(TMR_T* tmr, uint16_t autoReload) +{ + tmr->AUTORLD = autoReload; +} + +/*! + * @brief Configure the Capture Compare1 Register value + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param compare1: specify the Capture Compare1 value. + * + * @retval None + */ +void TMR_ConfigCompare1(TMR_T* tmr, uint16_t compare1) +{ + tmr->CC1 = compare1; +} + +/*! + * @brief Configure the Capture Compare2 Register value + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param compare2: specify the Capture Compare1 value. + * + * @retval None + */ +void TMR_ConfigCompare2(TMR_T* tmr, uint16_t compare2) +{ + tmr->CC2 = compare2; +} + +/*! + * @brief Configure the Capture Compare3 Register value + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param compare3: specify the Capture Compare1 value. + * + * @retval None + */ +void TMR_ConfigCompare3(TMR_T* tmr, uint16_t compare3) +{ + tmr->CC3 = compare3; +} + +/*! + * @brief Configure the Capture Compare4 Register value + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param compare4: specify the Capture Compare1 value. + * + * @retval None + */ +void TMR_ConfigCompare4(TMR_T* tmr, uint16_t compare4) +{ + tmr->CC4 = compare4; +} + +/*! + * @brief Configure the TMRx Input Capture 1 prescaler. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param prescaler: specify the Input Capture Channel1 Perscaler + * The parameter can be one of following values: + * @arg TMR_IC_PSC_1: no prescaler + * @arg TMR_IC_PSC_2: capture is done once every 2 events + * @arg TMR_IC_PSC_4: capture is done once every 4 events + * @arg TMR_IC_PSC_8: capture is done once every 8 events + * + * @retval None + */ +void TMR_ConfigIC1Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +{ + tmr->CCM1_CAPTURE_B.IC1PSC = BIT_RESET; + tmr->CCM1_CAPTURE_B.IC1PSC = prescaler; +} +/*! + * @brief Sets the TMRx Input Capture 2 prescaler. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param prescaler: specify the Input Capture Channel2 Perscaler + * The parameter can be one of following values: + * @arg TMR_IC_PSC_1: no prescaler + * @arg TMR_IC_PSC_2: capture is done once every 2 events + * @arg TMR_IC_PSC_4: capture is done once every 4 events + * @arg TMR_IC_PSC_8: capture is done once every 8 events + * + * @retval None + */ +void TMR_ConfigIC2Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +{ + tmr->CCM1_CAPTURE_B.IC2PSC = BIT_RESET; + tmr->CCM1_CAPTURE_B.IC2PSC = prescaler; +} + +/*! + * @brief Configure the TMRx Input Capture 3 prescaler. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param prescaler: specify the Input Capture Channel3 Perscaler + * The parameter can be one of following values: + * @arg TMR_IC_PSC_1: no prescaler + * @arg TMR_IC_PSC_2: capture is done once every 2 events + * @arg TMR_IC_PSC_4: capture is done once every 4 events + * @arg TMR_IC_PSC_8: capture is done once every 8 events + * + * @retval None + */ +void TMR_ConfigIC3Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +{ + tmr->CCM2_CAPTURE_B.IC3PSC = BIT_RESET; + tmr->CCM2_CAPTURE_B.IC3PSC = prescaler; +} + +/*! + * @brief Configure the TMRx Input Capture 4 prescaler. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param prescaler: specify the Input Capture Channel4 Perscaler + * The parameter can be one of following values: + * @arg TMR_IC_PSC_1: no prescaler + * @arg TMR_IC_PSC_2: capture is done once every 2 events + * @arg TMR_IC_PSC_4: capture is done once every 4 events + * @arg TMR_IC_PSC_8: capture is done once every 8 events + * + * @retval None + */ +void TMR_ConfigIC4Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +{ + tmr->CCM2_CAPTURE_B.IC4PSC = BIT_RESET; + tmr->CCM2_CAPTURE_B.IC4PSC = prescaler; +} + +/*! + * @brief Configure the Clock Division value + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param clockDivision: specify the clock division value. + * The parameter can be one of following values: + * @arg TMR_CLOCK_DIV_1: TDTS = Tck_tim + * @arg TMR_CLOCK_DIV_2: TDTS = 2*Tck_tim + * @arg TMR_CLOCK_DIV_4: TDTS = 4*Tck_tim + * + * @retval None + */ +void TMR_ConfigClockDivision(TMR_T* tmr, TMR_CLOCK_DIV_T clockDivision) +{ + tmr->CTRL1_B.CLKDIV = clockDivision; +} + +/*! + * @brief Read Input Capture 1 value. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval Capture Compare 1 Register value. + */ +uint16_t TMR_ReadCaputer1(TMR_T* tmr) +{ + return tmr->CC1; +} + +/*! + * @brief Read Input Capture 2 value. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval Capture Compare 2 Register value. + */ +uint16_t TMR_ReadCaputer2(TMR_T* tmr) +{ + return tmr->CC2; +} + +/*! + * @brief Read Input Capture 3 value. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval Capture Compare 3 Register value. + */ +uint16_t TMR_ReadCaputer3(TMR_T* tmr) +{ + return tmr->CC3; +} + +/*! + * @brief Read Input Capture 4 value. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval Capture Compare 4 Register value. + */ +uint16_t TMR_ReadCaputer4(TMR_T* tmr) +{ + return tmr->CC4; +} + +/*! + * @brief Read the TMRx Counter value. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval Counter Register value. + */ +uint16_t TMR_ReadCounter(TMR_T* tmr) +{ + return tmr->CNT; +} + +/*! + * @brief Read the TMRx Prescaler value. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @retval Prescaler Register value. + */ +uint16_t TMR_ReadPrescaler(TMR_T* tmr) +{ + return tmr->PSC; +} + +/*! + * @brief Enable intterupts + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param interrupt: specify the TMR interrupts sources + * The parameter can be any combination of following values: + * @arg TMR_INT_UPDATE: Timer update Interrupt source + * @arg TMR_INT_CC1: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC2: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC3: Timer Capture Compare 3 Interrupt source + * @arg TMR_INT_CC4: Timer Capture Compare 4 Interrupt source + * @arg TMR_INT_COM: Timer Commutation Interrupt source (Only for TMR1) + * @arg TMR_INT_TRG: Timer Trigger Interrupt source + * @arg TMR_INT_BRK: Timer Break Interrupt source (Only for TMR1) + * + * @retval None + */ +void TMR_EnableInterrupt(TMR_T* tmr, uint16_t interrupt) +{ + tmr->DIEN |= interrupt; +} + +/*! + * @brief Disable intterupts + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param interrupt: specify the TMR interrupts sources + * The parameter can be any combination of following values: + * @arg TMR_INT_UPDATE: Timer update Interrupt source + * @arg TMR_INT_CC1: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC2: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC3: Timer Capture Compare 3 Interrupt source + * @arg TMR_INT_CC4: Timer Capture Compare 4 Interrupt source + * @arg TMR_INT_COM: Timer Commutation Interrupt source (Only for TMR1) + * @arg TMR_INT_TRG: Timer Trigger Interrupt source + * @arg TMR_INT_BRK: Timer Break Interrupt source (Only for TMR1) + * + * @retval None + */ +void TMR_DisableInterrupt(TMR_T* tmr, uint16_t interrupt) +{ + tmr->DIEN &= ~interrupt; +} + +/*! + * @brief Configure the TMRx event to be generate by software. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param eventSources: specify the TMR event sources + * The parameter can be any combination of following values: + * @arg TMR_EVENT_UPDATE: Timer update Interrupt source + * @arg TMR_EVENT_CC1: Timer Capture Compare 1 Event source + * @arg TMR_EVENT_CC2: Timer Capture Compare 1 Event source + * @arg TMR_EVENT_CC3: Timer Capture Compare 3 Event source + * @arg TMR_EVENT_CC4: Timer Capture Compare 4 Event source + * @arg TMR_EVENT_COM: Timer Commutation Event source (Only for TMR1) + * @arg TMR_EVENT_TRG: Timer Trigger Event source + * @arg TMR_EVENT_BRK: Timer Break Event source (Only for TMR1) + * + * @retval None + */ +void TMR_GenerateEvent(TMR_T* tmr, uint16_t eventSources) +{ + tmr->CEG = eventSources; +} + +/*! + * @brief Check whether the flag is set or reset + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param interrupt: specify the TMR interrupts sources + * The parameter can be any combination of following values: + * @arg TMR_FLAG_UPDATE: Timer update Flag + * @arg TMR_FLAG_CC1: Timer Capture Compare 1 Flag + * @arg TMR_FLAG_CC2: Timer Capture Compare 2 Flag + * @arg TMR_FLAG_CC3: Timer Capture Compare 3 Flag + * @arg TMR_FLAG_CC4: Timer Capture Compare 4 Flag + * @arg TMR_FLAG_COM: Timer Commutation Flag (Only for TMR1) + * @arg TMR_FLAG_TRG: Timer Trigger Flag + * @arg TMR_FLAG_BRK: Timer Break Flag (Only for TMR1) + * @arg TMR_FLAG_CC1RC: Timer Capture Compare 1 Repetition Flag + * @arg TMR_FLAG_CC2RC: Timer Capture Compare 2 Repetition Flag + * @arg TMR_FLAG_CC3RC: Timer Capture Compare 3 Repetition Flag + * @arg TMR_FLAG_CC4RC: Timer Capture Compare 4 Repetition Flag + * + * @retval None + */ +uint16_t TMR_ReadStatusFlag(TMR_T* tmr, TMR_FLAG_T flag) +{ + return (tmr->STS & flag) ? SET : RESET; +} + +/*! + * @brief Clears the TMR's pending flags. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param interrupt: specify the TMR interrupts sources + * The parameter can be any combination of following values: + * @arg TMR_FLAG_UPDATE: Timer update Flag + * @arg TMR_FLAG_CC1: Timer Capture Compare 1 Flag + * @arg TMR_FLAG_CC2: Timer Capture Compare 2 Flag + * @arg TMR_FLAG_CC3: Timer Capture Compare 3 Flag + * @arg TMR_FLAG_CC4: Timer Capture Compare 4 Flag + * @arg TMR_FLAG_COM: Timer Commutation Flag (Only for TMR1) + * @arg TMR_FLAG_TRG: Timer Trigger Flag + * @arg TMR_FLAG_BRK: Timer Break Flag (Only for TMR1) + * @arg TMR_FLAG_CC1RC: Timer Capture Compare 1 Repetition Flag + * @arg TMR_FLAG_CC2RC: Timer Capture Compare 2 Repetition Flag + * @arg TMR_FLAG_CC3RC: Timer Capture Compare 3 Repetition Flag + * @arg TMR_FLAG_CC4RC: Timer Capture Compare 4 Repetition Flag + * + * @retval None + */ +void TMR_ClearStatusFlag(TMR_T* tmr, uint16_t flag) +{ + tmr->STS = ~flag; +} + +/*! + * @brief Check whether the ITflag is set or reset + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param interrupt: specify the TMR interrupts sources + * The parameter can be one of following values: + * @arg TMR_INT_UPDATE: Timer update Interrupt source + * @arg TMR_INT_CC1: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC2: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC3: Timer Capture Compare 3 Interrupt source + * @arg TMR_INT_CC4: Timer Capture Compare 4 Interrupt source + * @arg TMR_INT_COM: Timer Commutation Interrupt source (Only for TMR1) + * @arg TMR_INT_TRG: Timer Trigger Interrupt source + * @arg TMR_INT_BRK: Timer Break Interrupt source (Only for TMR1) + * + * @retval None + */ +uint16_t TMR_ReadIntFlag(TMR_T* tmr, TMR_INT_T flag) +{ + if (((tmr->STS & flag) != RESET) && ((tmr->DIEN & flag) != RESET)) + { + return SET; + } + else + { + return RESET; + } +} + +/*! + * @brief Clears the TMR's interrupt pending bits. + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param interrupt: specify the TMR interrupts sources + * The parameter can be any combination following values: + * @arg TMR_INT_UPDATE: Timer update Interrupt source + * @arg TMR_INT_CC1: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC2: Timer Capture Compare 1 Interrupt source + * @arg TMR_INT_CC3: Timer Capture Compare 3 Interrupt source + * @arg TMR_INT_CC4: Timer Capture Compare 4 Interrupt source + * @arg TMR_INT_COM: Timer Commutation Interrupt source (Only for TMR1) + * @arg TMR_INT_TRG: Timer Trigger Interrupt source + * @arg TMR_INT_BRK: Timer Break Interrupt source (Only for TMR1) + * + * @retval None + */ +void TMR_ClearIntFlag(TMR_T* tmr, uint16_t flag) +{ + tmr->STS = ~flag; +} + +/*! + * @brief Configure the TI1 as Input + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param ICpolarity: pointer to a TMR_IC_POLARITY_T + * + * @param ICselection: pointer to a TMR_IC_SELECTION_T + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F + * + * @retval None + */ +static void TI1Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +{ + uint16_t tmpchctrl = 0; + + tmr->CCEN_B.CC1EN = BIT_RESET; + + tmr->CCM1_CAPTURE_B.CC1SEL = BIT_RESET; + tmr->CCM1_CAPTURE_B.IC1F = BIT_RESET; + tmr->CCM1_CAPTURE_B.CC1SEL = ICselection; + tmr->CCM1_CAPTURE_B.IC1F = ICfilter; + + if ((tmr == TMR1) || (tmr == TMR2) || (tmr == TMR3) || (tmr == TMR4)) + { + tmr->CCEN_B.CC1POL = BIT_RESET; + tmr->CCEN_B.CC1EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= ICpolarity; + tmr->CCEN = tmpchctrl; + } + else + { + tmr->CCEN_B.CC1POL = BIT_RESET; + tmr->CCEN_B.CC1NPOL = BIT_RESET; + tmr->CCEN_B.CC1EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= ICpolarity; + tmr->CCEN = tmpchctrl; + } +} + +/*! + * @brief Configure the TI2 as Input + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param ICpolarity: pointer to a TMR_IC_POLARITY_T + * + * @param ICselection: pointer to a TMR_IC_SELECTION_T + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F + * + * @retval None + */ +static void TI2Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +{ + uint16_t tmpchctrl = 0; + + tmr->CCEN_B.CC2EN = BIT_RESET; + + tmr->CCM1_CAPTURE_B.CC2SEL = BIT_RESET; + tmr->CCM1_CAPTURE_B.IC2F = BIT_RESET; + tmr->CCM1_CAPTURE_B.CC2SEL = ICselection; + tmr->CCM1_CAPTURE_B.IC2F = ICfilter; + + if ((tmr == TMR1) || (tmr == TMR2) || (tmr == TMR3) || (tmr == TMR4)) + { + tmr->CCEN_B.CC2POL = BIT_RESET; + tmr->CCEN_B.CC2EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 4); + tmr->CCEN = tmpchctrl; + } + else + { + tmr->CCEN_B.CC2POL = BIT_RESET; + tmr->CCEN_B.CC2NPOL = BIT_RESET; + tmr->CCEN_B.CC2EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 4); + tmr->CCEN = tmpchctrl; + } +} + +/*! + * @brief Configure the TI3 as Input + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param ICpolarity: pointer to a TMR_IC_POLARITY_T + * + * @param ICselection: pointer to a TMR_IC_SELECTION_T + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F + * + * @retval None + */ +static void TI3Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +{ + uint16_t tmpchctrl = 0; + + tmr->CCEN_B.CC3EN = BIT_RESET; + + tmr->CCM2_CAPTURE_B.CC3SEL = BIT_RESET; + tmr->CCM2_CAPTURE_B.IC3F = BIT_RESET; + tmr->CCM2_CAPTURE_B.CC3SEL = ICselection; + tmr->CCM2_CAPTURE_B.IC3F = ICfilter; + + if ((tmr == TMR1) || (tmr == TMR2) || (tmr == TMR3) || (tmr == TMR4)) + { + tmr->CCEN_B.CC3POL = BIT_RESET; + tmr->CCEN_B.CC3EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 8); + tmr->CCEN = tmpchctrl; + } + else + { + tmr->CCEN_B.CC3POL = BIT_RESET; + tmr->CCEN_B.CC3NPOL = BIT_RESET; + tmr->CCEN_B.CC3EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 8); + tmr->CCEN = tmpchctrl; + } +} + +/*! + * @brief Configure the TI4 as Input + * + * @param tmr: The TMRx can be 1 to 4 + * + * @param ICpolarity: pointer to a TMR_IC_POLARITY_T + * + * @param ICselection: pointer to a TMR_IC_SELECTION_T + * + * @param ICfilter: This parameter must be a value between 0x00 and 0x0F + * + * @retval None + */ +static void TI4Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +{ + uint16_t tmpchctrl = 0; + + tmr->CCEN_B.CC4EN = BIT_RESET; + + tmr->CCM2_CAPTURE_B.CC4SEL = BIT_RESET; + tmr->CCM2_CAPTURE_B.IC4F = BIT_RESET; + tmr->CCM2_CAPTURE_B.CC4SEL = ICselection; + tmr->CCM2_CAPTURE_B.IC4F = ICfilter; + + tmr->CCEN_B.CC4POL = BIT_RESET; + tmr->CCEN_B.CC4EN = BIT_SET; + tmpchctrl = tmr->CCEN; + tmpchctrl |= (ICpolarity << 12); + tmr->CCEN = tmpchctrl; +} + +/**@} end of group TMR_Functions */ +/**@} end of group TMR_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_usart.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_usart.c new file mode 100644 index 0000000000..86e24207b1 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_usart.c @@ -0,0 +1,823 @@ +/*! + * @file apm32s10x_usart.c + * + * @brief This file provides all the USART firmware functions + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_usart.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup USART_Driver USART Driver + @{ +*/ + +/** @defgroup USART_Functions Functions + @{ +*/ + +/*! + * @brief Reset usart peripheral registers to their default reset values + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_Reset(USART_T* usart) +{ + if (USART1 == usart) + { + RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_USART1); + RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_USART1); + } + else if (USART2 == usart) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_USART2); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_USART2); + } + else if (USART3 == usart) + { + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_USART3); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_USART3); + } +} + +/*! + * @brief Configure the USART peripheral according to the specified parameters in the usartConfig + * + * @param uart: Select the USART or the UART peripheral + * + * @param usartConfig: pointer to a USART_Config_T structure + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_Config(USART_T* uart, USART_Config_T* usartConfig) +{ + uint32_t temp, fCLK, intDiv, fractionalDiv; + + temp = uart->CTRL1; + temp &= 0xE9F3; + temp |= (uint32_t)usartConfig->mode | \ + (uint32_t)usartConfig->parity | \ + (uint32_t)usartConfig->wordLength; + uart->CTRL1 = temp; + + temp = uart->CTRL2; + temp &= 0xCFFF; + temp |= usartConfig->stopBits; + uart->CTRL2 = temp; + + temp = uart->CTRL3; + temp &= 0xFCFF; + temp |= (uint32_t)usartConfig->hardwareFlow; + uart->CTRL3 = temp; + + if (uart == USART1) + { + RCM_ReadPCLKFreq(NULL, &fCLK); + } + else + { + RCM_ReadPCLKFreq(&fCLK, NULL); + } + + intDiv = ((25 * fCLK) / (4 * (usartConfig->baudRate))); + temp = (intDiv / 100) << 4; + fractionalDiv = intDiv - (100 * (temp >> 4)); + temp |= ((((fractionalDiv * 16) + 50) / 100)) & ((uint8_t)0x0F); + + uart->BR = temp; +} + +/*! + * @brief Fill each USART_InitStruct member with its default value + * + * @param usartConfig: pointer to a USART_Config_T structure which will be initialized + * + * @retval None + */ +void USART_ConfigStructInit(USART_Config_T* usartConfig) +{ + usartConfig->baudRate = 9600; + usartConfig->wordLength = USART_WORD_LEN_8B; + usartConfig->stopBits = USART_STOP_BIT_1; + usartConfig->parity = USART_PARITY_NONE ; + usartConfig->mode = USART_MODE_TX_RX; + usartConfig->hardwareFlow = USART_HARDWARE_FLOW_NONE; +} + +/*! + * @brief Configure communication clock + * + * @param usart: Select the USART or the UART peripheral + * + * @param clockConfig: Pointer to a USART_clockConfig_T structure + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigClock(USART_T* usart, USART_ClockConfig_T* clockConfig) +{ + usart->CTRL2_B.CLKEN = clockConfig->clock; + usart->CTRL2_B.CPHA = clockConfig->phase; + usart->CTRL2_B.CPOL = clockConfig->polarity; + usart->CTRL2_B.LBCPOEN = clockConfig->lastBit; +} + +/*! + * @brief Fill each clockConfig member with its default value + * + * @param clockConfig: Pointer to a USART_clockConfig_T structure + * + * @retval None + * + */ +void USART_ConfigClockStructInit(USART_ClockConfig_T* clockConfig) +{ + clockConfig->clock = USART_CLKEN_DISABLE; + clockConfig->phase = USART_CLKPHA_1EDGE; + clockConfig->polarity = USART_CLKPOL_LOW; + clockConfig->lastBit = USART_LBCP_DISABLE; +} + +/*! + * @brief Enable the specified USART peripheral + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_Enable(USART_T* usart) +{ + usart->CTRL1_B.UEN = BIT_SET; +} + +/*! + * @brief Disable the specified USART peripheral + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_Disable(USART_T* usart) +{ + usart->CTRL1_B.UEN = BIT_RESET; +} + +/*! + * @brief Enable the USART DMA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @param dmaReq: Specifies the DMA request + * This parameter can be one of the following values: + * @arg USART_DMA_TX: USART DMA receive request + * @arg USART_DMA_RX: USART DMA transmit request + * @arg USART_DMA_TX_RX: USART DMA transmit/receive request + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_EnableDMA(USART_T* usart, USART_DMA_T dmaReq) +{ + usart->CTRL3 |= dmaReq; +} + +/*! + * @brief Disable the USART DMA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @param dmaReq: Specifies the DMA request + * This parameter can be one of the following values: + * @arg USART_DMA_TX: USART DMA receive request + * @arg USART_DMA_RX: USART DMA transmit request + * @arg USART_DMA_TX_RX: USART DMA transmit/receive request + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_DisableDMA(USART_T* usart, USART_DMA_T dmaReq) +{ + usart->CTRL3 &= (uint32_t)~dmaReq; +} + +/*! + * @brief Configure the address of the USART node + * + * @param usart: Select the USART or the UART peripheral + * + * @param address: Indicates the address of the USART node + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_Address(USART_T* usart, uint8_t address) +{ + usart->CTRL2_B.ADDR = address; +} + +/*! + * @brief Select the USART WakeUp method. + * + * @param usart: Select the USART or the UART peripheral + * + * @param wakeup: Specifies the selected USART auto baud rate method + * This parameter can be one of the following values: + * @arg USART_WAKEUP_IDLE_LINE: WakeUp by an idle line detection + * @arg USART_WAKEUP_ADDRESS_MARK: WakeUp by an address mark + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigWakeUp(USART_T* usart, USART_WAKEUP_T wakeup) +{ + usart->CTRL1_B.WUPMCFG = wakeup; +} + +/*! + * @brief Enable USART Receiver in mute mode + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_EnableMuteMode(USART_T* usart) +{ + usart->CTRL1_B.RXMUTEEN = BIT_SET; +} + +/*! + * @brief Disable USART Receiver in active mode + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_DisableMuteMode(USART_T* usart) +{ + usart->CTRL1_B.RXMUTEEN = BIT_RESET; +} + +/*! + * @brief Set the USART LIN Break detection length + * + * @param usart: Select the USART or the UART peripheral + * + * @param length: Specifies the LIN break detection length + * This parameter can be one of the following values: + * @arg USART_LBDL_10B: 10-bit break detection + * @arg USART_LBDL_10B: 11-bit break detection + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigLINBreakDetectLength(USART_T* usart, USART_LBDL_T length) +{ + usart->CTRL2_B.LBDLCFG = length; +} + +/*! + * @brief Enable the USART LIN MODE + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_EnableLIN(USART_T* usart) +{ + usart->CTRL2_B.LINMEN = BIT_SET; +} + +/*! + * @brief Disable the USART LIN MODE + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_DisableLIN(USART_T* usart) +{ + usart->CTRL2_B.LINMEN = BIT_RESET; +} + +/*! + * @brief Enable USART transmitter + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_EnableTx(USART_T* usart) +{ + usart->CTRL1_B.TXEN = BIT_SET; +} + +/*! + * @brief Disable USART transmitter + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_DisableTx(USART_T* usart) +{ + usart->CTRL1_B.TXEN = BIT_RESET; +} + +/*! + * @brief Enable USART receiver + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_EnableRx(USART_T* usart) +{ + usart->CTRL1_B.RXEN = BIT_SET; +} + +/*! + * @brief Disable USART receiver + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_DisableRx(USART_T* usart) +{ + usart->CTRL1_B.RXEN = BIT_RESET; +} + +/*! + * @brief Transmit single data + * + * @param usart: Select the USART or the UART peripheral + * + * @param data: the data to transmit + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_TxData(USART_T* usart, uint16_t data) +{ + usart->DATA_B.DATA = data; +} + +/*! + * @brief Return the most recent received data + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +uint16_t USART_RxData(USART_T* usart) +{ + return (uint16_t)usart->DATA_B.DATA; +} + +/*! + * @brief Transmit break characters + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_TxBreak(USART_T* usart) +{ + usart->CTRL1_B.TXBF = BIT_SET; +} + +/*! + * @brief Set the specified USART guard time + * + * @param usart: Select the USART or the UART peripheral + * + * @param guardTime: Specifies the guard time + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigGuardTime(USART_T* usart, uint8_t guardTime) +{ + usart->GTPSC_B.GRDT = guardTime; +} + +/*! + * @brief Set the system clock divider number + * + * @param usart: Select the USART or the UART peripheral + * + * @param div: specifies the divider number + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigPrescaler(USART_T* usart, uint8_t div) +{ + usart->GTPSC_B.PSC = div; +} + +/*! + * @brief Enable the USART Smart Card mode + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note + */ +void USART_EnableSmartCard(USART_T* usart) +{ + usart->CTRL3_B.SCEN = BIT_SET; +} + +/*! + * @brief Disable the USART Smart Card mode + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note + */ +void USART_DisableSmartCard(USART_T* usart) +{ + usart->CTRL3_B.SCEN = BIT_RESET; +} + +/*! + * @brief Enable NACK transmission + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note + */ +void USART_EnableSmartCardNACK(USART_T* usart) +{ + usart->CTRL3_B.SCNACKEN = BIT_SET; +} + +/*! + * @brief Disable NACK transmission + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note + */ +void USART_DisableSmartCardNACK(USART_T* usart) +{ + usart->CTRL3_B.SCNACKEN = BIT_RESET; +} + +/*! + * @brief Enable USART Half Duplex communication + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_EnableHalfDuplex(USART_T* usart) +{ + usart->CTRL3_B.HDEN = BIT_SET; +} + +/*! + * @brief Disable USART Half Duplex communication + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_DisableHalfDuplex(USART_T* usart) +{ + usart->CTRL3_B.HDEN = BIT_RESET; +} + +/*! + * @brief Configure the USART's IrDA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @param IrDAMode: Specifies the IrDA mode + * This parameter can be one of the following values: + * @arg USART_IRDALP_NORMAL: Normal + * @arg USART_IRDALP_LOWPOWER: Low-Power + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ConfigIrDA(USART_T* usart, USART_IRDALP_T IrDAMode) +{ + usart->CTRL3_B.IRLPEN = IrDAMode; +} + +/*! + * @brief Enable the USART's IrDA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_EnableIrDA(USART_T* usart) +{ + usart->CTRL3_B.IREN = BIT_SET; +} + +/*! + * @brief Disable the USART's IrDA interface + * + * @param usart: Select the USART or the UART peripheral + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_DisableIrDA(USART_T* usart) +{ + usart->CTRL3_B.IREN = BIT_RESET; +} + +/*! + * @brief Enable the specified USART interrupts + * + * @param usart: Select the USART or the UART peripheral + * + * @param interrupt: Specifies the USART interrupts sources + * The parameter can be one of following values: + * @arg USART_INT_PE: Parity error interrupt + * @arg USART_INT_TXBE: Tansmit data buffer empty interrupt + * @arg USART_INT_TXC: Transmission complete interrupt + * @arg USART_INT_RXBNE: Receive data buffer not empty interrupt + * @arg USART_INT_IDLE: Idle line detection interrupt + * @arg USART_INT_LBD: LIN break detection interrupt + * @arg USART_INT_CTS: CTS change interrupt + * @arg USART_INT_ERR: Error interrupt(Frame error, noise error, overrun error) + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_EnableInterrupt(USART_T* usart, USART_INT_T interrupt) +{ + uint32_t temp; + + temp = (uint32_t)(interrupt & 0xffff); + + if (interrupt & 0x10000) + { + usart->CTRL1 |= temp; + } + + if (interrupt & 0x20000) + { + usart->CTRL2 |= temp; + } + + if (interrupt & 0x40000) + { + usart->CTRL3 |= temp; + } +} + +/*! + * @brief Disable the specified USART interrupts + * + * @param usart: Select the USART or the UART peripheral + * + * @param interrupt: Specifies the USART interrupts sources + * The parameter can be one of following values: + * @arg USART_INT_PE: Parity error interrupt + * @arg USART_INT_TXBE: Tansmit data buffer empty interrupt + * @arg USART_INT_TXC: Transmission complete interrupt + * @arg USART_INT_RXBNE: Receive data buffer not empty interrupt + * @arg USART_INT_IDLE: Idle line detection interrupt + * @arg USART_INT_LBD: LIN break detection interrupt + * @arg USART_INT_CTS: CTS change interrupt + * @arg USART_INT_ERR: Error interrupt(Frame error, noise error, overrun error) + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_DisableInterrupt(USART_T* usart, USART_INT_T interrupt) +{ + uint32_t temp; + + temp = (uint32_t)~(interrupt & 0xffff); + + if (interrupt & 0x10000) + { + usart->CTRL1 &= temp; + } + + if (interrupt & 0x20000) + { + usart->CTRL2 &= temp; + } + + if (interrupt & 0x40000) + { + usart->CTRL3 &= temp; + } +} + +/*! + * @brief Read the specified USART flag + * + * @param usart: Select the USART or the UART peripheral + * + * @param flag: Specifies the flag to check + * The parameter can be one of following values: + * @arg USART_FLAG_CTS: CTS Change flag + * @arg USART_FLAG_LBD: LIN Break detection flag + * @arg USART_FLAG_TXBE: Transmit data buffer empty flag + * @arg USART_FLAG_TXC: Transmission Complete flag + * @arg USART_FLAG_RXBNE: Receive data buffer not empty flag + * @arg USART_FLAG_IDLE: Idle Line detection flag + * @arg USART_FLAG_OVRE: OverRun Error flag + * @arg USART_FLAG_NE: Noise Error flag + * @arg USART_FLAG_FE: Framing Error flag + * @arg USART_FLAG_PE: Parity Error flag + * + * @retval The new state of flag (SET or RESET) + * + * @note The usart can be USART1, USART2, USART3 + */ +uint8_t USART_ReadStatusFlag(USART_T* usart, USART_FLAG_T flag) +{ + return (usart->STS & flag) ? SET : RESET; +} + +/*! + * @brief Clears the USARTx's pending flags + * + * @param usart: Select the USART or the UART peripheral + * + * @param flag: Specifies the flag to clear + * The parameter can be one of following values: + * @arg USART_FLAG_CTS: CTS Change flag + * @arg USART_FLAG_LBD: LIN Break detection flag + * @arg USART_FLAG_TXC: Transmission Complete flag + * @arg USART_FLAG_RXBNE: Receive data buffer not empty flag + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ClearStatusFlag(USART_T* usart, USART_FLAG_T flag) +{ + usart->STS &= (uint32_t)~flag; +} + +/*! + * @brief Read the specified USART interrupt flag + * + * @param usart: Select the USART or the UART peripheral + * + * @param flag: Specifies the USART interrupt source to check + * The parameter can be one of following values: + * @arg USART_INT_TXBE: Tansmit data buffer empty interrupt + * @arg USART_INT_TXC: Transmission complete interrupt + * @arg USART_INT_RXBNE: Receive data buffer not empty interrupt + * @arg USART_INT_IDLE: Idle line detection interrupt + * @arg USART_INT_LBD: LIN break detection interrupt + * @arg USART_INT_CTS: CTS change interrupt + * @arg USART_INT_OVRE: OverRun Error interruptpt + * @arg USART_INT_NE: Noise Error interrupt + * @arg USART_INT_FE: Framing Error interrupt + * @arg USART_INT_PE: Parity error interrupt + * + * @retval The new state of flag (SET or RESET) + * + * @note The usart can be USART1, USART2, USART3 + */ +uint8_t USART_ReadIntFlag(USART_T* usart, USART_INT_T flag) +{ + uint32_t itFlag, srFlag; + + if (flag & 0x10000) + { + itFlag = usart->CTRL1 & flag & 0xffff; + } + else if (flag & 0x20000) + { + itFlag = usart->CTRL2 & flag & 0xffff; + } + else + { + itFlag = usart->CTRL3 & flag & 0xffff; + } + + srFlag = flag >> 24; + srFlag = (uint32_t)(1 << srFlag); + srFlag = usart->STS & srFlag; + + if (srFlag && itFlag) + { + return SET; + } + + return RESET; +} + +/*! + * @brief Clears the USART interrupt pending bits + * + * @param usart: Select the USART or the UART peripheral + * + * @param flag: Specifies the interrupt pending bit to clear + * The parameter can be one of following values: + * @arg USART_INT_RXBNE: Receive data buffer not empty interrupt + * @arg USART_INT_TXC: Transmission complete interrupt + * @arg USART_INT_LBD: LIN break detection interrupt + * @arg USART_INT_CTS: CTS change interrupt + * + * @retval None + * + * @note The usart can be USART1, USART2, USART3 + */ +void USART_ClearIntFlag(USART_T* usart, USART_INT_T flag) +{ + uint32_t srFlag; + + srFlag = flag >> 24; + srFlag = (uint32_t)(1 << srFlag); + + usart->STS &= (uint32_t)~srFlag; +} + +/**@} end of group USART_Functions */ +/**@} end of group USART_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_wwdt.c b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_wwdt.c new file mode 100644 index 0000000000..e9d33e5b72 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/APM32S10x_StdPeriphDriver/src/apm32s10x_wwdt.c @@ -0,0 +1,160 @@ +/*! + * @file apm32s10x_wwdt.c + * + * @brief This file contains all the functions for the WWDT peripheral + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x_wwdt.h" +#include "apm32s10x_rcm.h" + +/** @addtogroup APM32S10x_StdPeriphDriver + @{ +*/ + +/** @addtogroup WWDT_Driver WWDT Driver + @{ +*/ + +/** @defgroup WWDT_Functions Functions + @{ +*/ + +/*! + * @brief Reset the WWDT peripheral registers + * + * @param None + * + * @retval None + */ +void WWDT_Reset(void) +{ + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_WWDT); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_WWDT); +} + +/*! + * @brief Configure the WWDT Timebase + * + * @param timebase: WWDT Prescaler + * The parameter can be one of following values: + * @arg WWDT_TIME_BASE_1: WWDT counter clock = (PCLK1/4096)/1 + * @arg WWDT_TIME_BASE_2: WWDT counter clock = (PCLK1/4096)/2 + * @arg WWDT_TIME_BASE_4: WWDT counter clock = (PCLK1/4096)/4 + * @arg WWDT_TIME_BASE_8: WWDT counter clock = (PCLK1/4096)/8 + * + * @retval None + */ +void WWDT_ConfigTimebase(WWDT_TIME_BASE_T timeBase) +{ + __IO uint32_t reg; + + reg = WWDT->CFG & 0xFFFFFE7F; + reg |= timeBase; + WWDT->CFG = reg; +} + +/*! + * @brief Configure the WWDT Window data + * + * @param windowdata: window data which compare with the downcounter + * + * @retval None + * + * @note The windowdata must be lower than 0x80 + */ +void WWDT_ConfigWindowData(uint8_t windowData) +{ + __IO uint32_t reg; + + reg = WWDT->CFG & 0xFFFFFF80; + reg |= windowData & 0x7F; + WWDT->CFG = reg; +} + +/*! + * @brief Configure the WWDT counter value + * + * @param counter: Specify the watchdog counter value + * + * @retval None + * + * @note The counter between 0x40 and 0x7F + */ +void WWDT_ConfigCounter(uint8_t counter) +{ + WWDT->CTRL = counter & 0x7F; +} + +/*! + * @brief Enable the WWDT Early Wakeup interrupt + * + * @param None + * + * @retval None + */ +void WWDT_EnableEWI(void) +{ + WWDT->CFG_B.EWIEN = SET; +} + +/*! + * @brief Enable WWDT and set the counter value + * + * @param counter: the window watchdog counter value + * + * @retval None + * + * @note The counter between 0x40 and 0x7F + */ +void WWDT_Enable(uint8_t counter) +{ + WWDT->CTRL = counter | 0x00000080; +} + +/*! + * @brief Read the Early Wakeup interrupt flag + * + * @param None + * + * @retval the state of the Early Wakeup interrupt flag + */ +uint8_t WWDT_ReadFlag(void) +{ + return (uint8_t)WWDT->STS; +} + +/*! + * @brief Clear the Early Wakeup interrupt flag + * + * @param None + * + * @retval None + */ +void WWDT_ClearFlag(void) +{ + WWDT->STS_B.EWIFLG = RESET; +} + +/**@} end of group WWDT_Functions */ +/**@} end of group WWDT_Driver */ +/**@} end of group APM32S10x_StdPeriphDriver */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armcc.h b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armcc.h new file mode 100644 index 0000000000..a19425d9fe --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armcc.h @@ -0,0 +1,894 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.1.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + +/* CMSIS compiler control DSP macros */ +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __ARM_FEATURE_DSP 1 +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __memory_changed() +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/**@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/**@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armclang.h b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armclang.h new file mode 100644 index 0000000000..ef919934c5 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armclang.h @@ -0,0 +1,1444 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/**@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +#define __SADD8 __builtin_arm_sadd8 +#define __QADD8 __builtin_arm_qadd8 +#define __SHADD8 __builtin_arm_shadd8 +#define __UADD8 __builtin_arm_uadd8 +#define __UQADD8 __builtin_arm_uqadd8 +#define __UHADD8 __builtin_arm_uhadd8 +#define __SSUB8 __builtin_arm_ssub8 +#define __QSUB8 __builtin_arm_qsub8 +#define __SHSUB8 __builtin_arm_shsub8 +#define __USUB8 __builtin_arm_usub8 +#define __UQSUB8 __builtin_arm_uqsub8 +#define __UHSUB8 __builtin_arm_uhsub8 +#define __SADD16 __builtin_arm_sadd16 +#define __QADD16 __builtin_arm_qadd16 +#define __SHADD16 __builtin_arm_shadd16 +#define __UADD16 __builtin_arm_uadd16 +#define __UQADD16 __builtin_arm_uqadd16 +#define __UHADD16 __builtin_arm_uhadd16 +#define __SSUB16 __builtin_arm_ssub16 +#define __QSUB16 __builtin_arm_qsub16 +#define __SHSUB16 __builtin_arm_shsub16 +#define __USUB16 __builtin_arm_usub16 +#define __UQSUB16 __builtin_arm_uqsub16 +#define __UHSUB16 __builtin_arm_uhsub16 +#define __SASX __builtin_arm_sasx +#define __QASX __builtin_arm_qasx +#define __SHASX __builtin_arm_shasx +#define __UASX __builtin_arm_uasx +#define __UQASX __builtin_arm_uqasx +#define __UHASX __builtin_arm_uhasx +#define __SSAX __builtin_arm_ssax +#define __QSAX __builtin_arm_qsax +#define __SHSAX __builtin_arm_shsax +#define __USAX __builtin_arm_usax +#define __UQSAX __builtin_arm_uqsax +#define __UHSAX __builtin_arm_uhsax +#define __USAD8 __builtin_arm_usad8 +#define __USADA8 __builtin_arm_usada8 +#define __SSAT16 __builtin_arm_ssat16 +#define __USAT16 __builtin_arm_usat16 +#define __UXTB16 __builtin_arm_uxtb16 +#define __UXTAB16 __builtin_arm_uxtab16 +#define __SXTB16 __builtin_arm_sxtb16 +#define __SXTAB16 __builtin_arm_sxtab16 +#define __SMUAD __builtin_arm_smuad +#define __SMUADX __builtin_arm_smuadx +#define __SMLAD __builtin_arm_smlad +#define __SMLADX __builtin_arm_smladx +#define __SMLALD __builtin_arm_smlald +#define __SMLALDX __builtin_arm_smlaldx +#define __SMUSD __builtin_arm_smusd +#define __SMUSDX __builtin_arm_smusdx +#define __SMLSD __builtin_arm_smlsd +#define __SMLSDX __builtin_arm_smlsdx +#define __SMLSLD __builtin_arm_smlsld +#define __SMLSLDX __builtin_arm_smlsldx +#define __SEL __builtin_arm_sel +#define __QADD __builtin_arm_qadd +#define __QSUB __builtin_arm_qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/**@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armclang_ltm.h b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armclang_ltm.h new file mode 100644 index 0000000000..356182c5f9 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_armclang_ltm.h @@ -0,0 +1,1891 @@ +/**************************************************************************//** + * @file cmsis_armclang_ltm.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V1.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2018-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/**@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/**@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_compiler.h b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_compiler.h new file mode 100644 index 0000000000..adbf296f15 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_compiler.h @@ -0,0 +1,283 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.1.0 + * @date 09. October 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6.6 LTM (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #include "cmsis_armclang_ltm.h" + + /* + * Arm Compiler above 6.10.1 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #define __RESTRICT __restrict + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_gcc.h b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 0000000000..67bda4ef3c --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,2211 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.4.1 + * @date 27. May 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START + +/** + \brief Initializes data and bss sections + \details This default implementations initialized all data and additional bss + sections relying on .copy.table and .zero.table specified properly + in the used linker script. + + */ +__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) +{ + extern void _start(void) __NO_RETURN; + + typedef struct { + uint32_t const* src; + uint32_t* dest; + uint32_t wlen; + } __copy_table_t; + + typedef struct { + uint32_t* dest; + uint32_t wlen; + } __zero_table_t; + + extern const __copy_table_t __copy_table_start__; + extern const __copy_table_t __copy_table_end__; + extern const __zero_table_t __zero_table_start__; + extern const __zero_table_t __zero_table_end__; + + for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = pTable->src[i]; + } + } + + for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = 0u; + } + } + + _start(); +} + +#define __PROGRAM_START __cmsis_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP __StackTop +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT __StackLimit +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors"))) +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +#ifndef __STACK_SEAL +#define __STACK_SEAL __StackSeal +#endif + +#ifndef __TZ_STACK_SEAL_SIZE +#define __TZ_STACK_SEAL_SIZE 8U +#endif + +#ifndef __TZ_STACK_SEAL_VALUE +#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL +#endif + + +__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { + *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; +} +#endif + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi":::"memory") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe":::"memory") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1, ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1, ARG2) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + __ISB(); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + __ISB(); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1, ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + +#define __USAT16(ARG1, ARG2) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16_RORn(uint32_t op1, uint32_t rotate) +{ + uint32_t result; + if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { + __ASM volatile ("sxtb16 %0, %1, ROR %2" : "=r" (result) : "r" (op1), "i" (rotate) ); + } else { + result = __SXTB16(__ROR(op1, rotate)) ; + } + return result; +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16_RORn(uint32_t op1, uint32_t op2, uint32_t rotate) +{ + uint32_t result; + if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { + __ASM volatile ("sxtab16 %0, %1, %2, ROR %3" : "=r" (result) : "r" (op1) , "r" (op2) , "i" (rotate)); + } else { + result = __SXTAB16(op1, __ROR(op2, rotate)); + } + return result; +} + + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +#define __PKHBT(ARG1,ARG2,ARG3) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_iccarm.h b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_iccarm.h new file mode 100644 index 0000000000..11c4af0eba --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_iccarm.h @@ -0,0 +1,935 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.7 + * @date 19. June 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_version.h b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_version.h new file mode 100644 index 0000000000..660f612aa3 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/core_cm3.h b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/core_cm3.h new file mode 100644 index 0000000000..8157ca782d --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/Include/core_cm3.h @@ -0,0 +1,1937 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 13. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M3 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (3U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200U + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1U]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ +#endif + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/apm32/libraries/APM32S10x_Library/CMSIS/LICENSE.txt b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/LICENSE.txt new file mode 100644 index 0000000000..f0cd2d9ccf --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/CMSIS/LICENSE.txt @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Include/apm32s10x.h b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Include/apm32s10x.h new file mode 100644 index 0000000000..f185354901 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Include/apm32s10x.h @@ -0,0 +1,4528 @@ +/*! + * @file apm32s10x.h + * + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * + * @details This file contains all the peripheral register's definitions, bits definitions and memory mapping + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __APM32S10X_H +#define __APM32S10X_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + * APM32S10X_MD: APM32 Medium density devices, the Flash memory density ranges between 64 and 128 Kbytes. + */ +#if !defined (APM32S10X_MD) +#error "Please select a the target APM32S10x device used in your application (in apm32s10x.h file)" +#endif + +/** @addtogroup CMSIS + @{ +*/ + +/** @addtogroup APM32S10x + * @brief Peripheral Access Layer + @{ +*/ + +/** @defgroup HSE_Macros + @{ +*/ + +/*! + * @brief Define Value of the External oscillator in Hz + */ +#ifndef HSE_VALUE +#define HSE_VALUE ((uint32_t)8000000) +#endif + +/* Time out for HSE start up */ +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x05000) + +/* Value of the Internal oscillator in Hz */ +#define HSI_VALUE ((uint32_t)8000000) + +/**@} end of group HSE_Macros */ + +/** @defgroup APM32S10x_StdPeripheral_Library_Version + @{ +*/ + +/*! + * @brief APM32S10x Standard Peripheral Library version number + */ +#define __APM32S10X_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ +#define __APM32S10X_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ +#define __APM32S10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __APM32S10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __APM32S10X_STDPERIPH_VERSION ( (__APM32S10X_STDPERIPH_VERSION_MAIN << 24)\ + |(__APM32S10X_STDPERIPH_VERSION_SUB1 << 16)\ + |(__APM32S10X_STDPERIPH_VERSION_SUB2 << 8)\ + |(__APM32S10X_STDPERIPH_VERSION_RC)) + +/**@} end of group APM32S10x_StdPeripheral_Library_Version */ + +/** @defgroup Configuraion_for_CMSIS + @{ +*/ + +/* APM32 devices does not provide an MPU */ +#define __MPU_PRESENT 0 +/* APM32 uses 4 Bits for the Priority Levels */ +#define __NVIC_PRIO_BITS 4 +/* Set to 1 if different SysTick Config is used */ +#define __Vendor_SysTickConfig 0 + +/**@} end of group Configuraion_for_CMSIS */ + +/** @defgroup Peripheral_Enumerations + @{ +*/ + +/*! + * @brief APM32S10x Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum IRQn +{ + /*!**** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + + /*!**** APM32 specific Interrupt Numbers *********************************************************/ + WWDT_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EINT Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCM_IRQn = 5, /*!< RCM global Interrupt */ + EINT0_IRQn = 6, /*!< EINT Line0 Interrupt */ + EINT1_IRQn = 7, /*!< EINT Line1 Interrupt */ + EINT2_IRQn = 8, /*!< EINT Line2 Interrupt */ + EINT3_IRQn = 9, /*!< EINT Line3 Interrupt */ + EINT4_IRQn = 10, /*!< EINT Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + +#if defined (APM32S10X_MD) + /* APM32S10X Medium-density devices specific Interrupt Numbers */ + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USBD1_HP_CAN1_TX_IRQn = 19, /*!< USB Device 1 High Priority or CAN1 TX Interrupts */ + USBD1_LP_CAN1_RX0_IRQn = 20, /*!< USB Device 1 Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EINT9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TMR1_BRK_IRQn = 24, /*!< TMR1 Break Interrupt */ + TMR1_UP_IRQn = 25, /*!< TMR1 Update Interrupt */ + TMR1_TRG_COM_IRQn = 26, /*!< TMR1 Trigger and Commutation Interrupt */ + TMR1_CC_IRQn = 27, /*!< TMR1 Capture Compare Interrupt */ + TMR2_IRQn = 28, /*!< TMR2 global Interrupt */ + TMR3_IRQn = 29, /*!< TMR3 global Interrupt */ + TMR4_IRQn = 30, /*!< TMR4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EINT15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EINT Line Interrupt */ + USBDWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EINT Line Interrupt */ + FPU_IRQn = 43, /*!< FPU Global Interrupt */ + QSPI_IRQn = 44, /*!< QSPI Global Interrupt */ + USBD2_HP_CAN2_TX_IRQn = 45, /*!< USB Device 2 High Priority or CAN2 TX Interrupts */ + USBD2_LP_CAN2_RX0_IRQn = 46, /*!< USB Device 2 Low Priority or CAN2 RX0 Interrupts */ + CAN2_RX1_IRQn = 47, /*!< CAN2 RX1 Interrupts */ + CAN2_SCE_IRQn = 48, /*!< CAN2 SCE Interrupts */ +#endif +} IRQn_Type; + +/**@} end of group Peripheral_Enumerations */ + +/* Includes */ +#include "core_cm3.h" +#include "system_apm32s10x.h" +#include + +/** @defgroup Exported_Types + @{ +*/ + +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef const int32_t sc32; +typedef const int16_t sc16; +typedef const int8_t sc8; + +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef __I int32_t vsc32; +typedef __I int16_t vsc16; +typedef __I int8_t vsc8; + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef const uint32_t uc32; +typedef const uint16_t uc16; +typedef const uint8_t uc8; + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef __I uint32_t vuc32; +typedef __I uint16_t vuc16; +typedef __I uint8_t vuc8; + +#ifndef __IM +#define __IM __I +#endif +#ifndef __OM +#define __OM __O +#endif +#ifndef __IOM +#define __IOM __IO +#endif + +enum {BIT_RESET, BIT_SET}; +enum {RESET, SET}; +enum {DISABLE, ENABLE}; +enum {ERROR, SUCCESS}; + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#if defined (__CC_ARM ) +#pragma anon_unions +#endif + +/**@} end of group Exported_types */ + +/** @defgroup Peripheral_registers_structures + @{ +*/ + +/*! + * @brief Reset and clock management unit (RCM) + */ +typedef struct +{ + /* Clock control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t HSIEN : 1; + __IM uint32_t HSIRDYFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t HSITRIM : 5; + __IM uint32_t HSICAL : 8; + __IOM uint32_t HSEEN : 1; + __IM uint32_t HSERDYFLG : 1; + __IOM uint32_t HSEBCFG : 1; + __IOM uint32_t CSSEN : 1; + __IM uint32_t RESERVED2 : 4; + __IOM uint32_t PLLEN : 1; + __IM uint32_t PLLRDYFLG : 1; + __IM uint32_t RESERVED3 : 6; + } CTRL_B; + }; + + /* Clock configuration register */ + union + { + __IOM uint32_t CFG; + + struct + { + __IOM uint32_t SCLKSEL : 2; + __IM uint32_t SCLKSELSTS : 2; + __IOM uint32_t AHBPSC : 4; + __IOM uint32_t APB1PSC : 3; + __IOM uint32_t APB2PSC : 3; + __IOM uint32_t ADCPSC : 2; + __IOM uint32_t PLLSRCSEL : 1; + __IOM uint32_t PLLHSEPSC : 1; + __IOM uint32_t PLLMULCFG : 4; + __IOM uint32_t USBDPSC : 2; + __IOM uint32_t MCOSEL : 3; + __IOM uint32_t FPUPSC : 1; + __IM uint32_t RESERVED : 4; + } CFG_B; + } ; + + /* Clock interrupt control register */ + union + { + __IOM uint32_t INT; + + struct + { + __IM uint32_t LSIRDYFLG : 1; + __IM uint32_t LSERDYFLG : 1; + __IM uint32_t HSIRDYFLG : 1; + __IM uint32_t HSERDYFLG : 1; + __IM uint32_t PLLRDYFLG : 1; + __IM uint32_t RESERVED1 : 2; + __IM uint32_t CSSIF : 1; + __IOM uint32_t LSIRDYEN : 1; + __IOM uint32_t LSERDYEN : 1; + __IOM uint32_t HSIRDYEN : 1; + __IOM uint32_t HSERDYEN : 1; + __IOM uint32_t PLLRDYEN : 1; + __IM uint32_t RESERVED2 : 3; + __OM uint32_t LSIRDYCLR : 1; + __OM uint32_t LSERDYCLR : 1; + __OM uint32_t HSIRDYCLR : 1; + __OM uint32_t HSERDYCLR : 1; + __OM uint32_t PLLRDYCLR : 1; + __IM uint32_t RESERVED3 : 2; + __OM uint32_t CSSCLR : 1; + __IM uint32_t RESERVED4 : 8; + } INT_B; + } ; + + /* APB2 peripheral reset register */ + union + { + __IOM uint32_t APB2RST; + + struct + { + __IOM uint32_t AFIO : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t PA : 1; + __IOM uint32_t PB : 1; + __IOM uint32_t PC : 1; + __IOM uint32_t PD : 1; + __IOM uint32_t PE : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t ADC1 : 1; + __IOM uint32_t ADC2 : 1; + __IOM uint32_t TMR1 : 1; + __IOM uint32_t SPI1 : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t USART1 : 1; + __IM uint32_t RESERVED4 : 17; + } APB2RST_B; + } ; + + /* APB1 peripheral reset register */ + union + { + __IOM uint32_t APB1RST; + + struct + { + __IOM uint32_t TMR2 : 1; + __IOM uint32_t TMR3 : 1; + __IOM uint32_t TMR4 : 1; + __IM uint32_t RESERVED1 : 8; + __IOM uint32_t WWDT : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t SPI2 : 1; + __IM uint32_t RESERVED3 : 2; + __IOM uint32_t USART2 : 1; + __IOM uint32_t USART3 : 1; + __IM uint32_t RESERVED4 : 2; + __IOM uint32_t I2C1 : 1; + __IOM uint32_t I2C2 : 1; + __IOM uint32_t USBD : 1; + __IM uint32_t RESERVED5 : 1; + __IOM uint32_t CAN1 : 1; + __IM uint32_t CAN2 : 1; + __IOM uint32_t BAKP : 1; + __IOM uint32_t PMU : 1; + __IM uint32_t RESERVED6 : 3; + } APB1RST_B; + } ; + + /* AHB clock enable register */ + union + { + __IOM uint32_t AHBCLKEN; + + struct + { + __IOM uint32_t DMA1 : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t SRAM : 1; + __IOM uint32_t FPU : 1; + __IOM uint32_t FMC : 1; + __IOM uint32_t QSPI : 1; + __IOM uint32_t CRC : 1; + __IM uint32_t RESERVED2 : 25; + } AHBCLKEN_B; + } ; + + /* APB2 clock enable register */ + union + { + __IOM uint32_t APB2CLKEN; + + struct + { + __IOM uint32_t AFIO : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t PA : 1; + __IOM uint32_t PB : 1; + __IOM uint32_t PC : 1; + __IOM uint32_t PD : 1; + __IOM uint32_t PE : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t ADC1 : 1; + __IOM uint32_t ADC2 : 1; + __IOM uint32_t TMR1 : 1; + __IOM uint32_t SPI1 : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t USART1 : 1; + __IM uint32_t RESERVED4 : 17; + } APB2CLKEN_B; + }; + + /* APB1 clock enable register */ + union + { + __IOM uint32_t APB1CLKEN; + + struct + { + __IOM uint32_t TMR2 : 1; + __IOM uint32_t TMR3 : 1; + __IOM uint32_t TMR4 : 1; + __IM uint32_t RESERVED1 : 8; + __IOM uint32_t WWDT : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t SPI2 : 1; + __IM uint32_t RESERVED3 : 2; + __IOM uint32_t USART2 : 1; + __IOM uint32_t USART3 : 1; + __IM uint32_t RESERVED4 : 2; + __IOM uint32_t I2C1 : 1; + __IOM uint32_t I2C2 : 1; + __IOM uint32_t USBD : 1; + __IM uint32_t RESERVED5 : 1; + __IOM uint32_t CAN1 : 1; + __IM uint32_t CAN2 : 1; + __IOM uint32_t BAKP : 1; + __IOM uint32_t PMU : 1; + __IM uint32_t RESERVED6 : 3; + } APB1CLKEN_B; + } ; + + /* Backup domain control register */ + union + { + __IOM uint32_t BDCTRL; + + struct + { + __IOM uint32_t LSEEN : 1; + __IM uint32_t LSERDYFLG : 1; + __IOM uint32_t LSEBCFG : 1; + __IM uint32_t RESERVED1 : 5; + __IOM uint32_t RTCSRCSEL : 2; + __IM uint32_t RESERVED2 : 5; + __IOM uint32_t RTCCLKEN : 1; + __IOM uint32_t BDRST : 1; + __IM uint32_t RESERVED3 : 15; + } BDCTRL_B; + } ; + + /* Control/status register */ + union + { + __IOM uint32_t CSTS; + + struct + { + __IOM uint32_t LSIEN : 1; + __IM uint32_t LSIRDYFLG : 1; + __IM uint32_t RESERVED1 : 22; + __IOM uint32_t RSTFLGCLR : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t NRSTFLG : 1; + __IOM uint32_t PODRSTFLG : 1; + __IOM uint32_t SWRSTFLG : 1; + __IOM uint32_t IWDTRSTFLG : 1; + __IOM uint32_t WWDTRSTFLG : 1; + __IOM uint32_t LPWRRSTFLG : 1; + } CSTS_B; + } ; +} RCM_T; + +/*! + * @brief General purpose I/O (GPIO) + */ +typedef struct +{ + /* Port configure register low */ + union + { + __IOM uint32_t CFGLOW; + + struct + { + __IOM uint32_t MODE0 : 2; + __IOM uint32_t CFG0 : 2; + __IOM uint32_t MODE1 : 2; + __IOM uint32_t CFG1 : 2; + __IOM uint32_t MODE2 : 2; + __IOM uint32_t CFG2 : 2; + __IOM uint32_t MODE3 : 2; + __IOM uint32_t CFG3 : 2; + __IOM uint32_t MODE4 : 2; + __IOM uint32_t CFG4 : 2; + __IOM uint32_t MODE5 : 2; + __IOM uint32_t CFG5 : 2; + __IOM uint32_t MODE6 : 2; + __IOM uint32_t CFG6 : 2; + __IOM uint32_t MODE7 : 2; + __IOM uint32_t CFG7 : 2; + } CFGLOW_B; + } ; + + /* Port configure register high */ + union + { + __IOM uint32_t CFGHIG; + + struct + { + __IOM uint32_t MODE8 : 2; + __IOM uint32_t CFG8 : 2; + __IOM uint32_t MODE9 : 2; + __IOM uint32_t CFG9 : 2; + __IOM uint32_t MODE10 : 2; + __IOM uint32_t CFG10 : 2; + __IOM uint32_t MODE11 : 2; + __IOM uint32_t CFG11 : 2; + __IOM uint32_t MODE12 : 2; + __IOM uint32_t CFG12 : 2; + __IOM uint32_t MODE13 : 2; + __IOM uint32_t CFG13 : 2; + __IOM uint32_t MODE14 : 2; + __IOM uint32_t CFG14 : 2; + __IOM uint32_t MODE15 : 2; + __IOM uint32_t CFG15 : 2; + } CFGHIG_B; + } ; + + /* Port data in register */ + union + { + __IM uint32_t IDATA; + + struct + { + __IM uint32_t IDATA0 : 1; + __IM uint32_t IDATA1 : 1; + __IM uint32_t IDATA2 : 1; + __IM uint32_t IDATA3 : 1; + __IM uint32_t IDATA4 : 1; + __IM uint32_t IDATA5 : 1; + __IM uint32_t IDATA6 : 1; + __IM uint32_t IDATA7 : 1; + __IM uint32_t IDATA8 : 1; + __IM uint32_t IDATA9 : 1; + __IM uint32_t IDATA10 : 1; + __IM uint32_t IDATA11 : 1; + __IM uint32_t IDATA12 : 1; + __IM uint32_t IDATA13 : 1; + __IM uint32_t IDATA14 : 1; + __IM uint32_t IDATA15 : 1; + __IM uint32_t RESERVED : 16; + } IDATA_B; + } ; + + /* Port data output register */ + union + { + __IOM uint32_t ODATA; + + struct + { + __IOM uint32_t ODATA0 : 1; + __IOM uint32_t ODATA1 : 1; + __IOM uint32_t ODATA2 : 1; + __IOM uint32_t ODATA3 : 1; + __IOM uint32_t ODATA4 : 1; + __IOM uint32_t ODATA5 : 1; + __IOM uint32_t ODATA6 : 1; + __IOM uint32_t ODATA7 : 1; + __IOM uint32_t ODATA8 : 1; + __IOM uint32_t ODATA9 : 1; + __IOM uint32_t ODATA10 : 1; + __IOM uint32_t ODATA11 : 1; + __IOM uint32_t ODATA12 : 1; + __IOM uint32_t ODATA13 : 1; + __IOM uint32_t ODATA14 : 1; + __IOM uint32_t ODATA15 : 1; + __IM uint32_t RESERVED : 16; + } ODATA_B; + } ; + + /* Port bit set/clear register */ + union + { + __OM uint32_t BSC; + + struct + { + __OM uint32_t BS0 : 1; + __OM uint32_t BS1 : 1; + __OM uint32_t BS2 : 1; + __OM uint32_t BS3 : 1; + __OM uint32_t BS4 : 1; + __OM uint32_t BS5 : 1; + __OM uint32_t BS6 : 1; + __OM uint32_t BS7 : 1; + __OM uint32_t BS8 : 1; + __OM uint32_t BS9 : 1; + __OM uint32_t BS10 : 1; + __OM uint32_t BS11 : 1; + __OM uint32_t BS12 : 1; + __OM uint32_t BS13 : 1; + __OM uint32_t BS14 : 1; + __OM uint32_t BS15 : 1; + __OM uint32_t BR0 : 1; + __OM uint32_t BC1 : 1; + __OM uint32_t BC2 : 1; + __OM uint32_t BR3 : 1; + __OM uint32_t BC4 : 1; + __OM uint32_t BC5 : 1; + __OM uint32_t BC6 : 1; + __OM uint32_t BC7 : 1; + __OM uint32_t BC8 : 1; + __OM uint32_t BC9 : 1; + __OM uint32_t BC10 : 1; + __OM uint32_t BC11 : 1; + __OM uint32_t BC12 : 1; + __OM uint32_t BC13 : 1; + __OM uint32_t BC14 : 1; + __OM uint32_t BC15 : 1; + } BSC_B; + } ; + + /* Port bit clear register */ + union + { + __OM uint32_t BC; + + struct + { + __OM uint32_t BC0 : 1; + __OM uint32_t BC1 : 1; + __OM uint32_t BC2 : 1; + __OM uint32_t BC3 : 1; + __OM uint32_t BC4 : 1; + __OM uint32_t BC5 : 1; + __OM uint32_t BC6 : 1; + __OM uint32_t BC7 : 1; + __OM uint32_t BC8 : 1; + __OM uint32_t BC9 : 1; + __OM uint32_t BC10 : 1; + __OM uint32_t BC11 : 1; + __OM uint32_t BC12 : 1; + __OM uint32_t BC13 : 1; + __OM uint32_t BC14 : 1; + __OM uint32_t BC15 : 1; + __IM uint32_t RESERVED : 16; + } BC_B; + } ; + + /* Port configuration lock register */ + union + { + __IOM uint32_t LOCK; + + struct + { + __IOM uint32_t LOCK0 : 1; + __IOM uint32_t LOCK1 : 1; + __IOM uint32_t LOCK2 : 1; + __IOM uint32_t LOCK3 : 1; + __IOM uint32_t LOCK4 : 1; + __IOM uint32_t LOCK5 : 1; + __IOM uint32_t LOCK6 : 1; + __IOM uint32_t LOCK7 : 1; + __IOM uint32_t LOCK8 : 1; + __IOM uint32_t LOCK9 : 1; + __IOM uint32_t LOCK10 : 1; + __IOM uint32_t LOCK11 : 1; + __IOM uint32_t LOCK12 : 1; + __IOM uint32_t LOCK13 : 1; + __IOM uint32_t LOCK14 : 1; + __IOM uint32_t LOCK15 : 1; + __IOM uint32_t LOCKKEY : 1; + __IM uint32_t RESERVED : 16; + } LOCK_B; + } ; +} GPIO_T; + +/*! + * @brief Alternate function I/O (AFIO) + */ +typedef struct +{ + /* Event control register */ + union + { + __IOM uint32_t EVCTRL; + + struct + { + __IOM uint32_t PINSEL : 4; + __IOM uint32_t PORTSEL : 3; + __IOM uint32_t EVOEN : 1; + __IM uint32_t RESERVED : 24; + } EVCTRL_B; + } ; + + /* Alternate function IO remap and Serial wire JTAG configuration register */ + union + { + __IOM uint32_t REMAP1; + + struct + { + __IOM uint32_t SPI1RMP : 1; + __IOM uint32_t I2C1RMP : 1; + __IOM uint32_t USART1RMP : 1; + __IOM uint32_t USART2RMP : 1; + __IOM uint32_t USART3RMP : 2; + __IOM uint32_t TMR1RMP : 2; + __IOM uint32_t TMR2RMP : 2; + __IOM uint32_t TMR3RMP : 2; + __IOM uint32_t TMR4RMP : 1; + __IOM uint32_t CAN1RMP : 2; + __IOM uint32_t PD01RMP : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t ADC1_ETRGINJC_RMP : 1; + __IOM uint32_t ADC1_ETRGREGC_RMP : 1; + __IOM uint32_t ADC2_ETRGINJC_RMP : 1; + __IOM uint32_t ADC2_ETRGREGC_RMP : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t CAN2RMP : 1; + __IM uint32_t RESERVED3 : 1; + __OM uint32_t SWJCFG : 3; + __IM uint32_t RESERVED4 : 5; + } REMAP1_B; + } ; + + /* External interrupt select register1 */ + union + { + __IOM uint32_t EINTSEL1; + + struct + { + __IOM uint32_t EINT0 : 4; + __IOM uint32_t EINT1 : 4; + __IOM uint32_t EINT2 : 4; + __IOM uint32_t EINT3 : 4; + __IM uint32_t RESERVED : 16; + } EINTSEL1_B; + } ; + + /* External interrupt select register2 */ + union + { + __IOM uint32_t EINTSEL2; + + struct + { + __IOM uint32_t EINT4 : 4; + __IOM uint32_t EINT5 : 4; + __IOM uint32_t EINT6 : 4; + __IOM uint32_t EINT7 : 4; + __IM uint32_t RESERVED : 16; + } EINTSEL2_B; + } ; + + /* External interrupt select register3 */ + union + { + __IOM uint32_t EINTSEL3; + + struct + { + __IOM uint32_t EINT8 : 4; + __IOM uint32_t EINT9 : 4; + __IOM uint32_t EINT10 : 4; + __IOM uint32_t EINT11 : 4; + __IM uint32_t RESERVED : 16; + } EINTSEL3_B; + } ; + + /* External interrupt select register4 */ + union + { + __IOM uint32_t EINTSEL4; + + struct + { + __IOM uint32_t EINT12 : 4; + __IOM uint32_t EINT13 : 4; + __IOM uint32_t EINT14 : 4; + __IOM uint32_t EINT15 : 4; + __IM uint32_t RESERVED : 16; + } EINTSEL4_B; + } ; +} AFIO_T; + +/*! + * @brief Universal synchronous asynchronous receiver transmitter (USART) + */ +typedef struct +{ + /* Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IM uint32_t PEFLG : 1; + __IM uint32_t FEFLG : 1; + __IM uint32_t NEFLG : 1; + __IM uint32_t OVREFLG : 1; + __IM uint32_t IDLEFLG : 1; + __IOM uint32_t RXBNEFLG : 1; + __IOM uint32_t TXCFLG : 1; + __IM uint32_t TXBEFLG : 1; + __IOM uint32_t LBDFLG : 1; + __IOM uint32_t CTSFLG : 1; + __IM uint32_t RESERVED : 22; + } STS_B; + } ; + + /* TX Buffer Data Register */ + union + { + __IOM uint32_t DATA; + + struct + { + __IOM uint32_t DATA : 9; + __IM uint32_t RESERVED : 23; + } DATA_B; + } ; + + /* Baud rate register */ + union + { + __IOM uint32_t BR; + + struct + { + __IOM uint32_t FBR : 4; + __IOM uint32_t IBR : 12; + __IM uint32_t RESERVED : 16; + } BR_B; + } ; + + /* Control register 1 */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t TXBF : 1; + __IOM uint32_t RXMUTEEN : 1; + __IOM uint32_t RXEN : 1; + __IOM uint32_t TXEN : 1; + __IOM uint32_t IDLEIEN : 1; + __IOM uint32_t RXBNEIEN : 1; + __IOM uint32_t TXCIEN : 1; + __IOM uint32_t TXBEIEN : 1; + __IOM uint32_t PEIEN : 1; + __IOM uint32_t PCFG : 1; + __IOM uint32_t PCEN : 1; + __IOM uint32_t WUPMCFG : 1; + __IOM uint32_t DBLCFG : 1; + __IOM uint32_t UEN : 1; + __IM uint32_t RESERVED : 18; + } CTRL1_B; + } ; + + /* Control register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t ADDR : 4; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t LBDLCFG : 1; + __IOM uint32_t LBDIEN : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t LBCPOEN : 1; + __IOM uint32_t CPHA : 1; + __IOM uint32_t CPOL : 1; + __IOM uint32_t CLKEN : 1; + __IOM uint32_t STOPCFG : 2; + __IOM uint32_t LINMEN : 1; + __IM uint32_t RESERVED3 : 17; + } CTRL2_B; + } ; + + /* Control register 3 */ + union + { + __IOM uint32_t CTRL3; + + struct + { + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t IREN : 1; + __IOM uint32_t IRLPEN : 1; + __IOM uint32_t HDEN : 1; + __IOM uint32_t SCNACKEN : 1; + __IOM uint32_t SCEN : 1; + __IOM uint32_t DMARXEN : 1; + __IOM uint32_t DMATXEN : 1; + __IOM uint32_t RTSEN : 1; + __IOM uint32_t CTSEN : 1; + __IOM uint32_t CTSIEN : 1; + __IM uint32_t RESERVED : 21; + } CTRL3_B; + } ; + + /* Guard TMRe and divider number register */ + union + { + __IOM uint32_t GTPSC; + + struct + { + __IOM uint32_t PSC : 8; + __IOM uint32_t GRDT : 8; + __IM uint32_t RESERVED : 16; + } GTPSC_B; + } ; +} USART_T; + +/*! + * @brief Flash memory controller(FMC) + */ +typedef struct +{ + /* FMC access control register */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t WS : 3; + __IOM uint32_t HCAEN : 1; + __IOM uint32_t PBEN : 1; + __IM uint32_t PBSF : 1; + __IM uint32_t RESERVED : 26; + } CTRL1_B; + } ; + + /* key register */ + union + { + __OM uint32_t KEY; + + struct + { + __OM uint32_t KEY : 32; + } KEY_B; + } ; + + /* option byte key register */ + union + { + __OM uint32_t OBKEY; + + struct + { + __OM uint32_t OBKEY : 32; + } OBKEY_B; + }; + + /* status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IM uint32_t BUSYF : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t PEF : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t WPEF : 1; + __IOM uint32_t OCF : 1; + __IM uint32_t RESERVED3 : 26; + } STS_B; + }; + + /* status register */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t PG : 1; + __IOM uint32_t PAGEERA : 1; + __IOM uint32_t MASSERA : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t OBP : 1; + __IOM uint32_t OBE : 1; + __IOM uint32_t STA : 1; + __IOM uint32_t LOCK : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t OBWEN : 1; + __IOM uint32_t ERRIE : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t OCIE : 1; + __IM uint32_t RESERVED4 : 19; + } CTRL2_B; + } ; + + /* address register */ + union + { + __OM uint32_t ADDR; + + struct + { + __OM uint32_t ADDR : 32; + } ADDR_B; + }; + + __IM uint32_t RESERVED; + + /* Option byte register */ + union + { + __IOM uint32_t OBCS; + + struct + { + __IM uint32_t OBE : 1; + __IM uint32_t READPROT : 1; + __IM uint32_t WDTSEL : 1; + __IM uint32_t RSTSTOP : 1; + __IM uint32_t RSTSTDB : 1; + __IM uint32_t UOB : 5; + __IM uint32_t DATA0 : 8; + __IM uint32_t DATA1 : 8; + __IM uint32_t RESERVED : 6; + } OBCS_B; + }; + + /* Write protection register */ + union + { + __IM uint32_t WRTPROT; + + struct + { + __IM uint32_t WRTPORT : 32; + } WRTPORT_B; + }; +} FMC_T; + +/*! + * @brief CRC calculation unit (CRC) + */ +typedef struct +{ + /*! @brief DATA register */ + union + { + __IOM uint32_t DATA; + + struct + { + __IOM uint32_t DATA : 32; + } DATA_B; + } ; + + /*! @brief independent DATA register */ + union + { + __IOM uint32_t INDATA; + + struct + { + __IOM uint32_t INDATA : 8; + __IM uint32_t RESERVED : 24; + } INDATA_B; + }; + + /*! @brief Countrol register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t RST : 1; + __IM uint32_t RESERVED : 31; + } CTRL_B; + }; +} CRC_T; + +/*! + * @brief Real time clock (RTC) + */ +typedef struct +{ + /*! @brief Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t SECIEN : 1; + __IOM uint32_t ALRIEN : 1; + __IOM uint32_t OVRIEN : 1; + __IM uint32_t RESERVED : 29; + } CTRL_B; + }; + + /*! @brief Control and State register */ + union + { + __IOM uint32_t CSTS; + + struct + { + __IOM uint32_t SECFLG : 1; + __IOM uint32_t ALRFLG : 1; + __IOM uint32_t OVRFLG : 1; + __IOM uint32_t RSYNCFLG : 1; + __IOM uint32_t CFGMFLG : 1; + __IM uint32_t OCFLG : 1; + __IM uint32_t RESERVED : 26; + } CSTS_B; + }; + + /*! @brief RTC predivision loading register High Bit */ + union + { + __OM uint32_t PSCRLDH; + + struct + { + __OM uint32_t PSCRLDH : 4; + __IM uint32_t RESERVED : 28; + } PSCRLDH_B; + }; + + /*! @brief RTC predivision loading register Low Bit */ + union + { + __OM uint32_t PSCRLDL; + + struct + { + __OM uint32_t PSCRLDL : 16; + __IM uint32_t RESERVED : 16; + } PSCRLDL_B; + }; + + /*! @brief RTC predivider remainder register High Bit */ + union + { + __IM uint32_t PSCH; + + struct + { + __IM uint32_t PSCH : 4; + __IM uint32_t RESERVED : 28; + } PSCH_B; + }; + + /*! @brief RTC predivider remainder register Low Bit */ + union + { + __IM uint32_t PSCL; + + struct + { + __IM uint32_t PSCL : 16; + __IM uint32_t RESERVED : 16; + } PSCL_B; + }; + + /*! @brief RTC count register High Bit */ + union + { + __IOM uint32_t CNTH; + + struct + { + __IOM uint32_t CNTH : 16; + __IM uint32_t RESERVED : 16; + } CNTH_B; + }; + + /*! @brief RTC count register Low Bit */ + union + { + __IOM uint32_t CNTL; + + struct + { + __IOM uint32_t CNTL : 16; + __IM uint32_t RESERVED : 16; + } CNTL_B; + }; + + /*! @brief RTC alarm clock register High Bit */ + union + { + __OM uint32_t ALRH; + + struct + { + __OM uint32_t ALRH : 16; + __IM uint32_t RESERVED : 16; + } ALRH_B; + }; + + /*! @brief RTC alarm clock register Low Bit */ + union + { + __OM uint32_t ALRL; + + struct + { + __OM uint32_t ALRL : 16; + __IM uint32_t RESERVED : 16; + } ALRL_B; + }; +} RTC_T; + +/*! + * @brief Power Management Unit(PMU) + */ +typedef struct +{ + /*! @brief Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t LPDSCFG : 1; + __IOM uint32_t PDDSCFG : 1; + __IOM uint32_t WUFLGCLR : 1; + __IOM uint32_t SBFLGCLR : 1; + __IOM uint32_t PVDEN : 1; + __IOM uint32_t PLSEL : 3; + __IOM uint32_t BPWEN : 1; + __IM uint32_t RESERVED : 23; + } CTRL_B; + }; + + /*! @brief PMU Status register */ + union + { + __IOM uint32_t CSTS; + + struct + { + __IM uint32_t WUEFLG : 1; + __IM uint32_t SBFLG : 1; + __IM uint32_t PVDOFLG : 1; + __IM uint32_t RESERVED : 5; + __IOM uint32_t WKUPCFG : 1; + __IM uint32_t RESERVED2 : 23; + } CSTS_B; + }; +} PMU_T; + +/*! + * @brief Backup register (BAKPR) + */ +typedef struct +{ + __IM uint32_t RESERVED; + + /*! @brief BAKPR DATA1 register */ + union + { + __IOM uint32_t DATA1; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA1_B; + }; + + /*! @brief BAKPR DATA2 register */ + union + { + __IOM uint32_t DATA2; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA2_B; + }; + + /*! @brief BAKPR DATA3 register */ + union + { + __IOM uint32_t DATA3; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA3_B; + }; + + /*! @brief BAKPR DATA4 register */ + union + { + __IOM uint32_t DATA4; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA4_B; + }; + + /*! @brief BAKPR DATA5 register */ + union + { + __IOM uint32_t DATA5; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA5_B; + }; + + /*! @brief BAKPR DATA6 register */ + union + { + __IOM uint32_t DATA6; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA6_B; + }; + + /*! @brief BAKPR DATA7 register */ + union + { + __IOM uint32_t DATA7; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA7_B; + }; + + /*! @brief BAKPR DATA8 register */ + union + { + __IOM uint32_t DATA8; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA8_B; + }; + + /*! @brief BAKPR DATA9 register */ + union + { + __IOM uint32_t DATA9; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA9_B; + }; + + /*! @brief BAKPR DATA10 register */ + union + { + __IOM uint32_t DATA10; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA10_B; + }; + + /*! @brief BAKPR Clock Calibration register */ + union + { + __IOM uint32_t CLKCAL; + + struct + { + __IOM uint32_t CALVALUE : 7; + __IOM uint32_t CALCOEN : 1; + __IOM uint32_t ASPOEN : 1; + __IOM uint32_t ASPOSEL : 1; + __IM uint32_t RESERVED : 22; + } CLKCAL_B; + } ; + + /*! @brief BAKPR Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t TPFCFG : 1; + __IOM uint32_t TPALCFG : 1; + __IM uint32_t RESERVED : 30; + } CTRL_B; + }; + + /*! @brief BAKPR Control register */ + union + { + __IOM uint32_t CSTS; + + struct + { + __OM uint32_t TECLR : 1; + __OM uint32_t TICLR : 1; + __IOM uint32_t TPIEN : 1; + __IM uint32_t RESERVED1 : 5; + __IM uint32_t TEFLG : 1; + __IM uint32_t TIFLG : 1; + __IM uint32_t RESERVED2 : 22; + } CSTS_B; + }; + + __IM uint32_t RESERVED1[2]; + + /*! @brief BAKPR DATA11 register */ + union + { + __IOM uint32_t DATA11; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA11_B; + }; + + /*! @brief BAKPR DATA12 register */ + union + { + __IOM uint32_t DATA12; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA12_B; + }; + + /*! @brief BAKPR DATA13 register */ + union + { + __IOM uint32_t DATA13; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA13_B; + }; + + /*! @brief BAKPR DATA14 register */ + union + { + __IOM uint32_t DATA14; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA14_B; + }; + + /*! @brief BAKPR DATA15 register */ + union + { + __IOM uint32_t DATA15; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA15_B; + }; + + /*! @brief BAKPR DATA16 register */ + union + { + __IOM uint32_t DATA16; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA16_B; + }; + + /*! @brief BAKPR DATA17 register */ + union + { + __IOM uint32_t DATA17; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA17_B; + }; + + /*! @brief BAKPR DATA18 register */ + union + { + __IOM uint32_t DATA18; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA18_B; + }; + + /*! @brief BAKPR DATA19 register */ + union + { + __IOM uint32_t DATA19; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA19_B; + }; + + /*! @brief BAKPR DATA20 register */ + union + { + __IOM uint32_t DATA20; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA20_B; + }; + + /*! @brief BAKPR DATA21 register */ + union + { + __IOM uint32_t DATA21; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA21_B; + }; + + /*! @brief BAKPR DATA22 register */ + union + { + __IOM uint32_t DATA22; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA22_B; + }; + + /*! @brief BAKPR DATA23 register */ + union + { + __IOM uint32_t DATA23; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA23_B; + }; + + /*! @brief BAKPR DATA24 register */ + union + { + __IOM uint32_t DATA24; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA24_B; + }; + + /*! @brief BAKPR DATA25 register */ + union + { + __IOM uint32_t DATA25; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA25_B; + }; + + /*! @brief BAKPR DATA26 register */ + union + { + __IOM uint32_t DATA26; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA26_B; + }; + + /*! @brief BAKPR DATA27 register */ + union + { + __IOM uint32_t DATA27; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA27_B; + }; + + /*! @brief BAKPR DATA28 register */ + union + { + __IOM uint32_t DATA28; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA28_B; + }; + + /*! @brief BAKPR DATA29 register */ + union + { + __IOM uint32_t DATA29; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA29_B; + }; + + /*! @brief BAKPR DATA30 register */ + union + { + __IOM uint32_t DATA30; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA30_B; + }; + + /*! @brief BAKPR DATA31 register */ + union + { + __IOM uint32_t DATA31; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA31_B; + }; + + /*! @brief BAKPR DATA32 register */ + union + { + __IOM uint32_t DATA32; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA32_B; + }; + + /*! @brief BAKPR DATA33 register */ + union + { + __IOM uint32_t DATA33; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA33_B; + }; + + /*! @brief BAKPR DATA34 register */ + union + { + __IOM uint32_t DATA34; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA34_B; + }; + + /*! @brief BAKPR DATA35 register */ + union + { + __IOM uint32_t DATA35; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA35_B; + }; + + /*! @brief BAKPR DATA36 register */ + union + { + __IOM uint32_t DATA36; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA36_B; + }; + + /*! @brief BAKPR DATA37 register */ + union + { + __IOM uint32_t DATA37; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA37_B; + }; + + /*! @brief BAKPR DATA38 register */ + union + { + __IOM uint32_t DATA38; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA38_B; + }; + + /*! @brief BAKPR DATA39 register */ + union + { + __IOM uint32_t DATA39; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA39_B; + }; + + /*! @brief BAKPR DATA40 register */ + union + { + __IOM uint32_t DATA40; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA40_B; + }; + + /*! @brief BAKPR DATA41 register */ + union + { + __IOM uint32_t DATA41; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA41_B; + }; + + /*! @brief BAKPR DATA42 register */ + union + { + __IOM uint32_t DATA42; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA42_B; + }; +} BAKPR_T; + +/*! + * @brief Timer register(TMR) + */ +typedef struct +{ + /*! @brief Countrol register 1 */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t CNTEN : 1; + __IOM uint32_t UD : 1; + __IOM uint32_t URSSEL : 1; + __IOM uint32_t SPMEN : 1; + __IOM uint32_t CNTDIR : 1; + __IOM uint32_t CAMSEL : 2; + __IOM uint32_t ARPEN : 1; + __IOM uint32_t CLKDIV : 2; + __IM uint32_t RESERVED : 22; + } CTRL1_B; + }; + + /*! @brief Countrol register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t CCPEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t CCUSEL : 1; + __IOM uint32_t CCDSEL : 1; + __IOM uint32_t MMSEL : 3; + __IOM uint32_t TI1SEL : 1; + __IOM uint32_t OC1OIS : 1; + __IOM uint32_t OC1NOIS : 1; + __IOM uint32_t OC2OIS : 1; + __IOM uint32_t OC2NOIS : 1; + __IOM uint32_t OC3OIS : 1; + __IOM uint32_t OC3NOIS : 1; + __IOM uint32_t OC4OIS : 1; + __IM uint32_t RESERVED2 : 17; + } CTRL2_B; + }; + + /*! @brief Control register from mode */ + union + { + __IOM uint32_t SMCTRL; + + struct + { + __IOM uint32_t SMFSEL : 3; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t TRGSEL : 3; + __IOM uint32_t MSMEN : 1; + __IOM uint32_t ETFCFG : 4; + __IOM uint32_t ETPCFG : 2; + __IOM uint32_t ECEN : 1; + __IOM uint32_t ETPOL : 1; + __IM uint32_t RESERVED2 : 16; + } SMCTRL_B; + }; + + /*! @brief DMA and Interrupt enable register */ + union + { + __IOM uint32_t DIEN; + + struct + { + __IOM uint32_t UIEN : 1; + __IOM uint32_t CC1IEN : 1; + __IOM uint32_t CC2IEN : 1; + __IOM uint32_t CC3IEN : 1; + __IOM uint32_t CC4IEN : 1; + __IOM uint32_t COMIEN : 1; + __IOM uint32_t TRGIEN : 1; + __IOM uint32_t BRKIEN : 1; + __IOM uint32_t UDIEN : 1; + __IOM uint32_t CC1DEN : 1; + __IOM uint32_t CC2DEN : 1; + __IOM uint32_t CC3DEN : 1; + __IOM uint32_t CC4DEN : 1; + __IOM uint32_t COMDEN : 1; + __IOM uint32_t TRGDEN : 1; + __IM uint32_t RESERVED : 17; + } DIEN_B; + }; + + /*! @brief Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IOM uint32_t UIFLG : 1; + __IOM uint32_t CC1IFLG : 1; + __IOM uint32_t CC2IFLG : 1; + __IOM uint32_t CC3IFLG : 1; + __IOM uint32_t CC4IFLG : 1; + __IOM uint32_t COMIFLG : 1; + __IOM uint32_t TRGIFLG : 1; + __IOM uint32_t BRKIFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t CC1RCFLG : 1; + __IOM uint32_t CC2RCFLG : 1; + __IOM uint32_t CC3RCFLG : 1; + __IOM uint32_t CC4RCFLG : 1; + __IM uint32_t RESERVED2 : 19; + } STS_B; + }; + + /*! @brief Software controls event generation registers */ + union + { + __OM uint32_t CEG; + + struct + { + __OM uint32_t UEG : 1; + __OM uint32_t CC1EG : 1; + __OM uint32_t CC2EG : 1; + __OM uint32_t CC3EG : 1; + __OM uint32_t CC4EG : 1; + __OM uint32_t COMG : 1; + __OM uint32_t TEG : 1; + __OM uint32_t BEG : 1; + __IM uint32_t RESERVED : 24; + } CEG_B; + }; + + /*! @brief Capture the compare mode register 1 */ + union + { + __IOM uint32_t CCM1; + + /*! @brief Compare mode */ + struct + { + __IOM uint32_t CC1SEL : 2; + __IOM uint32_t OC1FEN : 1; + __IOM uint32_t OC1PEN : 1; + __IOM uint32_t OC1MOD : 3; + __IOM uint32_t OC1CEN : 1; + __IOM uint32_t CC2SEL : 2; + __IOM uint32_t OC2FEN : 1; + __IOM uint32_t OC2PEN : 1; + __IOM uint32_t OC2MOD : 3; + __IOM uint32_t OC2CEN : 1; + __IM uint32_t RESERVED : 16; + } CCM1_COMPARE_B; + + /*! @brief Capture mode */ + struct + { + __IOM uint32_t CC1SEL : 2; + __IOM uint32_t IC1PSC : 2; + __IOM uint32_t IC1F : 4; + __IOM uint32_t CC2SEL : 2; + __IOM uint32_t IC2PSC : 2; + __IOM uint32_t IC2F : 4; + __IM uint32_t RESERVED : 16; + } CCM1_CAPTURE_B; + }; + + /*! @brief Capture the compare mode register 2 */ + union + { + __IOM uint32_t CCM2; + + /*! @brief Compare mode */ + struct + { + __IOM uint32_t CC3SEL : 2; + __IOM uint32_t OC3FEN : 1; + __IOM uint32_t OC3PEN : 1; + __IOM uint32_t OC3MOD : 3; + __IOM uint32_t OC3CEN : 1; + __IOM uint32_t CC4SEL : 2; + __IOM uint32_t OC4FEN : 1; + __IOM uint32_t OC4PEN : 1; + __IOM uint32_t OC4MOD : 3; + __IOM uint32_t OC4CEN : 1; + __IM uint32_t RESERVED : 16; + } CCM2_COMPARE_B; + + /*! @brief Capture mode */ + struct + { + __IOM uint32_t CC3SEL : 2; + __IOM uint32_t IC3PSC : 2; + __IOM uint32_t IC3F : 4; + __IOM uint32_t CC4SEL : 2; + __IOM uint32_t IC4PSC : 2; + __IOM uint32_t IC4F : 4; + __IM uint32_t RESERVED : 16; + } CCM2_CAPTURE_B; + }; + + /*! @brief Channel control register */ + union + { + __IOM uint32_t CCEN; + + struct + { + __IOM uint32_t CC1EN : 1; + __IOM uint32_t CC1POL : 1; + __IOM uint32_t CC1NEN : 1; + __IOM uint32_t CC1NPOL : 1; + __IOM uint32_t CC2EN : 1; + __IOM uint32_t CC2POL : 1; + __IOM uint32_t CC2NEN : 1; + __IOM uint32_t CC2NPOL : 1; + __IOM uint32_t CC3EN : 1; + __IOM uint32_t CC3POL : 1; + __IOM uint32_t CC3NEN : 1; + __IOM uint32_t CC3NPOL : 1; + __IOM uint32_t CC4EN : 1; + __IOM uint32_t CC4POL : 1; + __IM uint32_t RESERVED : 18; + } CCEN_B; + }; + + /*! @brief Counting register */ + union + { + __IOM uint32_t CNT; + + struct + { + __IOM uint32_t CNT : 16; + __IM uint32_t RESERVED : 16; + } CNT_B; + }; + + /*! @brief Division register */ + union + { + __IOM uint32_t PSC; + + struct + { + __IOM uint32_t PSC : 16; + __IM uint32_t RESERVED : 16; + } PSC_B; + }; + + /*! @brief Automatic reload register */ + union + { + __IOM uint32_t AUTORLD; + + struct + { + __IOM uint32_t AUTORLD : 16; + __IM uint32_t RESERVED : 16; + } AUTORLD_B; + }; + + /*! @brief Repeat count register */ + union + { + __IOM uint32_t REPCNT; + + struct + { + __IOM uint32_t REPCNT : 8; + __IM uint32_t RESERVED : 24; + } REPCNT_B; + }; + + /*! @brief Capture comparison register channel 1 */ + union + { + __IOM uint32_t CC1; + + struct + { + __IOM uint32_t CC1 : 16; + __IM uint32_t RESERVED : 16; + } CC1_B; + }; + + /*! @brief Capture comparison register channel 2 */ + union + { + __IOM uint32_t CC2; + + struct + { + __IOM uint32_t CC2 : 16; + __IM uint32_t RESERVED : 16; + } CC2_B; + }; + + /*! @brief Capture comparison register channel 3 */ + union + { + __IOM uint32_t CC3; + + struct + { + __IOM uint32_t CC3 : 16; + __IM uint32_t RESERVED : 16; + } CC3_B; + }; + + /*! @brief Capture comparison register channel 4 */ + union + { + __IOM uint32_t CC4; + + struct + { + __IOM uint32_t CC4 : 16; + __IM uint32_t RESERVED : 16; + } CC4_B; + }; + + /*! @brief Brake and dead zone registers */ + union + { + __IOM uint32_t BDT; + + struct + { + __IOM uint32_t DTS : 8; + __IOM uint32_t LOCKCFG : 2; + __IOM uint32_t IMOS : 1; + __IOM uint32_t RMOS : 1; + __IOM uint32_t BRKEN : 1; + __IOM uint32_t BRKPOL : 1; + __IOM uint32_t AOEN : 1; + __IOM uint32_t MOEN : 1; + __IM uint32_t RESERVED : 16; + } BDT_B; + }; + + /*! @brief DMA control register */ + union + { + __IOM uint32_t DCTRL; + + struct + { + __IOM uint32_t DBADDR : 5; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t DBLEN : 5; + __IM uint32_t RESERVED2 : 19; + } DCTRL_B; + }; + + /*! @brief Consecutive DMA addresses */ + union + { + __IOM uint32_t DMADDR; + struct + { + __IOM uint32_t DMADDR : 16; + __IM uint32_t RESERVED2 : 16; + } DMADDR_B; + }; +} TMR_T; + +/*! + * @brief Direct Memory Access register(DMA) + */ +typedef struct +{ + /*! @brief Interrupt status register */ + union + { + __IM uint32_t INTSTS; + + struct + { + __IM uint32_t GINTFLG1 : 1; + __IM uint32_t TCFLG1 : 1; + __IM uint32_t HTFLG1 : 1; + __IM uint32_t TERRFLG1 : 1; + __IM uint32_t GINTFLG2 : 1; + __IM uint32_t TCFLG2 : 1; + __IM uint32_t HTFLG2 : 1; + __IM uint32_t TERRFLG2 : 1; + __IM uint32_t GINTFLG3 : 1; + __IM uint32_t TCFLG3 : 1; + __IM uint32_t HTFLG3 : 1; + __IM uint32_t TERRFLG3 : 1; + __IM uint32_t GINTFLG4 : 1; + __IM uint32_t TCFLG4 : 1; + __IM uint32_t HTFLG4 : 1; + __IM uint32_t TERRFLG4 : 1; + __IM uint32_t GINTFLG5 : 1; + __IM uint32_t TCFLG5 : 1; + __IM uint32_t HTFLG5 : 1; + __IM uint32_t TERRFLG5 : 1; + __IM uint32_t GINTFLG6 : 1; + __IM uint32_t TCFLG6 : 1; + __IM uint32_t HTFLG6 : 1; + __IM uint32_t TERRFLG6 : 1; + __IM uint32_t GINTFLG7 : 1; + __IM uint32_t TCFLG7 : 1; + __IM uint32_t HTFLG7 : 1; + __IM uint32_t TERRFLG7 : 1; + __IM uint32_t RESERVED : 4; + } INTSTS_B; + }; + + /*! @brief Interrupt reset register */ + union + { + __OM uint32_t INTFCLR; + + struct + { + __OM uint32_t GINTCLR1 : 1; + __OM uint32_t TCCLR1 : 1; + __OM uint32_t HTCLR1 : 1; + __OM uint32_t TERRCLR1 : 1; + __OM uint32_t GINTCLR2 : 1; + __OM uint32_t TCCLR2 : 1; + __OM uint32_t HTCLR2 : 1; + __OM uint32_t TERRCLR2 : 1; + __OM uint32_t GINTCLR3 : 1; + __OM uint32_t TCCLR3 : 1; + __OM uint32_t HTCLR3 : 1; + __OM uint32_t TERRCLR3 : 1; + __OM uint32_t GINTCLR4 : 1; + __OM uint32_t TCCLR4 : 1; + __OM uint32_t HTCLR4 : 1; + __OM uint32_t TERRCLR4 : 1; + __OM uint32_t GINTCLR5 : 1; + __OM uint32_t TCCLR5 : 1; + __OM uint32_t HTCLR5 : 1; + __OM uint32_t TERRCLR5 : 1; + __OM uint32_t GINTCLR6 : 1; + __OM uint32_t TCCLR6 : 1; + __OM uint32_t HTCLR6 : 1; + __OM uint32_t TERRCLR6 : 1; + __OM uint32_t GINTCLR7 : 1; + __OM uint32_t TCCLR7 : 1; + __OM uint32_t HTCLR7 : 1; + __OM uint32_t TERRCLR7 : 1; + __IM uint32_t RESERVED : 4; + } INTFCLR_B; + }; +} DMA_T; + +/*! + * @brief DMA Channel register + */ +typedef struct +{ + /*! @brief DMA Channel setup register */ + union + { + + __IOM uint32_t CHCFG; + + struct + { + __IOM uint32_t CHEN : 1; + __IOM uint32_t TCINTEN : 1; + __IOM uint32_t HTINTEN : 1; + __IOM uint32_t TERRINTEN : 1; + __IOM uint32_t DIRCFG : 1; + __IOM uint32_t CIRMODE : 1; + __IOM uint32_t PERIMODE : 1; + __IOM uint32_t MIMODE : 1; + __IOM uint32_t PERSIZE : 2; + __IOM uint32_t MEMSIZE : 2; + __IOM uint32_t CHPL : 2; + __IOM uint32_t M2MMODE : 1; + __IM uint32_t RESERVED : 17; + } CHCFG_B; + }; + + /*! @brief DMA Channel transfer number register*/ + union + { + __IOM uint32_t CHNDATA; + + struct + { + __IOM uint32_t NDATA : 16; + __IM uint32_t RESERVED : 16; + } CHNDATA_B; + }; + + /*! @brief DMA Channel peripheral address register */ + union + { + __IOM uint32_t CHPADDR; + + struct + { + __IOM uint32_t PERADDR : 32; + } CHPADDR_B; + }; + + /*! @brief DMA Channel memory address register */ + union + { + __IOM uint32_t CHMADDR; + + struct + { + __IOM uint32_t MEMADDR : 32; + } CHMADDR_B; + }; +} DMA_Channel_T; + +/*! + * @brief CAN sending mailbox + */ +typedef struct +{ + /*! @brief CAN Each mailbox contains the sending mailbox identifier register */ + union + { + __IOM uint32_t TXMID; + + struct + { + __IOM uint32_t TXMREQ : 1; + __IOM uint32_t TXRFREQ : 1; + __IOM uint32_t IDTYPESEL : 1; + __IOM uint32_t EXTID : 18; + __IOM uint32_t STDID : 11; + } TXMID_B; + }; + + /*! @brief CAN Send the mailbox data length and timestamp register */ + union + { + __IOM uint32_t TXDLEN; + + struct + { + __IOM uint32_t DLCODE : 4; + __IOM uint32_t RESERVED : 28; + } TXDLEN_B; + }; + + /*! @brief CAN Send mailbox low byte data register */ + union + { + __IOM uint32_t TXMDL; + + struct + { + __IOM uint32_t DATABYTE0 : 8; + __IOM uint32_t DATABYTE1 : 8; + __IOM uint32_t DATABYTE2 : 8; + __IOM uint32_t DATABYTE3 : 8; + } TXMDL_B; + }; + + /*! @brief CAN Send mailbox High byte data register */ + union + { + __IOM uint32_t TXMDH; + + struct + { + __IOM uint32_t DATABYTE4 : 8; + __IOM uint32_t DATABYTE5 : 8; + __IOM uint32_t DATABYTE6 : 8; + __IOM uint32_t DATABYTE7 : 8; + } TXMDH_B; + }; +} CAN_TxMailBox_T; + +/*! + * @brief CAN receive mailbox + */ +typedef struct +{ + /*! @brief CAN Each mailbox contains the receive mailbox identifier register */ + union + { + __IM uint32_t RXMID; + + struct + { + __IM uint32_t RESERVED : 1; + __IM uint32_t RFTXREQ : 1; + __IM uint32_t IDTYPESEL : 1; + __IM uint32_t EXTID : 18; + __IM uint32_t STDID : 11; + } RXMID_B; + }; + + /*! @brief CAN receive the mailbox data length and timestamp register */ + union + { + __IM uint32_t RXDLEN; + + struct + { + __IM uint32_t DLCODE : 4; + __IM uint32_t RESERVED1 : 4; + __IM uint32_t FMIDX : 8; + __IM uint32_t RESERVED2 : 16; + } RXDLEN_B; + }; + + /*! @brief CAN receive mailbox low byte data register */ + union + { + __IM uint32_t RXMDL; + + struct + { + __IM uint32_t DATABYTE0 : 8; + __IM uint32_t DATABYTE1 : 8; + __IM uint32_t DATABYTE2 : 8; + __IM uint32_t DATABYTE3 : 8; + } RXMDL_B; + }; + + /*! @brief CAN receive mailbox High byte data register */ + union + { + __IOM uint32_t RXMDH; + + struct + { + __IM uint32_t DATABYTE4 : 8; + __IM uint32_t DATABYTE5 : 8; + __IM uint32_t DATABYTE6 : 8; + __IM uint32_t DATABYTE7 : 8; + } RXMDH_B; + }; +} CAN_RxMailBox_T; + +/*! + * @brief CAN Filter bank register + */ +typedef struct +{ + /*! @brief CAN Filter bank register 1 */ + union + { + __IOM uint32_t FBANK1; + + struct + { + __IOM uint32_t FBIT0 : 1; + __IOM uint32_t FBIT1 : 1; + __IOM uint32_t FBIT2 : 1; + __IOM uint32_t FBIT3 : 1; + __IOM uint32_t FBIT4 : 1; + __IOM uint32_t FBIT5 : 1; + __IOM uint32_t FBIT6 : 1; + __IOM uint32_t FBIT7 : 1; + __IOM uint32_t FBIT8 : 1; + __IOM uint32_t FBIT9 : 1; + __IOM uint32_t FBIT10 : 1; + __IOM uint32_t FBIT11 : 1; + __IOM uint32_t FBIT12 : 1; + __IOM uint32_t FBIT13 : 1; + __IOM uint32_t FBIT14 : 1; + __IOM uint32_t FBIT15 : 1; + __IOM uint32_t FBIT16 : 1; + __IOM uint32_t FBIT17 : 1; + __IOM uint32_t FBIT18 : 1; + __IOM uint32_t FBIT19 : 1; + __IOM uint32_t FBIT20 : 1; + __IOM uint32_t FBIT21 : 1; + __IOM uint32_t FBIT22 : 1; + __IOM uint32_t FBIT23 : 1; + __IOM uint32_t FBIT24 : 1; + __IOM uint32_t FBIT25 : 1; + __IOM uint32_t FBIT26 : 1; + __IOM uint32_t FBIT27 : 1; + __IOM uint32_t FBIT28 : 1; + __IOM uint32_t FBIT29 : 1; + __IOM uint32_t FBIT30 : 1; + __IOM uint32_t FBIT31 : 1; + } FBANK1_B; + }; + + /*! @brief CAN Filter bank register 2 */ + union + { + __IOM uint32_t FBANK2; + + struct + { + __IOM uint32_t FBIT0 : 1; + __IOM uint32_t FBIT1 : 1; + __IOM uint32_t FBIT2 : 1; + __IOM uint32_t FBIT3 : 1; + __IOM uint32_t FBIT4 : 1; + __IOM uint32_t FBIT5 : 1; + __IOM uint32_t FBIT6 : 1; + __IOM uint32_t FBIT7 : 1; + __IOM uint32_t FBIT8 : 1; + __IOM uint32_t FBIT9 : 1; + __IOM uint32_t FBIT10 : 1; + __IOM uint32_t FBIT11 : 1; + __IOM uint32_t FBIT12 : 1; + __IOM uint32_t FBIT13 : 1; + __IOM uint32_t FBIT14 : 1; + __IOM uint32_t FBIT15 : 1; + __IOM uint32_t FBIT16 : 1; + __IOM uint32_t FBIT17 : 1; + __IOM uint32_t FBIT18 : 1; + __IOM uint32_t FBIT19 : 1; + __IOM uint32_t FBIT20 : 1; + __IOM uint32_t FBIT21 : 1; + __IOM uint32_t FBIT22 : 1; + __IOM uint32_t FBIT23 : 1; + __IOM uint32_t FBIT24 : 1; + __IOM uint32_t FBIT25 : 1; + __IOM uint32_t FBIT26 : 1; + __IOM uint32_t FBIT27 : 1; + __IOM uint32_t FBIT28 : 1; + __IOM uint32_t FBIT29 : 1; + __IOM uint32_t FBIT30 : 1; + __IOM uint32_t FBIT31 : 1; + } FBANK2_B; + }; +} CAN_FilterRegister_T; + +/*! + * @brief Controller Area Network(CAN) + */ +typedef struct +{ + /*! @brief CAN Master control register */ + union + { + __IOM uint32_t MCTRL; + + struct + { + __IOM uint32_t INITREQ : 1; + __IOM uint32_t SLEEPREQ : 1; + __IOM uint32_t TXFPCFG : 1; + __IOM uint32_t RXFLOCK : 1; + __IOM uint32_t ARTXMD : 1; + __IOM uint32_t AWUPCFG : 1; + __IOM uint32_t ALBOFFM : 1; + __IM uint32_t RESERVED1 : 8; + __IOM uint32_t SWRST : 1; + __IOM uint32_t DBGFRZE : 1; + __IM uint32_t RESERVED2 : 15; + } MCTRL_B; + }; + + /*! @brief CAN Master States register */ + union + { + __IOM uint32_t MSTS; + + struct + { + __IM uint32_t INITFLG : 1; + __IM uint32_t SLEEPFLG : 1; + __IOM uint32_t ERRIFLG : 1; + __IOM uint32_t WUPIFLG : 1; + __IOM uint32_t SLEEPIFLG : 1; + __IM uint32_t RESERVED1 : 3; + __IM uint32_t TXMFLG : 1; + __IM uint32_t RXMFLG : 1; + __IM uint32_t LSAMVALUE : 1; + __IM uint32_t RXSIGL : 1; + __IM uint32_t RESERVED2 : 20; + } MSTS_B; + }; + + /*! @brief CAN Send States register */ + union + { + __IOM uint32_t TXSTS; + + struct + { + __IOM uint32_t REQCFLG0 : 1; + __IOM uint32_t TXSUSFLG0 : 1; + __IOM uint32_t ARBLSTFLG0 : 1; + __IOM uint32_t TXERRFLG0 : 1; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t ABREQFLG0 : 1; + __IOM uint32_t REQCFLG1 : 1; + __IOM uint32_t TXSUSFLG1 : 1; + __IOM uint32_t ARBLSTFLG1 : 1; + __IOM uint32_t TXERRFLG1 : 1; + __IM uint32_t RESERVED2 : 3; + __IOM uint32_t ABREQFLG1 : 1; + __IOM uint32_t REQCFLG2 : 1; + __IOM uint32_t TXSUSFLG2 : 1; + __IOM uint32_t ARBLSTFLG2 : 1; + __IOM uint32_t TXERRFLG2 : 1; + __IM uint32_t RESERVED3 : 3; + __IOM uint32_t ABREQFLG2 : 1; + __IM uint32_t EMNUM : 2; + __IM uint32_t TXMEFLG0 : 1; + __IM uint32_t TXMEFLG1 : 1; + __IM uint32_t TXMEFLG2 : 1; + __IM uint32_t LOWESTP0 : 1; + __IM uint32_t LOWESTP1 : 1; + __IM uint32_t LOWESTP2 : 1; + } TXSTS_B; + }; + + /*! @brief CAN Receive FIFO 0 register */ + union + { + __IOM uint32_t RXF0; + + struct + { + __IM uint32_t FMNUM0 : 2; + __IM uint32_t RESERVED : 1; + __IOM uint32_t FFULLFLG0 : 1; + __IOM uint32_t FOVRFLG0 : 1; + __IOM uint32_t RFOM0 : 1; + __IM uint32_t RESERVED1 : 26; + } RXF0_B; + }; + + /*! @brief CAN Receive FIFO 1 register */ + union + { + __IOM uint32_t RXF1; + + struct + { + __IM uint32_t FMNUM1 : 2; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t FFULLFLG1 : 1; + __IOM uint32_t FOVRFLG1 : 1; + __IOM uint32_t RFOM1 : 1; + __IM uint32_t RESERVED2 : 26; + } RXF1_B; + }; + + /*! @brief CAN Interrupts register */ + union + { + __IOM uint32_t INTEN; + + struct + { + __IOM uint32_t TXMEIEN : 1; + __IOM uint32_t FMIEN0 : 1; + __IOM uint32_t FFULLIEN0 : 1; + __IOM uint32_t FOVRIEN0 : 1; + __IOM uint32_t FMIEN1 : 1; + __IOM uint32_t FFULLIEN1 : 1; + __IOM uint32_t FOVRIEN1 : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t ERRWIEN : 1; + __IOM uint32_t ERRPIEN : 1; + __IOM uint32_t BOFFIEN : 1; + __IOM uint32_t LECIEN : 1; + __IM uint32_t RESERVED2 : 3; + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t WUPIEN : 1; + __IOM uint32_t SLEEPIEN : 1; + __IM uint32_t RESERVED3 : 14; + } INTEN_B; + }; + + /*! @brief CAN Error States register */ + union + { + __IOM uint32_t ERRSTS; + + struct + { + __IM uint32_t ERRWFLG : 1; + __IM uint32_t ERRPFLG : 1; + __IM uint32_t BOFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t LERRC : 3; + __IM uint32_t RESERVED2 : 9; + __IM uint32_t TXERRCNT : 8; + __IM uint32_t RXERRCNT : 8; + } ERRSTS_B; + }; + + /*! @brief CAN Bit Time register */ + union + { + __IOM uint32_t BITTIM; + + struct + { + __IOM uint32_t BRPSC : 10; + __IM uint32_t RESERVED1 : 6; + __IOM uint32_t TIMSEG1 : 4; + __IOM uint32_t TIMSEG2 : 3; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t RSYNJW : 2; + __IM uint32_t RESERVED3 : 4; + __IOM uint32_t LBKMEN : 1; + __IOM uint32_t SILMEN : 1; + } BITTIM_B; + }; + + __IM uint32_t RESERVED0[88]; + + CAN_TxMailBox_T sTxMailBox[3]; + CAN_RxMailBox_T sRxMailBox[2]; + + __IM uint32_t RESERVED1[12]; + + /*! @brief CAN Filter the master control register */ + union + { + __IOM uint32_t FCTRL; + + struct + { + __IOM uint32_t FINITEN : 1; + __IM uint32_t RESERVED : 7; + __IOM uint32_t CAN2BN : 6; + __IM uint32_t RESERVED1 : 18; + } FCTRL_B; + }; + + /*! @brief CAN Filter register */ + union + { + __IOM uint32_t FMCFG; + + struct + { + __IOM uint32_t FMCFG0 : 1; + __IOM uint32_t FMCFG1 : 1; + __IOM uint32_t FMCFG2 : 1; + __IOM uint32_t FMCFG3 : 1; + __IOM uint32_t FMCFG4 : 1; + __IOM uint32_t FMCFG5 : 1; + __IOM uint32_t FMCFG6 : 1; + __IOM uint32_t FMCFG7 : 1; + __IOM uint32_t FMCFG8 : 1; + __IOM uint32_t FMCFG9 : 1; + __IOM uint32_t FMCFG10 : 1; + __IOM uint32_t FMCFG11 : 1; + __IOM uint32_t FMCFG12 : 1; + __IOM uint32_t FMCFG13 : 1; + __IOM uint32_t FMCFG14 : 1; + __IOM uint32_t FMCFG15 : 1; + __IOM uint32_t FMCFG16 : 1; + __IOM uint32_t FMCFG17 : 1; + __IOM uint32_t FMCFG18 : 1; + __IOM uint32_t FMCFG19 : 1; + __IOM uint32_t FMCFG20 : 1; + __IOM uint32_t FMCFG21 : 1; + __IOM uint32_t FMCFG22 : 1; + __IOM uint32_t FMCFG23 : 1; + __IOM uint32_t FMCFG24 : 1; + __IOM uint32_t FMCFG25 : 1; + __IOM uint32_t FMCFG26 : 1; + __IOM uint32_t FMCFG27 : 1; + __IM uint32_t RESERVED : 4; + } FMCFG_B; + }; + + __IM uint32_t RESERVED2; + + /*! @brief CAN Filter bit scale register */ + union + { + __IOM uint32_t FSCFG; + + struct + { + __IOM uint32_t FSCFG0 : 1; + __IOM uint32_t FSCFG1 : 1; + __IOM uint32_t FSCFG2 : 1; + __IOM uint32_t FSCFG3 : 1; + __IOM uint32_t FSCFG4 : 1; + __IOM uint32_t FSCFG5 : 1; + __IOM uint32_t FSCFG6 : 1; + __IOM uint32_t FSCFG7 : 1; + __IOM uint32_t FSCFG8 : 1; + __IOM uint32_t FSCFG9 : 1; + __IOM uint32_t FSCFG10 : 1; + __IOM uint32_t FSCFG11 : 1; + __IOM uint32_t FSCFG12 : 1; + __IOM uint32_t FSCFG13 : 1; + __IOM uint32_t FSCFG14 : 1; + __IOM uint32_t FSCFG15 : 1; + __IOM uint32_t FSCFG16 : 1; + __IOM uint32_t FSCFG17 : 1; + __IOM uint32_t FSCFG18 : 1; + __IOM uint32_t FSCFG19 : 1; + __IOM uint32_t FSCFG20 : 1; + __IOM uint32_t FSCFG21 : 1; + __IOM uint32_t FSCFG22 : 1; + __IOM uint32_t FSCFG23 : 1; + __IOM uint32_t FSCFG24 : 1; + __IOM uint32_t FSCFG25 : 1; + __IOM uint32_t FSCFG26 : 1; + __IOM uint32_t FSCFG27 : 1; + __IM uint32_t RESERVED : 4; + } FSCFG_B; + }; + + __IM uint32_t RESERVED3; + + /*! @brief CAN Filter FIFO associated registers */ + union + { + __IOM uint32_t FFASS; + + struct + { + __IOM uint32_t FFASS0 : 1; + __IOM uint32_t FFASS1 : 1; + __IOM uint32_t FFASS2 : 1; + __IOM uint32_t FFASS3 : 1; + __IOM uint32_t FFASS4 : 1; + __IOM uint32_t FFASS5 : 1; + __IOM uint32_t FFASS6 : 1; + __IOM uint32_t FFASS7 : 1; + __IOM uint32_t FFASS8 : 1; + __IOM uint32_t FFASS9 : 1; + __IOM uint32_t FFASS10 : 1; + __IOM uint32_t FFASS11 : 1; + __IOM uint32_t FFASS12 : 1; + __IOM uint32_t FFASS13 : 1; + __IOM uint32_t FFASS14 : 1; + __IOM uint32_t FFASS15 : 1; + __IOM uint32_t FFASS16 : 1; + __IOM uint32_t FFASS17 : 1; + __IOM uint32_t FFASS18 : 1; + __IOM uint32_t FFASS19 : 1; + __IOM uint32_t FFASS20 : 1; + __IOM uint32_t FFASS21 : 1; + __IOM uint32_t FFASS22 : 1; + __IOM uint32_t FFASS23 : 1; + __IOM uint32_t FFASS24 : 1; + __IOM uint32_t FFASS25 : 1; + __IOM uint32_t FFASS26 : 1; + __IOM uint32_t FFASS27 : 1; + __IM uint32_t RESERVED : 4; + } FFASS_B; + }; + + __IM uint32_t RESERVED4; + + /*! @brief CAN Filter activation register */ + union + { + __IOM uint32_t FACT; + + struct + { + __IOM uint32_t FACT0 : 1; + __IOM uint32_t FACT1 : 1; + __IOM uint32_t FACT2 : 1; + __IOM uint32_t FACT3 : 1; + __IOM uint32_t FACT4 : 1; + __IOM uint32_t FACT5 : 1; + __IOM uint32_t FACT6 : 1; + __IOM uint32_t FACT7 : 1; + __IOM uint32_t FACT8 : 1; + __IOM uint32_t FACT9 : 1; + __IOM uint32_t FACT10 : 1; + __IOM uint32_t FACT11 : 1; + __IOM uint32_t FACT12 : 1; + __IOM uint32_t FACT13 : 1; + __IOM uint32_t FACT14 : 1; + __IOM uint32_t FACT15 : 1; + __IOM uint32_t FACT16 : 1; + __IOM uint32_t FACT17 : 1; + __IOM uint32_t FACT18 : 1; + __IOM uint32_t FACT19 : 1; + __IOM uint32_t FACT20 : 1; + __IOM uint32_t FACT21 : 1; + __IOM uint32_t FACT22 : 1; + __IOM uint32_t FACT23 : 1; + __IOM uint32_t FACT24 : 1; + __IOM uint32_t FACT25 : 1; + __IOM uint32_t FACT26 : 1; + __IOM uint32_t FACT27 : 1; + __IM uint32_t RESERVED : 4; + } FACT_B; + }; + + __IM uint32_t RESERVED5[8]; + + CAN_FilterRegister_T sFilterRegister[28]; + +} CAN_T; + +/*! + * @brief I2C register (I2C) + */ +typedef struct +{ + /*! @brief Control register 1 */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t I2CEN : 1; + __IOM uint32_t SMBEN : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t SMBTCFG : 1; + __IOM uint32_t ARPEN : 1; + __IOM uint32_t PECEN : 1; + __IOM uint32_t SRBEN : 1; + __IOM uint32_t CLKSTRETCHD : 1; + __IOM uint32_t START : 1; + __IOM uint32_t STOP : 1; + __IOM uint32_t ACKEN : 1; + __IOM uint32_t ACKPOS : 1; + __IOM uint32_t PEC : 1; + __IOM uint32_t ALERTEN : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t SWRST : 1; + __IM uint32_t RESERVED3 : 16; + } CTRL1_B; + } ; + + /*! @brief Control register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t CLKFCFG : 6; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t EVIEN : 1; + __IOM uint32_t BUFIEN : 1; + __IOM uint32_t DMAEN : 1; + __IOM uint32_t LTCFG : 1; + __IM uint32_t RESERVED2 : 19; + } CTRL2_B; + } ; + + /*! @brief Slave machine address register 1 */ + union + { + __IOM uint32_t SADDR1; + + struct + { + __IOM uint32_t ADDR0 : 1; + __IOM uint32_t ADDR1_7 : 7; + __IOM uint32_t ADDR8_9 : 2; + __IM uint32_t RESERVED1 : 5; + __IOM uint32_t ADDRLEN : 1; + __IM uint32_t RESERVED2 : 16; + } SADDR1_B; + }; + + /*! @brief Slave machine address register 2 */ + union + { + __IOM uint32_t SADDR2; + + struct + { + __IOM uint32_t ADDRNUM : 1; + __IOM uint32_t ADDR2 : 7; + __IM uint32_t RESERVED : 24; + } SADDR2_B; + }; + + /*! @brief Cache data register */ + union + { + __IOM uint32_t DATA; + + struct + { + __IOM uint32_t DATA : 8; + __IM uint32_t RESERVED : 24; + } DATA_B; + }; + + /*! @brief Status register 1 */ + union + { + __IOM uint32_t STS1; + + struct + { + __IM uint32_t STARTFLG : 1; + __IM uint32_t ADDRFLG : 1; + __IM uint32_t BTCFLG : 1; + __IM uint32_t ADDR10FLG : 1; + __IM uint32_t STOPFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IM uint32_t RXBNEFLG : 1; + __IM uint32_t TXBEFLG : 1; + __IOM uint32_t BERRFLG : 1; + __IOM uint32_t ALFLG : 1; + __IOM uint32_t AEFLG : 1; + __IOM uint32_t OVRURFLG : 1; + __IOM uint32_t PECEFLG : 1; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t TTEFLG : 1; + __IOM uint32_t SMBALTFLG : 1; + __IM uint32_t RESERVED3 : 16; + } STS1_B; + }; + + /*! @brief Status register 2 */ + union + { + __IOM uint32_t STS2; + + struct + { + __IM uint32_t MSFLG : 1; + __IM uint32_t BUSBSYFLG : 1; + __IM uint32_t TRFLG : 1; + __IM uint32_t RESERVED1 : 1; + __IM uint32_t GENCALLFLG : 1; + __IM uint32_t SMBDADDRFLG : 1; + __IM uint32_t SMMHADDR : 1; + __IM uint32_t DUALADDRFLG : 1; + __IM uint32_t PECVALUE : 8; + __IM uint32_t RESERVED2 : 16; + } STS2_B; + }; + + /*! @brief Clock control register */ + union + { + __IOM uint32_t CLKCTRL; + + struct + { + __IOM uint32_t CLKS : 12; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t FDUTYCFG : 1; + __IOM uint32_t SPEEDCFG : 1; + __IM uint32_t RESERVED2 : 16; + } CLKCTRL_B; + }; + + /*! @brief Maximum rise time */ + union + { + __IOM uint32_t RISETMAX; + + struct + { + __IOM uint32_t RISETMAX : 6; + __IM uint32_t RESERVED : 26; + } RISETMAX_B; + }; + + __IM uint32_t RESERVED[55]; + + /*! @brief I2C Switching register */ + union + { + __IOM uint32_t SWITCH; + + struct + { + __IOM uint32_t SWITCH : 1; + __IM uint32_t RESERVED1 : 31; + } SWITCH_B; + }; +} I2C_T; + + +typedef struct +{ + __IOM uint16_t RDP; + __IOM uint16_t USER; + __IOM uint16_t Data0; + __IOM uint16_t Data1; + __IOM uint16_t WRP0; + __IOM uint16_t WRP1; + __IOM uint16_t WRP2; + __IOM uint16_t WRP3; +} OB_T; + +/*! + * @brief Analog to Digital Converter(ADC) + */ +typedef struct +{ + + /* Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IOM uint32_t AWDFLG : 1; + __IOM uint32_t EOCFLG : 1; + __IOM uint32_t INJEOCFLG : 1; + __IOM uint32_t INJCSFLG : 1; + __IOM uint32_t REGCSFLG : 1; + __IM uint32_t RESERVED : 27; + } STS_B; + }; + + /* Control register1*/ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t AWDCHSEL : 5; + __IOM uint32_t EOCIEN : 1; + __IOM uint32_t AWDIEN : 1; + __IOM uint32_t INJEOCIEN : 1; + __IOM uint32_t SCANEN : 1; + __IOM uint32_t AWDSGLEN : 1; + __IOM uint32_t INJGACEN : 1; + __IOM uint32_t REGDISCEN : 1; + __IOM uint32_t INJDISCEN : 1; + __IOM uint32_t DISCNUMCFG : 3; + __IOM uint32_t DUALMCFG : 4; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t INJAWDEN : 1; + __IOM uint32_t REGAWDEN : 1; + __IM uint32_t RESERVED2 : 8; + } CTRL1_B; + }; + + /* Control register2*/ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t ADCEN : 1; + __IOM uint32_t CONTCEN : 1; + __IOM uint32_t CAL : 1; + __IOM uint32_t CALRST : 1; + __IM uint32_t RESERVED1 : 4; + __IOM uint32_t DMAEN : 1; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t DALIGNCFG : 1; + __IOM uint32_t INJGEXTTRGSEL : 3; + __IOM uint32_t INJEXTTRGEN : 1; + __IM uint32_t RESERVED3 : 1; + __IOM uint32_t REGEXTTRGSEL : 3; + __IOM uint32_t REGEXTTRGEN : 1; + __IOM uint32_t INJSWSC : 1; + __IOM uint32_t REGSWSC : 1; + __IOM uint32_t TSVREFEN : 1; + __IM uint32_t RESERVED4 : 8; + } CTRL2_B; + }; + + /* Sample time register1*/ + union + { + __IOM uint32_t SMPTIM1; + + struct + { + __IOM uint32_t SMPCYCCFG10 : 3; + __IOM uint32_t SMPCYCCFG11 : 3; + __IOM uint32_t SMPCYCCFG12 : 3; + __IOM uint32_t SMPCYCCFG13 : 3; + __IOM uint32_t SMPCYCCFG14 : 3; + __IOM uint32_t SMPCYCCFG15 : 3; + __IOM uint32_t SMPCYCCFG16 : 3; + __IOM uint32_t SMPCYCCFG17 : 3; + __IM uint32_t RESERVED : 8; + } SMPTIM1_B; + }; + + /* Sample time register2*/ + union + { + __IOM uint32_t SMPTIM2; + + struct + { + __IOM uint32_t SMPCYCCFG0 : 3; + __IOM uint32_t SMPCYCCFG1 : 3; + __IOM uint32_t SMPCYCCFG2 : 3; + __IOM uint32_t SMPCYCCFG3 : 3; + __IOM uint32_t SMPCYCCFG4 : 3; + __IOM uint32_t SMPCYCCFG5 : 3; + __IOM uint32_t SMPCYCCFG6 : 3; + __IOM uint32_t SMPCYCCFG7 : 3; + __IOM uint32_t SMPCYCCFG8 : 3; + __IOM uint32_t SMPCYCCFG9 : 3; + __IM uint32_t RESERVED : 2; + } SMPTIM2_B; + }; + + /* Injected channel Data offset register1*/ + union + { + __IOM uint32_t INJDOF1; + + struct + { + __IOM uint32_t INJDOF1 : 12; + __IM uint32_t RESERVED : 20; + } INJDOF1_B; + }; + + /* Injected channel Data offset register2*/ + union + { + __IOM uint32_t INJDOF2; + + struct + { + __IOM uint32_t INJDOF2 : 12; + __IM uint32_t RESERVED : 20; + } INJDOF2_B; + }; + + /* Injected channel Data offset register3*/ + union + { + __IOM uint32_t INJDOF3; + + struct + { + __IOM uint32_t INJDOF3 : 12; + __IM uint32_t RESERVED : 20; + } INJDOF3_B; + }; + + /* Injected channel Data offset register4*/ + union + { + __IOM uint32_t INJDOF4; + + struct + { + __IOM uint32_t INJDOF4 : 12; + __IM uint32_t RESERVED : 20; + } INJDOF4_B; + }; + + /* Analog watchdog high threshold register*/ + union + { + __IOM uint32_t AWDHT; + + struct + { + __IOM uint32_t AWDHT : 12; + __IM uint32_t RESERVED : 20; + } AWDHT_B; + }; + + /* Analog watchdog low threshold register*/ + union + { + __IOM uint32_t AWDLT; + + struct + { + __IOM uint32_t AWDLT : 12; + __IM uint32_t RESERVED : 20; + } AWDLT_B; + }; + + /* Regular channel sequence register1*/ + union + { + __IOM uint32_t REGSEQ1; + + struct + { + __IOM uint32_t REGSEQC13 : 5; + __IOM uint32_t REGSEQC14 : 5; + __IOM uint32_t REGSEQC15 : 5; + __IOM uint32_t REGSEQC16 : 5; + __IOM uint32_t REGSEQLEN : 4; + __IM uint32_t RESERVED : 8; + } REGSEQ1_B; + }; + + /* Regular channel sequence register2*/ + union + { + __IOM uint32_t REGSEQ2; + + struct + { + __IOM uint32_t REGSEQC7 : 5; + __IOM uint32_t REGSEQC8 : 5; + __IOM uint32_t REGSEQC9 : 5; + __IOM uint32_t REGSEQC10 : 5; + __IOM uint32_t REGSEQC11 : 5; + __IOM uint32_t REGSEQC12 : 5; + __IM uint32_t RESERVED : 2; + } REGSEQ2_B; + }; + + /* Regular channel sequence register3*/ + union + { + __IOM uint32_t REGSEQ3; + + struct + { + __IOM uint32_t REGSEQC1 : 5; + __IOM uint32_t REGSEQC2 : 5; + __IOM uint32_t REGSEQC3 : 5; + __IOM uint32_t REGSEQC4 : 5; + __IOM uint32_t REGSEQC5 : 5; + __IOM uint32_t REGSEQC6 : 5; + __IM uint32_t RESERVED : 2; + } REGSEQ3_B; + }; + + /* Injected sequence register*/ + union + { + __IOM uint32_t INJSEQ; + + struct + { + __IOM uint32_t INJSEQC1 : 5; + __IOM uint32_t INJSEQC2 : 5; + __IOM uint32_t INJSEQC3 : 5; + __IOM uint32_t INJSEQC4 : 5; + __IOM uint32_t INJSEQLEN : 2; + __IM uint32_t RESERVED : 10; + } INJSEQ_B; + }; + + /* Injected Data register1*/ + union + { + __IM uint32_t INJDATA1; + + struct + { + __IM uint32_t INJDATA : 16; + __IM uint32_t RESERVED : 16; + } INJDATA1_B; + }; + + /* Injected Data register2*/ + union + { + __IM uint32_t INJDATA2; + + struct + { + __IM uint32_t INJDATA : 16; + __IM uint32_t RESERVED : 16; + } INJDATA2_B; + }; + + /* Injected Data register3*/ + union + { + __IM uint32_t INJDATA3; + + struct + { + __IM uint32_t INJDATA : 16; + __IM uint32_t RESERVED : 16; + } INJDATA3_B; + }; + + /* Injected Data register4*/ + union + { + __IM uint32_t INJDATA4; + + struct + { + __IM uint32_t INJDATA : 16; + __IM uint32_t RESERVED : 16; + } INJDATA4_B; + }; + + /* Regular Data register*/ + union + { + __IOM uint32_t REGDATA; + + struct + { + __IM uint32_t REGDATA : 16; + __IM uint32_t ADC2DATA : 16; + } REGDATA_B; + }; +} ADC_T; + +/*! + * @brief External Interrupt(EINT) + */ +typedef struct +{ + /* Interrupt mask register */ + union + { + __IOM uint32_t IMASK; + + struct + { + __IOM uint32_t IMASK0 : 1; + __IOM uint32_t IMASK1 : 1; + __IOM uint32_t IMASK2 : 1; + __IOM uint32_t IMASK3 : 1; + __IOM uint32_t IMASK4 : 1; + __IOM uint32_t IMASK5 : 1; + __IOM uint32_t IMASK6 : 1; + __IOM uint32_t IMASK7 : 1; + __IOM uint32_t IMASK8 : 1; + __IOM uint32_t IMASK9 : 1; + __IOM uint32_t IMASK10 : 1; + __IOM uint32_t IMASK11 : 1; + __IOM uint32_t IMASK12 : 1; + __IOM uint32_t IMASK13 : 1; + __IOM uint32_t IMASK14 : 1; + __IOM uint32_t IMASK15 : 1; + __IOM uint32_t IMASK16 : 1; + __IOM uint32_t IMASK17 : 1; + __IOM uint32_t IMASK18 : 1; + __IM uint32_t RESERVED : 12; + } IMASK_B; + }; + + /* Event mask register */ + union + { + __IOM uint32_t EMASK; + + struct + { + __IOM uint32_t EMASK0 : 1; + __IOM uint32_t EMASK1 : 1; + __IOM uint32_t EMASK2 : 1; + __IOM uint32_t EMASK3 : 1; + __IOM uint32_t EMASK4 : 1; + __IOM uint32_t EMASK5 : 1; + __IOM uint32_t EMASK6 : 1; + __IOM uint32_t EMASK7 : 1; + __IOM uint32_t EMASK8 : 1; + __IOM uint32_t EMASK9 : 1; + __IOM uint32_t EMASK10 : 1; + __IOM uint32_t EMASK11 : 1; + __IOM uint32_t EMASK12 : 1; + __IOM uint32_t EMASK13 : 1; + __IOM uint32_t EMASK14 : 1; + __IOM uint32_t EMASK15 : 1; + __IOM uint32_t EMASK16 : 1; + __IOM uint32_t EMASK17 : 1; + __IOM uint32_t EMASK18 : 1; + __IM uint32_t RESERVED : 12; + } EEN_B; + }; + + /* Rising Trigger Event Enable register */ + union + { + __IOM uint32_t RTEN; + + struct + { + __IOM uint32_t RTEN0 : 1; + __IOM uint32_t RTEN1 : 1; + __IOM uint32_t RTEN2 : 1; + __IOM uint32_t RTEN3 : 1; + __IOM uint32_t RTEN4 : 1; + __IOM uint32_t RTEN5 : 1; + __IOM uint32_t RTEN6 : 1; + __IOM uint32_t RTEN7 : 1; + __IOM uint32_t RTEN8 : 1; + __IOM uint32_t RTEN9 : 1; + __IOM uint32_t RTEN10 : 1; + __IOM uint32_t RTEN11 : 1; + __IOM uint32_t RTEN12 : 1; + __IOM uint32_t RTEN13 : 1; + __IOM uint32_t RTEN14 : 1; + __IOM uint32_t RTEN15 : 1; + __IOM uint32_t RTEN16 : 1; + __IOM uint32_t RTEN17 : 1; + __IOM uint32_t RTEN18 : 1; + __IM uint32_t RESERVED : 12; + } RTEN_B; + }; + + /* Falling Trigger Event Enable register */ + union + { + __IOM uint32_t FTEN; + + struct + { + __IOM uint32_t FTEN0 : 1; + __IOM uint32_t FTEN1 : 1; + __IOM uint32_t FTEN2 : 1; + __IOM uint32_t FTEN3 : 1; + __IOM uint32_t FTEN4 : 1; + __IOM uint32_t FTEN5 : 1; + __IOM uint32_t FTEN6 : 1; + __IOM uint32_t FTEN7 : 1; + __IOM uint32_t FTEN8 : 1; + __IOM uint32_t FTEN9 : 1; + __IOM uint32_t FTEN10 : 1; + __IOM uint32_t FTEN11 : 1; + __IOM uint32_t FTEN12 : 1; + __IOM uint32_t FTEN13 : 1; + __IOM uint32_t FTEN14 : 1; + __IOM uint32_t FTEN15 : 1; + __IOM uint32_t FTEN16 : 1; + __IOM uint32_t FTEN17 : 1; + __IOM uint32_t FTEN18 : 1; + __IM uint32_t RESERVED : 12; + } FTEN_B; + }; + + /* Software Interrupt Enable register */ + union + { + __IOM uint32_t SWINTE; + + struct + { + __IOM uint32_t SWINTE0 : 1; + __IOM uint32_t SWINTE1 : 1; + __IOM uint32_t SWINTE2 : 1; + __IOM uint32_t SWINTE3 : 1; + __IOM uint32_t SWINTE4 : 1; + __IOM uint32_t SWINTE5 : 1; + __IOM uint32_t SWINTE6 : 1; + __IOM uint32_t SWINTE7 : 1; + __IOM uint32_t SWINTE8 : 1; + __IOM uint32_t SWINTE9 : 1; + __IOM uint32_t SWINTE10 : 1; + __IOM uint32_t SWINTE11 : 1; + __IOM uint32_t SWINTE12 : 1; + __IOM uint32_t SWINTE13 : 1; + __IOM uint32_t SWINTE14 : 1; + __IOM uint32_t SWINTE15 : 1; + __IOM uint32_t SWINTE16 : 1; + __IOM uint32_t SWINTE17 : 1; + __IOM uint32_t SWINTE18 : 1; + __IM uint32_t RESERVED : 12; + } SWINTE_B; + }; + + /* Interrupt Flag Enable register */ + union + { + __IOM uint32_t IPEND; + + struct + { + __IOM uint32_t IPEND0 : 1; + __IOM uint32_t IPEND1 : 1; + __IOM uint32_t IPEND2 : 1; + __IOM uint32_t IPEND3 : 1; + __IOM uint32_t IPEND4 : 1; + __IOM uint32_t IPEND5 : 1; + __IOM uint32_t IPEND6 : 1; + __IOM uint32_t IPEND7 : 1; + __IOM uint32_t IPEND8 : 1; + __IOM uint32_t IPEND9 : 1; + __IOM uint32_t IPEND10 : 1; + __IOM uint32_t IPEND11 : 1; + __IOM uint32_t IPEND12 : 1; + __IOM uint32_t IPEND13 : 1; + __IOM uint32_t IPEND14 : 1; + __IOM uint32_t IPEND15 : 1; + __IOM uint32_t IPEND16 : 1; + __IOM uint32_t IPEND17 : 1; + __IOM uint32_t IPEND18 : 1; + __IM uint32_t RESERVED : 12; + } IF_B; + }; +} EINT_T; + +/*! + * @brief Independent watchdog(IWDT) + */ +typedef struct +{ + + /* Keyword register */ + union + { + __OM uint32_t KEY; + + struct + { + __OM uint32_t KEY : 16; + __IM uint32_t RESERVED : 16; + } KEY_B; + }; + + /* Frequency Divider register */ + union + { + __IOM uint32_t PSC; + + struct + { + __IOM uint32_t PSC : 3; + __IM uint32_t RESERVED : 29; + } DIV_B; + }; + + /* Reload values register */ + union + { + __IOM uint32_t CNTRLD; + + struct + { + __IOM uint32_t CNTRLD : 12; + __IM uint32_t RESERVED : 20; + } CNTRLD_B; + }; + + /* Status register */ + union + { + __IM uint32_t STS; + + struct + { + __IM uint32_t PSCUFLG : 1; + __IM uint32_t CNTUFLG : 1; + __IM uint32_t RESERVED : 30; + } STS_B; + }; +} IWDT_T; + +/*! + * @brief Serial peripheral interface(SPI) + */ +typedef struct +{ + /* Control register 1 */ + union + { + __IOM uint32_t CTRL1; + + struct + { + __IOM uint32_t CPHA : 1; + __IOM uint32_t CPOL : 1; + __IOM uint32_t MSMCFG : 1; + __IOM uint32_t BRSEL : 3; + __IOM uint32_t SPIEN : 1; + __IOM uint32_t LSBSEL : 1; + __IOM uint32_t ISSEL : 1; + __IOM uint32_t SSEN : 1; + __IOM uint32_t RXOMEN : 1; + __IOM uint32_t DFLSEL : 1; + __IOM uint32_t CRCNXT : 1; + __IOM uint32_t CRCEN : 1; + __IOM uint32_t BMOEN : 1; + __IOM uint32_t BMEN : 1; + __IM uint32_t RESERVED : 16; + } CTRL1_B; + }; + + /* Control register 2 */ + union + { + __IOM uint32_t CTRL2; + + struct + { + __IOM uint32_t RXDEN : 1; + __IOM uint32_t TXDEN : 1; + __IOM uint32_t SSOEN : 1; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t RXBNEIEN : 1; + __IOM uint32_t TXBEIEN : 1; + __IM uint32_t RESERVED2 : 24; + } CTRL2_B; + }; + + /* Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IM uint32_t RXBNEFLG : 1; + __IM uint32_t TXBEFLG : 1; + __IM uint32_t SCHDIR : 1; + __IM uint32_t UDRFLG : 1; + __IOM uint32_t CRCEFLG : 1; + __IM uint32_t MEFLG : 1; + __IM uint32_t OVRFLG : 1; + __IM uint32_t BSYFLG : 1; + __IM uint32_t RESERVED : 24; + } STS_B; + }; + + /* Data register */ + union + { + __IOM uint32_t DATA; + + struct + { + __IOM uint32_t DATA : 16; + __IM uint32_t RESERVED : 16; + } DATA_B; + }; + + /* CRC polynomial register */ + union + { + __IOM uint32_t CRCPOLY; + + struct + { + __IOM uint32_t CRCPOLY : 16; + __IM uint32_t RESERVED : 16; + } CRCPOLY_B; + }; + + /* Receive CRC register */ + union + { + __IM uint32_t RXCRC; + + struct + { + __IM uint32_t RXCRC : 16; + __IM uint32_t RESERVED : 16; + } RXCRC_B; + }; + + /* Transmit CRC register */ + union + { + __IM uint32_t TXCRC; + + struct + { + __IM uint32_t TXCRC : 16; + __IM uint32_t RESERVED : 16; + } TXCRC_B; + }; +} SPI_T; + +/*! + * @brief Window watchdog (WWDT) + */ +typedef struct +{ + + /* Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t CNT : 7; + __IOM uint32_t WWDTEN : 1; + __IM uint32_t RESERVED : 24; + } CTRL_B; + }; + + /* Configure register */ + union + { + __IOM uint32_t CFG; + + struct + { + __IOM uint32_t WIN : 7; + __IOM uint32_t TBPSC : 2; + __IOM uint32_t EWIEN : 1; + __IM uint32_t RESERVED : 22; + } CFG_B; + }; + + /* Status register */ + union + { + __IOM uint32_t STS; + + struct + { + __IOM uint32_t EWIFLG : 1; + __IM uint32_t RESERVED : 31; + } STS_B; + }; +} WWDT_T; + +/*! + * @brief Queued serial peripheral interface(QSPI) + */ +typedef struct +{ + /*! @brief Control register 1 */ + union + { + __IOM uint32_t CTRL1; + struct + { + __IOM uint32_t DFS : 5; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t CPHA : 1; + __IOM uint32_t CPOL : 1; + __IOM uint32_t TXMODE : 2; + __IM uint32_t RESERVED2 : 2; + __IOM uint32_t SSTEN : 1; + __IM uint32_t RESERVED3 : 7; + __IOM uint32_t FRF : 2; + __IM uint32_t RESERVED4 : 8; + } CTRL1_B; + }; + + /*! @brief Control register 2 */ + union + { + __IOM uint32_t CTRL2; + struct + { + __IOM uint32_t NDF : 16; + __IM uint32_t RESERVED : 16; + } CTRL2_B; + }; + + /*! @brief QSPI Enable register */ + union + { + __IOM uint32_t SSIEN; + struct + { + __IOM uint32_t EN : 1; + __IM uint32_t RESERVED : 31; + } SSIEN_B; + }; + + __IM uint32_t RESERVED; + + /*! @brief QSPI Slave enable register */ + union + { + __IOM uint32_t SLAEN; + struct + { + __IOM uint32_t SLAEN : 1; + __IM uint32_t RESERVED : 31; + } SLAEN_B; + }; + + /*! @brief Baudrate register */ + union + { + __IOM uint32_t BR; + struct + { + __IOM uint32_t CLKDIV : 16; + __IM uint32_t RESERVED : 16; + } BR_B; + }; + + /*! @brief Transmission FIFO threshhold level register */ + union + { + __IOM uint32_t TFTL; + struct + { + __IOM uint32_t TFT : 3; + __IM uint32_t RESERVED1 : 13; + __IOM uint32_t TFTH : 3; + __IM uint32_t RESERVED2 : 13; + } TFTL_B; + }; + + /*! @brief Reception FIFO threshhold level register */ + union + { + __IOM uint32_t RFTL; + struct + { + __IOM uint32_t RFT : 3; + __IM uint32_t RESERVED : 29; + } RFTL_B; + }; + + /*! @brief Transmission FIFO level register */ + union + { + __IOM uint32_t TFL; + struct + { + __IOM uint32_t TFL : 3; + __IM uint32_t RESERVED : 29; + } TFL_B; + }; + + /*! @brief Reception FIFO level register */ + union + { + __IOM uint32_t RFL; + struct + { + __IOM uint32_t RFL : 3; + __IM uint32_t RESERVED : 29; + } RFL_B; + }; + + /*! @brief Status register */ + union + { + __IOM uint32_t STS; + struct + { + __IOM uint32_t BUSYF : 1; + __IOM uint32_t TFNF : 1; + __IOM uint32_t TFEF : 1; + __IOM uint32_t RFNEF : 1; + __IOM uint32_t RFFF : 1; + __IM uint32_t RESERVED1 : 1; + __IOM uint32_t DCEF : 1; + __IM uint32_t RESERVED2 : 25; + } STS_B; + }; + + /*! @brief Interrupt enable register */ + union + { + __IOM uint32_t INTEN; + struct + { + __IOM uint32_t TFEIE : 1; + __IOM uint32_t TFOIE : 1; + __IOM uint32_t RFUIE : 1; + __IOM uint32_t RFOIE : 1; + __IOM uint32_t RFFIE : 1; + __IOM uint32_t MSTIE : 1; + __IM uint32_t RESERVED : 26; + } INTEN_B; + }; + + /*! @brief Interrupt status register */ + union + { + __IM uint32_t ISTS; + struct + { + __IM uint32_t TFEIF : 1; + __IM uint32_t TFOIF : 1; + __IM uint32_t RFUIF : 1; + __IM uint32_t RFOIF : 1; + __IM uint32_t RFFIF : 1; + __IM uint32_t MSTIF : 1; + __IM uint32_t RESERVED : 26; + } ISTS_B; + }; + + /*! @brief Raw interrupt register */ + union + { + __IM uint32_t RIS; + struct + { + __IM uint32_t TFEIF : 1; + __IM uint32_t TFOIF : 1; + __IM uint32_t RFUIF : 1; + __IM uint32_t RXOIR : 1; + __IM uint32_t RXFIR : 1; + __IM uint32_t MSTIR : 1; + __IM uint32_t RESERVED : 26; + } RIS_B; + }; + + /*! @brief Transmission FIFO overflow interrupt clear register */ + union + { + __IM uint32_t TFOIC; + struct + { + __IM uint32_t TFOIC : 1; + __IM uint32_t RESERVED : 31; + } TFOIC_B; + }; + + /*! @brief Reception FIFO overflow interrupt clear register */ + union + { + __IM uint32_t RFOIC; + struct + { + __IM uint32_t RFOIC : 1; + __IM uint32_t RESERVED : 31; + } RFOIC_B; + }; + + /*! @brief Reception FIFO underflow interrupt clear register */ + union + { + __IM uint32_t RFUIC; + struct + { + __IM uint32_t RFUIC : 1; + __IM uint32_t RESERVED : 31; + } RFUIC_B; + }; + + /*! @brief Master interrupt clear register */ + union + { + __IM uint32_t MIC; + struct + { + __IM uint32_t MIC : 1; + __IM uint32_t RESERVED : 31; + } MIC_B; + }; + + /*! @brief Interrupt clear register */ + union + { + __IM uint32_t ICF; + struct + { + __IM uint32_t ICF : 1; + __IM uint32_t RESERVED : 31; + } ICF_B; + }; + + __IM uint32_t RESERVED1[5]; + + /*! @brief Data register */ + union + { + __IOM uint32_t DATA; + struct + { + __IOM uint32_t DATA : 32; + } DATA_B; + }; + + __IM uint32_t RESERVED2[35]; + + /*! @brief Reception sample register */ + union + { + __IOM uint32_t RSD; + struct + { + __IOM uint32_t RSD : 8; + __IM uint32_t RESERVED1 : 8; + __IOM uint32_t RSE : 1; + __IM uint32_t RESERVED2 : 15; + } RSD_B; + }; + + /*! @brief Reception sample register */ + union + { + __IOM uint32_t CTRL3; + struct + { + __IOM uint32_t IAT : 2; + __IOM uint32_t ADDRLEN : 4; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t INSLEN : 2; + __IM uint32_t RESERVED2 : 1; + __IOM uint32_t WAITCYC : 5; + __IM uint32_t RESERVED3 : 14; + __IOM uint32_t CSEN : 1; + __IM uint32_t RESERVED4 : 1; + } CTRL3_B; + }; + + __IM uint32_t RESERVED3[66]; + + /*! @brief IO switch register */ + union + { + __IOM uint32_t IOSW; + struct + { + __IOM uint32_t IOSW : 1; + __IM uint32_t RESERVED : 31; + } IOSW_B; + }; +} QSPI_T; + +/*! + * @brief Debug MCU(DBGMCU) + */ +typedef struct +{ + /*! @brief ID register */ + union + { + __IOM uint32_t IDCODE; + struct + { + __IOM uint32_t EQR : 12; + __IM uint32_t RESERVED : 4; + __IOM uint32_t WVR : 16; + } IDCODE_B; + }; + + /*! @brief Control register */ + union + { + __IOM uint32_t CFG; + struct + { + __IOM uint32_t SLEEP_CLK_STS : 1; + __IOM uint32_t STOP_CLK_STS : 1; + __IOM uint32_t STANDBY_CLK_STS : 1; + __IM uint32_t RESERVED1 : 2; + __IOM uint32_t TRACE_IOEN : 1; + __IOM uint32_t TRACE_MODE : 2; + __IOM uint32_t IWDT_STS : 1; + __IOM uint32_t WWDT_STS : 1; + __IOM uint32_t TMR1_STS : 1; + __IOM uint32_t TMR2_STS : 1; + __IOM uint32_t TMR3_STS : 1; + __IOM uint32_t TMR4_STS : 1; + __IOM uint32_t CAN1_STS : 1; + __IOM uint32_t I2C1_SMBUS_TIMEOUT_STS : 1; + __IOM uint32_t I2C2_SMBUS_TIMEOUT_STS : 1; + __IM uint32_t RESERVED2 : 4; + __IOM uint32_t CAN2_STS : 1; + __IM uint32_t RESERVED3 : 10; + } CFG_B; + }; +} DBGMCU_T; + +/*! + * @brief USB Device controler(USBD) + */ +typedef union +{ + __IOM uint32_t EP; + + struct + { + __IOM uint32_t ADDR : 4; + __IOM uint32_t TXSTS : 2; + __IOM uint32_t TXDTOG : 1; + __IOM uint32_t CTFT : 1; + __IOM uint32_t KIND : 1; + __IOM uint32_t TYPE : 2; + __IOM uint32_t SETUP : 1; + __IOM uint32_t RXSTS : 2; + __IOM uint32_t RXDTOG : 1; + __IOM uint32_t CTFR : 1; + __IM uint32_t RESERVED : 16; + } EP_B; +} USBD_EP_REG_T; + +typedef struct +{ + /* Endpoint */ + USBD_EP_REG_T EP[8]; + + __IM uint32_t RESERVED[8]; + + /*! @brief Control register */ + union + { + __IOM uint32_t CTRL; + + struct + { + __IOM uint32_t FORRST : 1; + __IOM uint32_t PWRDOWN : 1; + __IOM uint32_t LPWREN : 1; + __IOM uint32_t FORSUS : 1; + __IOM uint32_t WUPREQ : 1; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t ESOFIEN : 1; + __IOM uint32_t SOFIEN : 1; + __IOM uint32_t RSTIEN : 1; + __IOM uint32_t SUSIEN : 1; + __IOM uint32_t WUPIEN : 1; + __IOM uint32_t ERRIEN : 1; + __IOM uint32_t PMAOUIEN : 1; + __IOM uint32_t CTRIEN : 1; + __IM uint32_t RESERVED2 : 16; + } CTRL_B; + }; + + /*! @brief Interrupt status register */ + union + { + __IOM uint32_t INTSTS; + + struct + { + __IOM uint32_t EPID : 4; + __IOM uint32_t DOT : 1; + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t ESOFFLG : 1; + __IOM uint32_t SOFFLG : 1; + __IOM uint32_t RSTREQ : 1; + __IOM uint32_t SUSREQ : 1; + __IOM uint32_t WUPREQ : 1; + __IOM uint32_t ERRFLG : 1; + __IOM uint32_t PMOFLG : 1; + __IOM uint32_t CTFLG : 1; + __IM uint32_t RESERVED2 : 16; + } INTSTS_B; + }; + + /*! @brief Frame number register */ + union + { + __IM uint32_t FRANUM; + + struct + { + __IM uint32_t FRANUM : 11; + __IM uint32_t LSOFNUM : 2; + __IM uint32_t LOCK : 1; + __IM uint32_t RXDMSTS : 1; + __IM uint32_t RXDPSTS : 1; + __IM uint32_t RESERVED : 16; + } FRANUM_B; + }; + + /*! @brief Device address register */ + union + { + __IOM uint32_t ADDR; + + struct + { + __IOM uint32_t ADDR : 7; + __IOM uint32_t USBDEN : 1; + __IM uint32_t RESERVED : 24; + } ADDR_B; + }; + + /*! @brief Buffer table address register */ + union + { + __IOM uint32_t BUFFTB; + + struct + { + __IM uint32_t RESERVED1 : 3; + __IOM uint32_t BUFFTB : 13; + __IM uint32_t RESERVED2 : 16; + } BUFFTB_B; + }; + + __IM uint32_t RESERVED1[43]; + + /*! @brief Buffer table address register*/ + union + { + __IOM uint32_t SWITCH; + + struct + { + __IOM uint32_t SWITCH : 1; + __IM uint32_t RESERVED : 31; + } SWITCH_B; + }; +} USBD_T; + +/**@} end of group Peripheral_registers_structures */ + +/** @defgroup Peripheral_memory_map + @{ +*/ + +/* FMC base address in the alias region */ +#define FMC_BASE ((uint32_t)0x08000000) +/* SRAM base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) +/* Peripheral base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) + +/* SRAM base address in the bit-band region */ +#define SRAM_BB_BASE ((uint32_t)0x22000000) +/* Peripheral base address in the bit-band region */ +#define PERIPH_BB_BASE ((uint32_t)0x42000000) + +/* QSPI registers base address */ +#define QSPI_BASE ((uint32_t)0xA0000000) + +/* Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TMR2_BASE (APB1PERIPH_BASE + 0x0000) +#define TMR3_BASE (APB1PERIPH_BASE + 0x0400) +#define TMR4_BASE (APB1PERIPH_BASE + 0x0800) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDT_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDT_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define USBD_BASE (APB1PERIPH_BASE + 0X5C00) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) +#define BAKPR_BASE (APB1PERIPH_BASE + 0x6C00) +#define PMU_BASE (APB1PERIPH_BASE + 0x7000) +#define CEC_BASE (APB1PERIPH_BASE + 0x7800) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EINT_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TMR1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define RCM_BASE (AHBPERIPH_BASE + 0x1000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) + +/* FMC registers base address */ +#define FMC_R_BASE (AHBPERIPH_BASE + 0x2000) +/* FMC Option Bytes base address */ +#define OB_BASE ((uint32_t)0x1FFFF800) +/* Debug MCU registers base address */ +#define DBGMCU_BASE ((uint32_t)0xE0042000) + +/**@} end of group Peripheral_memory_map */ + +/** @defgroup Peripheral_declaration + @{ +*/ + +#define CRC ((CRC_T *) CRC_BASE) +#define RTC ((RTC_T *) RTC_BASE) +#define PMU ((PMU_T *) PMU_BASE) +#define BAKPR ((BAKPR_T *) BAKPR_BASE) +#define TMR1 ((TMR_T *) TMR1_BASE) +#define TMR2 ((TMR_T *) TMR2_BASE) +#define TMR3 ((TMR_T *) TMR3_BASE) +#define TMR4 ((TMR_T *) TMR4_BASE) + +#define DMA1 ((DMA_T *) DMA1_BASE) +#define DMA1_Channel1 ((DMA_Channel_T *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_T *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_T *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_T *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_T *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_T *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_T *) DMA1_Channel7_BASE) + +#define CAN1 ((CAN_T *) CAN1_BASE) +#define CAN2 ((CAN_T *) CAN2_BASE) +#define I2C1 ((I2C_T *) I2C1_BASE) +#define I2C2 ((I2C_T *) I2C2_BASE) +#define OB ((OB_T *) OB_BASE) +#define ADC1 ((ADC_T *) ADC1_BASE) +#define ADC2 ((ADC_T *) ADC2_BASE) +#define EINT ((EINT_T *) EINT_BASE) +#define IWDT ((IWDT_T *) IWDT_BASE) +#define SPI1 ((SPI_T *) SPI1_BASE) +#define SPI2 ((SPI_T *) SPI2_BASE) +#define WWDT ((WWDT_T *) WWDT_BASE) +#define USART2 ((USART_T *) USART2_BASE) +#define USART3 ((USART_T *) USART3_BASE) +#define AFIO ((AFIO_T *) AFIO_BASE) +#define GPIOA ((GPIO_T *) GPIOA_BASE) +#define GPIOB ((GPIO_T *) GPIOB_BASE) +#define GPIOC ((GPIO_T *) GPIOC_BASE) +#define GPIOD ((GPIO_T *) GPIOD_BASE) +#define GPIOE ((GPIO_T *) GPIOE_BASE) +#define USART1 ((USART_T *) USART1_BASE) +#define RCM ((RCM_T *) RCM_BASE) +#define FMC ((FMC_T *) FMC_R_BASE) +#define USBD ((USBD_T *) USBD_BASE) +#define QSPI ((QSPI_T *) QSPI_BASE) +#define DBGMCU ((DBGMCU_T *) DBGMCU_BASE) + +/**@} end of group Peripheral_declaration */ + +/** @defgroup Exported_Macros + @{ +*/ + +/* Define one bit mask */ +#define BIT0 ((uint32_t)0x00000001) +#define BIT1 ((uint32_t)0x00000002) +#define BIT2 ((uint32_t)0x00000004) +#define BIT3 ((uint32_t)0x00000008) +#define BIT4 ((uint32_t)0x00000010) +#define BIT5 ((uint32_t)0x00000020) +#define BIT6 ((uint32_t)0x00000040) +#define BIT7 ((uint32_t)0x00000080) +#define BIT8 ((uint32_t)0x00000100) +#define BIT9 ((uint32_t)0x00000200) +#define BIT10 ((uint32_t)0x00000400) +#define BIT11 ((uint32_t)0x00000800) +#define BIT12 ((uint32_t)0x00001000) +#define BIT13 ((uint32_t)0x00002000) +#define BIT14 ((uint32_t)0x00004000) +#define BIT15 ((uint32_t)0x00008000) +#define BIT16 ((uint32_t)0x00010000) +#define BIT17 ((uint32_t)0x00020000) +#define BIT18 ((uint32_t)0x00040000) +#define BIT19 ((uint32_t)0x00080000) +#define BIT20 ((uint32_t)0x00100000) +#define BIT21 ((uint32_t)0x00200000) +#define BIT22 ((uint32_t)0x00400000) +#define BIT23 ((uint32_t)0x00800000) +#define BIT24 ((uint32_t)0x01000000) +#define BIT25 ((uint32_t)0x02000000) +#define BIT26 ((uint32_t)0x04000000) +#define BIT27 ((uint32_t)0x08000000) +#define BIT28 ((uint32_t)0x10000000) +#define BIT29 ((uint32_t)0x20000000) +#define BIT30 ((uint32_t)0x40000000) +#define BIT31 ((uint32_t)0x80000000) + +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) + +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) + +#define READ_BIT(REG, BIT) ((REG) & (BIT)) + +#define CLEAR_REG(REG) ((REG) = (0x0)) + +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) + +#define READ_REG(REG) ((REG)) + +#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) + +/**@} end of group Exported_Macros */ +/**@} end of group APM32S10x */ +/**@} end of group CMSIS */ + +#ifdef __cplusplus +} +#endif + +#endif /* __APM32S10X_H */ + + diff --git a/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Include/system_apm32s10x.h b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Include/system_apm32s10x.h new file mode 100644 index 0000000000..b84005625b --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Include/system_apm32s10x.h @@ -0,0 +1,60 @@ +/*! + * @file system_apm32s10x.h + * + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Define to prevent recursive inclusion */ +#ifndef __SYSTEM_APM32S10X_H +#define __SYSTEM_APM32S10X_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup CMSIS + @{ +*/ + +/** @addtogroup APM32S10x_System + @{ +*/ + +/** @defgroup System_Variables + @{ +*/ + +extern uint32_t SystemCoreClock; + +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); + +/**@} end of group System_Functions */ +/**@} end of group APM32S10x_System */ +/**@} end of group CMSIS */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_APM32S10X_H */ + diff --git a/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/arm/startup_apm32s10x_md.s b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/arm/startup_apm32s10x_md.s new file mode 100644 index 0000000000..3dbd20ec1c --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/arm/startup_apm32s10x_md.s @@ -0,0 +1,322 @@ +;/*! +; * @file startup_apm32s10x_md.s +; * +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32s10x_md +; * +; * @version V1.0.0 +; * +; * @date 2022-12-31 +; * +; * @attention +; * +; * Copyright (C) 2022-2023 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be usefull and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. +; */ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDT_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EINT Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCM_IRQHandler ; RCM + DCD EINT0_IRQHandler ; EINT Line 0 + DCD EINT1_IRQHandler ; EINT Line 1 + DCD EINT2_IRQHandler ; EINT Line 2 + DCD EINT3_IRQHandler ; EINT Line 3 + DCD EINT4_IRQHandler ; EINT Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1_2 + DCD USBD1_HP_CAN1_TX_IRQHandler ; USBD1 High Priority or CAN1 TX + DCD USBD1_LP_CAN1_RX0_IRQHandler ; USBD1 Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EINT9_5_IRQHandler ; EINT Line 9..5 + DCD TMR1_BRK_IRQHandler ; TMR1 Break + DCD TMR1_UP_IRQHandler ; TMR1 Update + DCD TMR1_TRG_COM_IRQHandler ; TMR1 Trigger and Commutation + DCD TMR1_CC_IRQHandler ; TMR1 Capture Compare + DCD TMR2_IRQHandler ; TMR2 + DCD TMR3_IRQHandler ; TMR3 + DCD TMR4_IRQHandler ; TMR4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EINT15_10_IRQHandler ; EINT Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EINT Line + DCD USBDWakeUp_IRQHandler ; USBD Wakeup from suspend + DCD FPU_IRQHandler ; FPU + DCD QSPI_IRQHandler ; QSPI + DCD USBD2_HP_CAN2_TX_IRQHandler ; USBD2 High Priority or CAN2 TX + DCD USBD2_LP_CAN2_RX0_IRQHandler ; USBD2 Low Priority or CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_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 WWDT_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCM_IRQHandler [WEAK] + EXPORT EINT0_IRQHandler [WEAK] + EXPORT EINT1_IRQHandler [WEAK] + EXPORT EINT2_IRQHandler [WEAK] + EXPORT EINT3_IRQHandler [WEAK] + EXPORT EINT4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_2_IRQHandler [WEAK] + EXPORT USBD1_HP_CAN1_TX_IRQHandler [WEAK] + EXPORT USBD1_LP_CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EINT9_5_IRQHandler [WEAK] + EXPORT TMR1_BRK_IRQHandler [WEAK] + EXPORT TMR1_UP_IRQHandler [WEAK] + EXPORT TMR1_TRG_COM_IRQHandler [WEAK] + EXPORT TMR1_CC_IRQHandler [WEAK] + EXPORT TMR2_IRQHandler [WEAK] + EXPORT TMR3_IRQHandler [WEAK] + EXPORT TMR4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EINT15_10_IRQHandler [WEAK] + EXPORT RTCAlarm_IRQHandler [WEAK] + EXPORT USBDWakeUp_IRQHandler [WEAK] + EXPORT FPU_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USBD2_HP_CAN2_TX_IRQHandler [WEAK] + EXPORT USBD2_LP_CAN2_RX0_IRQHandler [WEAK] + EXPORT CAN2_RX1_IRQHandler [WEAK] + EXPORT CAN2_SCE_IRQHandler [WEAK] + +WWDT_IRQHandler +PVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +RCM_IRQHandler +EINT0_IRQHandler +EINT1_IRQHandler +EINT2_IRQHandler +EINT3_IRQHandler +EINT4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_2_IRQHandler +USBD1_HP_CAN1_TX_IRQHandler +USBD1_LP_CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EINT9_5_IRQHandler +TMR1_BRK_IRQHandler +TMR1_UP_IRQHandler +TMR1_TRG_COM_IRQHandler +TMR1_CC_IRQHandler +TMR2_IRQHandler +TMR3_IRQHandler +TMR4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EINT15_10_IRQHandler +RTCAlarm_IRQHandler +USBDWakeUp_IRQHandler +FPU_IRQHandler +QSPI_IRQHandler +USBD2_HP_CAN2_TX_IRQHandler +USBD2_LP_CAN2_RX0_IRQHandler +CAN2_RX1_IRQHandler +CAN2_SCE_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + 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 + + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;*******************************END OF FILE************************************ diff --git a/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/gcc_APM32S10xx8.ld b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/gcc_APM32S10xx8.ld new file mode 100644 index 0000000000..a0fc23acda --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/gcc_APM32S10xx8.ld @@ -0,0 +1,164 @@ +/*! + * @file gcc_APM32S10xx8.ld + * + * @brief Linker script for APM32S10xx8 Device with + * 64KByte FLASH, 36KByte RAM + * + * @version V1.0.0 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Flash Configuration*/ +/* Flash Base Address */ +_rom_base = 0x8000000; +/*Flash Size (in Bytes) */ +_rom_size = 0x0010000; + +/* Embedded RAM Configuration */ +/* RAM Base Address */ +_ram_base = 0x20000000; +/* RAM Size (in Bytes) */ +_ram_size = 0x00009000; + +/* Stack / Heap Configuration */ +_end_stack = 0x20009000; +/* Heap Size (in Bytes) */ +_heap_size = 0x200; +/* Stack Size (in Bytes) */ +_stack_size = 0x400; + +MEMORY +{ +FLASH (rx) : ORIGIN = _rom_base, LENGTH = _rom_size +RAM (xrw) : ORIGIN = _ram_base, LENGTH = _ram_size +} + +SECTIONS +{ + .apm32_isr_vector : + { + . = ALIGN(4); + KEEP(*(.apm32_isr_vector)) + . = ALIGN(4); + } >FLASH + + .text : + { + . = ALIGN(4); + *(.text) + *(.text*) + *(.glue_7) + *(.glue_7t) + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; + } >FLASH + + .rodata : + { + . = ALIGN(4); + *(.rodata) + *(.rodata*) + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + _start_address_init_data = LOADADDR(.data); + + .data : + { + . = ALIGN(4); + _start_address_data = .; + *(.data) + *(.data*) + + . = ALIGN(4); + _end_address_data = .; + } >RAM AT> FLASH + + + . = ALIGN(4); + .bss : + { + + _start_address_bss = .; + __bss_start__ = _start_address_bss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _end_address_bss = .; + __bss_end__ = _end_address_bss; + } >RAM + + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _heap_size; + . = . + _stack_size; + . = ALIGN(8); + } >RAM + + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + diff --git a/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/gcc_APM32S10xxB.ld b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/gcc_APM32S10xxB.ld new file mode 100644 index 0000000000..1a8182a6a1 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/gcc_APM32S10xxB.ld @@ -0,0 +1,164 @@ +/*! + * @file gcc_APM32S10xxB.ld + * + * @brief Linker script for APM32S10xxB Device with + * 128KByte FLASH, 36KByte RAM + * + * @version V1.0.0 + * + * @date 2022-11-30 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Flash Configuration*/ +/* Flash Base Address */ +_rom_base = 0x8000000; +/*Flash Size (in Bytes) */ +_rom_size = 0x0020000; + +/* Embedded RAM Configuration */ +/* RAM Base Address */ +_ram_base = 0x20000000; +/* RAM Size (in Bytes) */ +_ram_size = 0x00009000; + +/* Stack / Heap Configuration */ +_end_stack = 0x20009000; +/* Heap Size (in Bytes) */ +_heap_size = 0x200; +/* Stack Size (in Bytes) */ +_stack_size = 0x400; + +MEMORY +{ +FLASH (rx) : ORIGIN = _rom_base, LENGTH = _rom_size +RAM (xrw) : ORIGIN = _ram_base, LENGTH = _ram_size +} + +SECTIONS +{ + .apm32_isr_vector : + { + . = ALIGN(4); + KEEP(*(.apm32_isr_vector)) + . = ALIGN(4); + } >FLASH + + .text : + { + . = ALIGN(4); + *(.text) + *(.text*) + *(.glue_7) + *(.glue_7t) + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; + } >FLASH + + .rodata : + { + . = ALIGN(4); + *(.rodata) + *(.rodata*) + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + _start_address_init_data = LOADADDR(.data); + + .data : + { + . = ALIGN(4); + _start_address_data = .; + *(.data) + *(.data*) + + . = ALIGN(4); + _end_address_data = .; + } >RAM AT> FLASH + + + . = ALIGN(4); + .bss : + { + + _start_address_bss = .; + __bss_start__ = _start_address_bss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _end_address_bss = .; + __bss_end__ = _end_address_bss; + } >RAM + + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _heap_size; + . = . + _stack_size; + . = ALIGN(8); + } >RAM + + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + diff --git a/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/startup_apm32s10x_md.S b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/startup_apm32s10x_md.S new file mode 100644 index 0000000000..8620cf6eac --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/gcc/startup_apm32s10x_md.S @@ -0,0 +1,336 @@ +/*! + * @file startup_apm32s10x_md.S + * + * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32s10x_md + * + * @version V1.0.0 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be useful and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .thumb + +.global g_apm32_Vectors +.global Default_Handler + +.word _start_address_init_data +.word _start_address_data +.word _end_address_data +.word _start_address_bss +.word _end_address_bss + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +// Reset handler routine +Reset_Handler: + + ldr r0, =_start_address_data + ldr r1, =_end_address_data + ldr r2, =_start_address_init_data + movs r3, #0 + b L_loop0_0 + +L_loop0: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +L_loop0_0: + adds r4, r0, r3 + cmp r4, r1 + bcc L_loop0 + + ldr r2, =_start_address_bss + ldr r4, =_end_address_bss + movs r3, #0 + b L_loop1 + +L_loop2: + str r3, [r2] + adds r2, r2, #4 + +L_loop1: + cmp r2, r4 + bcc L_loop2 + + bl SystemInit + bl __libc_init_array + bl entry + bx lr +.size Reset_Handler, .-Reset_Handler + +// This is the code that gets called when the processor receives an unexpected interrupt. + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +L_Loop_infinite: + b L_Loop_infinite + .size Default_Handler, .-Default_Handler + +// The minimal vector table for a Cortex M3. + .section .isr_vector,"a",%progbits + .type g_apm32_Vectors, %object + .size g_apm32_Vectors, .-g_apm32_Vectors + +// Vector Table Mapped to Address 0 at Reset +g_apm32_Vectors: + + .word _end_stack // Top of Stack + .word Reset_Handler // Reset Handler + .word NMI_Handler // NMI Handler + .word HardFault_Handler // Hard Fault Handler + .word MemManage_Handler // MPU Fault Handler + .word BusFault_Handler // Bus Fault Handler + .word UsageFault_Handler // Usage Fault Handler + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word SVC_Handler // SVCall Handler + .word DebugMon_Handler // Debug Monitor Handler + .word 0 // Reserved + .word PendSV_Handler // PendSV Handler + .word SysTick_Handler // SysTick Handler + .word WWDT_IRQHandler // Window Watchdog + .word PVD_IRQHandler // PVD through EINT Line detect + .word TAMPER_IRQHandler // Tamper + .word RTC_IRQHandler // RTC + .word FLASH_IRQHandler // Flash + .word RCM_IRQHandler // RCM + .word EINT0_IRQHandler // EINT Line 0 + .word EINT1_IRQHandler // EINT Line 1 + .word EINT2_IRQHandler // EINT Line 2 + .word EINT3_IRQHandler // EINT Line 3 + .word EINT4_IRQHandler // EINT Line 4 + .word DMA1_Channel1_IRQHandler // DMA1 Channel 1 + .word DMA1_Channel2_IRQHandler // DMA1 Channel 2 + .word DMA1_Channel3_IRQHandler // DMA1 Channel 3 + .word DMA1_Channel4_IRQHandler // DMA1 Channel 4 + .word DMA1_Channel5_IRQHandler // DMA1 Channel 5 + .word DMA1_Channel6_IRQHandler // DMA1 Channel 6 + .word DMA1_Channel7_IRQHandler // DMA1 Channel 7 + .word ADC1_2_IRQHandler // ADC1 & ADC2 + .word USBD1_HP_CAN1_TX_IRQHandler // USBD1 High Priority or CAN1 TX + .word USBD1_LP_CAN1_RX0_IRQHandler // USBD1 Low Priority or CAN1 RX0 + .word CAN1_RX1_IRQHandler // CAN1 RX1 + .word CAN1_SCE_IRQHandler // CAN1 SCE + .word EINT9_5_IRQHandler // EINT Line 9..5 + .word TMR1_BRK_IRQHandler // TMR1 Break + .word TMR1_UP_IRQHandler // TMR1 Update + .word TMR1_TRG_COM_IRQHandler // TMR1 Trigger and Commutation + .word TMR1_CC_IRQHandler // TMR1 Capture Compare + .word TMR2_IRQHandler // TMR2 + .word TMR3_IRQHandler // TMR3 + .word TMR4_IRQHandler // TMR4 + .word I2C1_EV_IRQHandler // I2C1 Event + .word I2C1_ER_IRQHandler // I2C1 Error + .word I2C2_EV_IRQHandler // I2C2 Event + .word I2C2_ER_IRQHandler // I2C2 Error + .word SPI1_IRQHandler // SPI1 + .word SPI2_IRQHandler // SPI2 + .word USART1_IRQHandler // USART1 + .word USART2_IRQHandler // USART2 + .word USART3_IRQHandler // USART3 + .word EINT15_10_IRQHandler // EINT Line 15..10 + .word RTCAlarm_IRQHandler // RTC Alarm through EINT Line + .word USBDWakeUp_IRQHandler // USBD Wakeup from suspend + .word FPU_IRQHandler // FPU + .word QSPI_IRQHandler // QSPI + .word USBD2_HP_CAN2_TX_IRQHandler // USBD2 High Priority or CAN2 TX + .word USBD2_LP_CAN2_RX0_IRQHandler // USBD2 Low Priority or CAN2 RX0 + .word CAN2_RX1_IRQHandler // CAN2 RX1 + .word CAN2_SCE_IRQHandler // CAN2 SCE + +// Default exception/interrupt handler + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDT_IRQHandler + .thumb_set WWDT_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCM_IRQHandler + .thumb_set RCM_IRQHandler,Default_Handler + + .weak EINT0_IRQHandler + .thumb_set EINT0_IRQHandler,Default_Handler + + .weak EINT1_IRQHandler + .thumb_set EINT1_IRQHandler,Default_Handler + + .weak EINT2_IRQHandler + .thumb_set EINT2_IRQHandler,Default_Handler + + .weak EINT3_IRQHandler + .thumb_set EINT3_IRQHandler,Default_Handler + + .weak EINT4_IRQHandler + .thumb_set EINT4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USBD1_HP_CAN1_TX_IRQHandler + .thumb_set USBD1_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USBD1_LP_CAN1_RX0_IRQHandler + .thumb_set USBD1_LP_CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EINT9_5_IRQHandler + .thumb_set EINT9_5_IRQHandler,Default_Handler + + .weak TMR1_BRK_IRQHandler + .thumb_set TMR1_BRK_IRQHandler,Default_Handler + + .weak TMR1_UP_IRQHandler + .thumb_set TMR1_UP_IRQHandler,Default_Handler + + .weak TMR1_TRG_COM_IRQHandler + .thumb_set TMR1_TRG_COM_IRQHandler,Default_Handler + + .weak TMR1_CC_IRQHandler + .thumb_set TMR1_CC_IRQHandler,Default_Handler + + .weak TMR2_IRQHandler + .thumb_set TMR2_IRQHandler,Default_Handler + + .weak TMR3_IRQHandler + .thumb_set TMR3_IRQHandler,Default_Handler + + .weak TMR4_IRQHandler + .thumb_set TMR4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EINT15_10_IRQHandler + .thumb_set EINT15_10_IRQHandler,Default_Handler + + .weak RTCAlarm_IRQHandler + .thumb_set RTCAlarm_IRQHandler,Default_Handler + + .weak USBDWakeUp_IRQHandler + .thumb_set USBDWakeUp_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + + .weak QSPI_IRQHandler + .thumb_set QSPI_IRQHandler,Default_Handler + + .weak USBD2_HP_CAN2_TX_IRQHandler + .thumb_set USBD2_HP_CAN2_TX_IRQHandler,Default_Handler + + .weak USBD2_LP_CAN2_RX0_IRQHandler + .thumb_set USBD2_LP_CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler diff --git a/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/iar/startup_apm32s10x_md.s b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/iar/startup_apm32s10x_md.s new file mode 100644 index 0000000000..661fa3c33c --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/iar/startup_apm32s10x_md.s @@ -0,0 +1,415 @@ +;/*! +; * @file startup_apm32s10x_md.s +; * +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device APM32S103 +; * +; * @version V1.0.0 +; * +; * @date 2022-12-31 +; * +; * @attention +; * +; * Copyright (C) 2022-2023 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be usefull and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. +; */ + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDT_IRQHandler ; Window Watchdog + DCD PVD_IRQHandler ; PVD through EINT Line detect + DCD TAMPER_IRQHandler ; Tamper + DCD RTC_IRQHandler ; RTC + DCD FLASH_IRQHandler ; Flash + DCD RCM_IRQHandler ; RCM + DCD EINT0_IRQHandler ; EINT Line 0 + DCD EINT1_IRQHandler ; EINT Line 1 + DCD EINT2_IRQHandler ; EINT Line 2 + DCD EINT3_IRQHandler ; EINT Line 3 + DCD EINT4_IRQHandler ; EINT Line 4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_2_IRQHandler ; ADC1 & ADC2 + DCD USBD1_HP_CAN1_TX_IRQHandler ; USBD1 High Priority or CAN1 TX + DCD USBD1_LP_CAN1_RX0_IRQHandler ; USBD1 Low Priority or CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EINT9_5_IRQHandler ; EINT Line 9..5 + DCD TMR1_BRK_IRQHandler ; TMR1 Break + DCD TMR1_UP_IRQHandler ; TMR1 Update + DCD TMR1_TRG_COM_IRQHandler ; TMR1 Trigger and Commutation + DCD TMR1_CC_IRQHandler ; TMR1 Capture Compare + DCD TMR2_IRQHandler ; TMR2 + DCD TMR3_IRQHandler ; TMR3 + DCD TMR4_IRQHandler ; TMR4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EINT15_10_IRQHandler ; EINT Line 15..10 + DCD RTCAlarm_IRQHandler ; RTC Alarm through EINT Line + DCD USBDWakeUp_IRQHandler ; USBD Wakeup from suspend + DCD FPU_IRQHandler ; FPU + DCD QSPI_IRQHandler ; QSPI + DCD USBD2_HP_CAN2_TX_IRQHandler ; USBD2 High Priority or CAN2 TX + DCD USBD2_LP_CAN2_RX0_IRQHandler ; USBD2 Low Priority or CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE +__Vectors_End + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDT_IRQHandler + B WWDT_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RCM_IRQHandler + B RCM_IRQHandler + + PUBWEAK EINT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT0_IRQHandler + B EINT0_IRQHandler + + PUBWEAK EINT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT1_IRQHandler + B EINT1_IRQHandler + + PUBWEAK EINT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT2_IRQHandler + B EINT2_IRQHandler + + PUBWEAK EINT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT3_IRQHandler + B EINT3_IRQHandler + + PUBWEAK EINT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT4_IRQHandler + B EINT4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USBD1_HP_CAN1_TX_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBD1_HP_CAN1_TX_IRQHandler + B USBD1_HP_CAN1_TX_IRQHandler + + PUBWEAK USBD1_LP_CAN1_RX0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBD1_LP_CAN1_RX0_IRQHandler + B USBD1_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EINT9_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT9_5_IRQHandler + B EINT9_5_IRQHandler + + PUBWEAK TMR1_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR1_BRK_IRQHandler + B TMR1_BRK_IRQHandler + + PUBWEAK TMR1_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR1_UP_IRQHandler + B TMR1_UP_IRQHandler + + PUBWEAK TMR1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR1_TRG_COM_IRQHandler + B TMR1_TRG_COM_IRQHandler + + PUBWEAK TMR1_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR1_CC_IRQHandler + B TMR1_CC_IRQHandler + + PUBWEAK TMR2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR2_IRQHandler + B TMR2_IRQHandler + + PUBWEAK TMR3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR3_IRQHandler + B TMR3_IRQHandler + + PUBWEAK TMR4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +TMR4_IRQHandler + B TMR4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EINT15_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EINT15_10_IRQHandler + B EINT15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBDWakeUp_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBDWakeUp_IRQHandler + B USBDWakeUp_IRQHandler + + PUBWEAK FPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FPU_IRQHandler + B FPU_IRQHandler + + PUBWEAK QSPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +QSPI_IRQHandler + B QSPI_IRQHandler + + PUBWEAK USBD2_HP_CAN2_TX_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBD2_HP_CAN2_TX_IRQHandler + B USBD2_HP_CAN2_TX_IRQHandler + + PUBWEAK USBD2_LP_CAN2_RX0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USBD2_LP_CAN2_RX0_IRQHandler + B USBD2_LP_CAN2_RX0_IRQHandler + + PUBWEAK CAN2_RX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CAN2_RX1_IRQHandler + B CAN2_RX1_IRQHandler + + PUBWEAK CAN2_SCE_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CAN2_SCE_IRQHandler + B CAN2_SCE_IRQHandler + + END + diff --git a/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/system_apm32s10x.c b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/system_apm32s10x.c new file mode 100644 index 0000000000..6e38e1f552 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/Device/Geehy/APM32S10x/Source/system_apm32s10x.c @@ -0,0 +1,594 @@ +/*! + * @file system_apm32s10x.c + * + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File + * + * @version V1.0.1 + * + * @date 2022-12-31 + * + * @attention + * + * Copyright (C) 2022-2023 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +/* Includes */ +#include "apm32s10x.h" + +/** @addtogroup CMSIS + @{ +*/ + +/** @addtogroup APM32S10x_System + * @brief APM32S10x system configuration + @{ +*/ + +/** @defgroup System_Macros + @{ +*/ + +/***************************************************************** + * If SYSCLK source is PLL,SystemCoreClock will contain the * + * HSE_VALUE or HSI_VALUE multiplied/divided by the PLL factors. * +******************************************************************/ + +//#define SYSTEM_CLOCK_HSE HSE_VALUE +//#define SYSTEM_CLOCK_24MHz (24000000) +//#define SYSTEM_CLOCK_36MHz (36000000) +//#define SYSTEM_CLOCK_48MHz (48000000) +//#define SYSTEM_CLOCK_56MHz (56000000) +#define SYSTEM_CLOCK_72MHz (72000000) +//#define SYSTEM_CLOCK_96MHz (96000000) + +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 + +/**@} end of group System_Macros */ + +/** @defgroup System_Variables + @{ +*/ + +#ifdef SYSTEM_CLOCK_HSE + uint32_t SystemCoreClock = SYSTEM_CLOCK_HSE; +#elif defined SYSTEM_CLOCK_24MHz + uint32_t SystemCoreClock = SYSTEM_CLOCK_24MHz; +#elif defined SYSTEM_CLOCK_36MHz + uint32_t SystemCoreClock = SYSTEM_CLOCK_36MHz; +#elif defined SYSTEM_CLOCK_48MHz + uint32_t SystemCoreClock = SYSTEM_CLOCK_48MHz; +#elif defined SYSTEM_CLOCK_56MHz + uint32_t SystemCoreClock = SYSTEM_CLOCK_56MHz; +#elif defined SYSTEM_CLOCK_72MHz + uint32_t SystemCoreClock = SYSTEM_CLOCK_72MHz; +#else + uint32_t SystemCoreClock = SYSTEM_CLOCK_96MHz; +#endif + +/**@} end of group System_Variables */ + +/** @defgroup System_Functions + @{ +*/ + +static void SystemClockConfig(void); + +#ifdef SYSTEM_CLOCK_HSE + static void SystemClockHSE(void); +#elif defined SYSTEM_CLOCK_24MHz + static void SystemClock24M(void); +#elif defined SYSTEM_CLOCK_36MHz + static void SystemClock36M(void); +#elif defined SYSTEM_CLOCK_48MHz + static void SystemClock48M(void); +#elif defined SYSTEM_CLOCK_56MHz + static void SystemClock56M(void); +#elif defined SYSTEM_CLOCK_72MHz + static void SystemClock72M(void); +#elif defined SYSTEM_CLOCK_96MHz + static void SystemClock96M(void); +#endif + +/*! + * @brief Setup the microcontroller system + * + * @param None + * + * @retval None + * + */ +void SystemInit(void) +{ + /* Set HSIEN bit */ + RCM->CTRL_B.HSIEN = BIT_SET; + /* Reset SCLKSEL, AHBPSC, APB1PSC, APB2PSC, ADCPSC and MCOSEL bits */ + RCM->CFG &= (uint32_t)0xF8FF0000; + /* Reset HSEEN, CSSEN and PLLEN bits */ + RCM->CTRL &= (uint32_t)0xFEF6FFFF; + /* Reset HSEBCFG bit */ + RCM->CTRL_B.HSEBCFG = BIT_RESET; + /* Reset PLLSRCSEL, PLLHSEPSC, PLLMULCFG and USBDIV bits */ + RCM->CFG &= (uint32_t)0xFF80FFFF; + /* Disable all interrupts and clear pending bits */ + RCM->INT = 0x009F0000; + + SystemClockConfig(); + +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; +#else + SCB->VTOR = FMC_BASE | VECT_TAB_OFFSET; +#endif +} + +/*! + * @brief Update SystemCoreClock variable according to Clock Register Values + * The SystemCoreClock variable contains the core clock (HCLK) + * + * @param None + * + * @retval None + * + */ +void SystemCoreClockUpdate(void) +{ + uint32_t sysClock, pllMull, pllSource, Prescaler; + uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + + sysClock = RCM->CFG_B.SCLKSELSTS; + + switch (sysClock) + { + /* sys clock is HSI */ + case 0: + SystemCoreClock = HSI_VALUE; + break; + + /* sys clock is HSE */ + case 1: + SystemCoreClock = HSE_VALUE; + break; + + /* sys clock is PLL */ + case 2: + pllMull = RCM->CFG_B.PLLMULCFG + 2; + pllSource = RCM->CFG_B.PLLSRCSEL; + + /* PLL entry clock source is HSE */ + if (pllSource == BIT_SET) + { + SystemCoreClock = HSE_VALUE * pllMull; + + /* HSE clock divided by 2 */ + if (pllSource == RCM->CFG_B.PLLHSEPSC) + { + SystemCoreClock >>= 1; + } + } + /* PLL entry clock source is HSI/2 */ + else + { + SystemCoreClock = (HSI_VALUE >> 1) * pllMull; + } + break; + + default: + SystemCoreClock = HSI_VALUE; + break; + } + + Prescaler = AHBPrescTable[RCM->CFG_B.AHBPSC]; + SystemCoreClock >>= Prescaler; +} + +/*! + * @brief Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + */ +static void SystemClockConfig(void) +{ +#ifdef SYSTEM_CLOCK_HSE + SystemClockHSE(); +#elif defined SYSTEM_CLOCK_24MHz + SystemClock24M(); +#elif defined SYSTEM_CLOCK_36MHz + SystemClock36M(); +#elif defined SYSTEM_CLOCK_48MHz + SystemClock48M(); +#elif defined SYSTEM_CLOCK_56MHz + SystemClock56M(); +#elif defined SYSTEM_CLOCK_72MHz + SystemClock72M(); +#elif defined SYSTEM_CLOCK_96MHz + SystemClock96M(); +#endif +} + +#if defined SYSTEM_CLOCK_HSE +/*! + * @brief Select HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + */ +static void SystemClockHSE(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN = BIT_SET; + + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if (RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if (RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 0 wait state */ + FMC->CTRL1_B.WS = 0; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /* PCLK1 = HCLK */ + RCM->CFG_B.APB1PSC = 0; + + /* Select HSE as system clock source */ + RCM->CFG_B.SCLKSEL = 1; + + /* Wait till HSE is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x01); + } +} + + +#elif defined SYSTEM_CLOCK_24MHz +/*! + * @brief Set System clock frequency to 24MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + */ +static void SystemClock24M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN = BIT_SET; + + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if (RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if (RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 0 wait state */ + FMC->CTRL1_B.WS = 0; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /* PCLK1 = HCLK */ + RCM->CFG_B.APB1PSC = 0; + + /* PLL: (HSE / 2) * 6 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLHSEPSC = 1; + RCM->CFG_B.PLLMULCFG = 4; + + /* Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /* Wait PLL Ready */ + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /* Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); + } +} + +#elif defined SYSTEM_CLOCK_36MHz +/*! + * @brief Set System clock frequency to 36MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + */ +static void SystemClock36M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN = BIT_SET; + + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if (RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if (RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 1 wait state */ + FMC->CTRL1_B.WS = 1; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /* PCLK1 = HCLK */ + RCM->CFG_B.APB1PSC = 0; + + /* PLL: (HSE / 2) * 9 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLHSEPSC = 1; + RCM->CFG_B.PLLMULCFG = 7; + + /* Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /* Wait PLL Ready */ + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /* Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); + } +} + +#elif defined SYSTEM_CLOCK_48MHz +/*! + * @brief Set System clock frequency to 46MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + */ +static void SystemClock48M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN = BIT_SET; + + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if (RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if (RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 1 wait state */ + FMC->CTRL1_B.WS = 1; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /* PLL: HSE * 6 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 4; + + /* Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /* Wait PLL Ready */ + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /* Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); + } +} + +#elif defined SYSTEM_CLOCK_56MHz +/*! + * @brief Set System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + */ +static void SystemClock56M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN = BIT_SET; + + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if (RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if (RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 2 wait state */ + FMC->CTRL1_B.WS = 2; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /* PLL: HSE * 7 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 5; + + /* Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /* Wait PLL Ready */ + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /* Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); + } +} + +#elif defined SYSTEM_CLOCK_72MHz +/*! + * @brief Set System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + */ +static void SystemClock72M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN = BIT_SET; + + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if (RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if (RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 2 wait state */ + FMC->CTRL1_B.WS = 2; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /* PLL: HSE * 9 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 7; + + /* Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /* Wait PLL Ready */ + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /* Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); + } + +} + +#elif defined SYSTEM_CLOCK_96MHz +/*! + * @brief Set System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers + * + * @param None + * + * @retval None + * + */ +static void SystemClock96M(void) +{ + __IO uint32_t i; + + RCM->CTRL_B.HSEEN = BIT_SET; + + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) + { + if (RCM->CTRL_B.HSERDYFLG) + { + break; + } + } + + if (RCM->CTRL_B.HSERDYFLG) + { + /* Enable Prefetch Buffer */ + FMC->CTRL1_B.PBEN = BIT_SET; + /* Flash 3 wait state */ + FMC->CTRL1_B.WS = 3; + + /* HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /* PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /* PCLK1 = HCLK / 2 */ + RCM->CFG_B.APB1PSC = 4; + + /* PLL: HSE * 12 */ + RCM->CFG_B.PLLSRCSEL = 1; + RCM->CFG_B.PLLMULCFG = 10; + + /* Enable PLL */ + RCM->CTRL_B.PLLEN = 1; + /* Wait PLL Ready */ + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + + /* Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /* Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); + } +} +#endif + +/**@} end of group System_Functions */ +/**@} end of group APM32S10x_System */ +/**@} end of group CMSIS */ + diff --git a/bsp/apm32/libraries/APM32S10x_Library/SConscript b/bsp/apm32/libraries/APM32S10x_Library/SConscript new file mode 100644 index 0000000000..edc3a8e280 --- /dev/null +++ b/bsp/apm32/libraries/APM32S10x_Library/SConscript @@ -0,0 +1,52 @@ +import rtconfig +Import('RTT_ROOT') +from building import * + +# get current directory +cwd = GetCurrentDir() + +# The set of source files associated with this SConscript file. +src = Split(""" +Device/Geehy/APM32S10x/Source/system_apm32s10x.c +APM32S10x_StdPeriphDriver/src/apm32s10x_gpio.c +APM32S10x_StdPeriphDriver/src/apm32s10x_misc.c +APM32S10x_StdPeriphDriver/src/apm32s10x_rcm.c +APM32S10x_StdPeriphDriver/src/apm32s10x_usart.c +APM32S10x_StdPeriphDriver/src/apm32s10x_eint.c +APM32S10x_StdPeriphDriver/src/apm32s10x_dma.c +""") + +if GetDepend(['RT_USING_ADC']): + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_adc.c'] + +if GetDepend(['RT_USING_DAC']): + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_dac.c'] + +if GetDepend(['RT_USING_RTC']): + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_rtc.c'] + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_pmu.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_spi.c'] + +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_tmr.c'] + +if GetDepend(['RT_USING_WDT']): + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_wwdt.c'] + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_iwdt.c'] + +if GetDepend(['RT_USING_CAN']): + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_can.c'] + +if GetDepend(['BSP_USING_ON_CHIP_FLASH']): + src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_fmc.c'] + +path = [cwd + '/Device/Geehy/APM32S10x/Include', + cwd + '/APM32S10x_StdPeriphDriver/inc', + cwd + '/CMSIS/Include'] + +CPPDEFINES = ['USE_STDPERIPH_DRIVER'] +group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/apm32/libraries/Drivers/SConscript b/bsp/apm32/libraries/Drivers/SConscript index 49eecade04..30015b3240 100644 --- a/bsp/apm32/libraries/Drivers/SConscript +++ b/bsp/apm32/libraries/Drivers/SConscript @@ -48,12 +48,21 @@ if GetDepend(['BSP_USING_ETH', 'RT_USING_LWIP']): if GetDepend(['BSP_USING_SDIO']): src += ['drv_sdio.c'] +if GetDepend(['RT_USING_CAN']): + src += ['drv_can.c'] + if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_APM32F0']): src += ['drv_flash/drv_flash_f0.c'] if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_APM32F1']): src += ['drv_flash/drv_flash_f1.c'] +if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_APM32E1']): + src += ['drv_flash/drv_flash_e1.c'] + +if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_APM32S1']): + src += ['drv_flash/drv_flash_s1.c'] + if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_APM32F4']): src += ['drv_flash/drv_flash_f4.c'] diff --git a/bsp/apm32/libraries/Drivers/drv_adc.c b/bsp/apm32/libraries/Drivers/drv_adc.c index c90df12ce3..c57cb390e4 100644 --- a/bsp/apm32/libraries/Drivers/drv_adc.c +++ b/bsp/apm32/libraries/Drivers/drv_adc.c @@ -6,8 +6,9 @@ * Change Logs: * Date Author Notes * 2022-03-04 stevetong459 first version - * 2022-07-15 Aligagago add apm32F4 serie MCU support - * 2022-12-26 luobeihai add apm32F0 serie MCU support + * 2022-07-15 Aligagago add APM32F4 series MCU support + * 2022-12-26 luobeihai add APM32F0 series MCU support + * 2023-03-27 luobeihai add APM32E1/S1 series MCU support */ #include @@ -33,7 +34,7 @@ struct apm32_adc struct rt_adc_device adc_dev; }; -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) static struct apm32_adc adc_config[] = { #ifdef BSP_USING_ADC1 @@ -49,9 +50,10 @@ static struct apm32_adc adc_config[] = 1 }, { - GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(A, 4), - GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(B, 0), GET_PIN(B, 1), - GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3) + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), + GET_PIN(A, 4), GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), + GET_PIN(B, 0), GET_PIN(B, 1), GET_PIN(C, 0), GET_PIN(C, 1), + GET_PIN(C, 2), GET_PIN(C, 3), GET_PIN(C, 4), GET_PIN(C, 5) }, }, #endif @@ -68,9 +70,10 @@ static struct apm32_adc adc_config[] = 1 }, { - GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(A, 4), - GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(B, 0), GET_PIN(B, 1), - GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3) + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), + GET_PIN(A, 4), GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), + GET_PIN(B, 0), GET_PIN(B, 1), GET_PIN(C, 0), GET_PIN(C, 1), + GET_PIN(C, 2), GET_PIN(C, 3), GET_PIN(C, 4), GET_PIN(C, 5) }, }, #endif @@ -87,8 +90,9 @@ static struct apm32_adc adc_config[] = 1 }, { - GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(F, 6), - GET_PIN(F, 7), GET_PIN(F, 8), GET_PIN(F, 9), GET_PIN(F, 10) + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), + GET_PIN(F, 6), GET_PIN(F, 7), GET_PIN(F, 8), GET_PIN(F, 9), + GET_PIN(F, 10) }, }, #endif @@ -110,9 +114,10 @@ static struct apm32_adc adc_config[] = 1 }, { - GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(A, 4), - GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(B, 0), GET_PIN(B, 1), - GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3) + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), + GET_PIN(A, 4), GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), + GET_PIN(B, 0), GET_PIN(B, 1), GET_PIN(C, 0), GET_PIN(C, 1), + GET_PIN(C, 2), GET_PIN(C, 3), GET_PIN(C, 4), GET_PIN(C, 5) }, }, #endif @@ -130,9 +135,10 @@ static struct apm32_adc adc_config[] = 1 }, { - GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(A, 4), - GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(B, 0), GET_PIN(B, 1), - GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3) + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), + GET_PIN(A, 4), GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), + GET_PIN(B, 0), GET_PIN(B, 1), GET_PIN(C, 0), GET_PIN(C, 1), + GET_PIN(C, 2), GET_PIN(C, 3), GET_PIN(C, 4), GET_PIN(C, 5) }, }, #endif @@ -150,9 +156,10 @@ static struct apm32_adc adc_config[] = 1 }, { - GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(F, 6), - GET_PIN(F, 7), GET_PIN(F, 8), GET_PIN(F, 9), GET_PIN(F, 10), GET_PIN(F, 3), - GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3) + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), + GET_PIN(F, 6), GET_PIN(F, 7), GET_PIN(F, 8), GET_PIN(F, 9), + GET_PIN(F, 10), GET_PIN(F, 3), GET_PIN(C, 0), GET_PIN(C, 1), + GET_PIN(C, 2), GET_PIN(C, 3) }, }, #endif @@ -173,10 +180,10 @@ static struct apm32_adc adc_config[] = ADC_EXT_TRIG_EDGE_NONE }, { - GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(A, 4), - GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(B, 0), GET_PIN(B, 1), - GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3), GET_PIN(C, 4), - GET_PIN(C, 5) + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), + GET_PIN(A, 4), GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), + GET_PIN(B, 0), GET_PIN(B, 1), GET_PIN(C, 0), GET_PIN(C, 1), + GET_PIN(C, 2), GET_PIN(C, 3), GET_PIN(C, 4), GET_PIN(C, 5) }, }, #endif @@ -186,7 +193,16 @@ static struct apm32_adc adc_config[] = static rt_err_t apm32_adc_channel_check(struct rt_adc_device *device, rt_uint32_t channel) { struct apm32_adc *adc_cfg = ((struct apm32_adc *)device->parent.user_data); -#if defined(SOC_SERIES_APM32F1) + + if ((adc_cfg->adc == ADC1) || (adc_cfg->adc == ADC2)) + { + if (channel <= 15) + { + return RT_EOK; + } + } + +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) if (adc_cfg->adc == ADC3) { if (channel <= 8) @@ -194,25 +210,20 @@ static rt_err_t apm32_adc_channel_check(struct rt_adc_device *device, rt_uint32_ return RT_EOK; } } - else +#endif + +#if defined(SOC_SERIES_APM32F4) + if (adc_cfg->adc == ADC3) { if (channel <= 13) { return RT_EOK; } } -#elif defined(SOC_SERIES_APM32F4) - if (channel <= 13) - { - return RT_EOK; - } -#elif defined(SOC_SERIES_APM32F0) - if (channel <= 16) - { - return RT_EOK; - } #endif + LOG_E("channel %d of %s is not supported.", channel, adc_cfg->name); + return -RT_ERROR; } @@ -225,7 +236,7 @@ static rt_err_t apm32_adc_gpio_init(struct rt_adc_device *device, rt_uint32_t ch { return -RT_ERROR; } -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA << ((adc_cfg->channel_pin[channel] >> 4) & 0xFu)); hw_gpio_config.mode = GPIO_MODE_ANALOG; #elif defined(SOC_SERIES_APM32F4) @@ -273,7 +284,8 @@ static rt_err_t apm32_adc_enabled(struct rt_adc_device *device, rt_uint32_t chan { ADC_Disable(); } -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) if (enabled) { if (adc_cfg->adc == ADC1) @@ -284,10 +296,12 @@ static rt_err_t apm32_adc_enabled(struct rt_adc_device *device, rt_uint32_t chan { RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC2); } - else + #ifdef BSP_USING_ADC3 + else if (adc_cfg->adc == ADC3) { RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC3); } + #endif /* BSP_USING_ADC3 */ if (apm32_adc_gpio_init(device, channel) != RT_EOK) { return -RT_ERROR; @@ -301,7 +315,7 @@ static rt_err_t apm32_adc_enabled(struct rt_adc_device *device, rt_uint32_t chan { ADC_Disable(adc_cfg->adc); } -#endif +#endif /* SOC_SERIES_APM32F0 */ return RT_EOK; } @@ -332,7 +346,7 @@ static rt_err_t apm32_adc_get_value(struct rt_adc_device *device, rt_uint32_t ch return -RT_ERROR; } -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) ADC_ConfigRegularChannel(adc_cfg->adc, channel, 1, ADC_SAMPLETIME_13CYCLES5); ADC_StartCalibration(adc_cfg->adc); diff --git a/bsp/apm32/libraries/Drivers/drv_can.c b/bsp/apm32/libraries/Drivers/drv_can.c new file mode 100644 index 0000000000..c8510fede8 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_can.c @@ -0,0 +1,881 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-30 luobeihai first version + */ + +#include "drv_can.h" + +#ifdef RT_USING_CAN + +#if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) + +#define LOG_TAG "drv_can" +#include + +#ifdef BSP_USING_CAN1 +static struct apm32_can drv_can1 = +{ + .name = "can1", + .CANx = CAN1, +}; +#endif + +#ifdef BSP_USING_CAN2 +static struct apm32_can drv_can2 = +{ + .name = "can2", + .CANx = CAN2, +}; +#endif + +/* baud calculation example: PCLK1 / ((timeSegment1 + timeSegment2 + 1) * prescaler) = 36 / ((1 + 8 + 3) * 3) = 1MHz */ +#if defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) || defined (SOC_SERIES_APM32S1) /* APB1 36MHz(max) */ +static const struct apm32_baud_rate_tab can_baud_rate_tab[] = +{ + APM32_CAN_BAUD_DEF(CAN1MBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_3, 3), + APM32_CAN_BAUD_DEF(CAN800kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_5, CAN_TIME_SEGMENT2_3, 5), + APM32_CAN_BAUD_DEF(CAN500kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_3, 6), + APM32_CAN_BAUD_DEF(CAN250kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_3, 12), + APM32_CAN_BAUD_DEF(CAN125kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_3, 24), + APM32_CAN_BAUD_DEF(CAN100kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_3, 30), + APM32_CAN_BAUD_DEF(CAN50kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_3, 60), + APM32_CAN_BAUD_DEF(CAN20kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_3, 150), + APM32_CAN_BAUD_DEF(CAN10kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_3, 300), +}; +#elif defined (SOC_SERIES_APM32F4) /* APB1 42MHz(max) */ +static const struct apm32_baud_rate_tab can_baud_rate_tab[] = +{ + APM32_CAN_BAUD_DEF(CAN1MBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_9, CAN_TIME_SEGMENT2_4, 3), + APM32_CAN_BAUD_DEF(CAN800kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_8, CAN_TIME_SEGMENT2_4, 4), + APM32_CAN_BAUD_DEF(CAN500kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_9, CAN_TIME_SEGMENT2_4, 6), + APM32_CAN_BAUD_DEF(CAN250kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_9, CAN_TIME_SEGMENT2_4, 12), + APM32_CAN_BAUD_DEF(CAN125kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_9, CAN_TIME_SEGMENT2_4, 24), + APM32_CAN_BAUD_DEF(CAN100kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_9, CAN_TIME_SEGMENT2_4, 30), + APM32_CAN_BAUD_DEF(CAN50kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_9, CAN_TIME_SEGMENT2_4, 60), + APM32_CAN_BAUD_DEF(CAN20kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_9, CAN_TIME_SEGMENT2_4, 150), + APM32_CAN_BAUD_DEF(CAN10kBaud, CAN_SJW_1, CAN_TIME_SEGMENT1_9, CAN_TIME_SEGMENT2_4, 300), +}; +#endif + +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].baud_rate == baud) + return index; + } + + return 0; /* default baud is CAN1MBaud */ +} + +static rt_err_t apm32_can_config(struct rt_can_device *can, struct can_configure *cfg) +{ + struct apm32_can *drv_can; + rt_uint32_t baud_index; + + RT_ASSERT(can); + RT_ASSERT(cfg); + drv_can = (struct apm32_can *)can->parent.user_data; + RT_ASSERT(drv_can); + + /* init can gpio and enable can clock */ + extern void apm32_msp_can_init(void *Instance); + apm32_msp_can_init(drv_can->CANx); + + CAN_ConfigStructInit(&drv_can->can_init); + + drv_can->can_init.autoBusOffManage = ENABLE; + drv_can->can_init.autoWakeUpMode = DISABLE; + drv_can->can_init.nonAutoRetran = DISABLE; + drv_can->can_init.rxFIFOLockMode = DISABLE; + drv_can->can_init.txFIFOPriority = ENABLE; + + /* can mode config */ + switch (cfg->mode) + { + case RT_CAN_MODE_NORMAL: + drv_can->can_init.mode = CAN_MODE_NORMAL; + break; + + case RT_CAN_MODE_LISTEN: + drv_can->can_init.mode = CAN_MODE_SILENT; + break; + + case RT_CAN_MODE_LOOPBACK: + drv_can->can_init.mode = CAN_MODE_LOOPBACK; + break; + + case RT_CAN_MODE_LOOPBACKANLISTEN: + drv_can->can_init.mode = CAN_MODE_SILENT_LOOPBACK; + break; + + default: + drv_can->can_init.mode = CAN_MODE_NORMAL; + break; + } + + /* can baud config */ + baud_index = get_can_baud_index(cfg->baud_rate); + drv_can->can_init.syncJumpWidth = can_baud_rate_tab[baud_index].syncJumpWidth; + drv_can->can_init.timeSegment1 = can_baud_rate_tab[baud_index].timeSegment1; + drv_can->can_init.timeSegment2 = can_baud_rate_tab[baud_index].timeSegment2; + drv_can->can_init.prescaler = can_baud_rate_tab[baud_index].prescaler; + + /* init can */ + if (CAN_Config(drv_can->CANx, &drv_can->can_init) != SUCCESS) + { + LOG_D("Can init error"); + return -RT_ERROR; + } + + /* default filter config */ +#if defined(SOC_SERIES_APM32F4) || defined(APM32F10X_CL) + CAN_ConfigFilter(&drv_can->FilterConfig); +#else + CAN_ConfigFilter(drv_can->CANx, &drv_can->FilterConfig); +#endif + + return RT_EOK; +} + +static rt_err_t apm32_can_control(struct rt_can_device *can, int cmd, void *arg) +{ + rt_uint32_t argval; + struct apm32_can *drv_can; + struct rt_can_filter_config *filter_cfg; + + RT_ASSERT(can != RT_NULL); + drv_can = (struct apm32_can *)can->parent.user_data; + RT_ASSERT(drv_can != RT_NULL); + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + argval = (rt_uint32_t) arg; + if (argval == RT_DEVICE_FLAG_INT_RX) + { + if (CAN1 == drv_can->CANx) + { + NVIC_DisableIRQRequest(CAN1_RX0_IRQn); + NVIC_DisableIRQRequest(CAN1_RX1_IRQn); + } +#ifdef BSP_USING_CAN2 + if (CAN2 == drv_can->CANx) + { + NVIC_DisableIRQRequest(CAN2_RX0_IRQn); + NVIC_DisableIRQRequest(CAN2_RX1_IRQn); + } +#endif + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_F0MP); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_F0FULL); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_F0OVR); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_F1MP); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_F1FULL); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_F1OVR); + } + else if (argval == RT_DEVICE_FLAG_INT_TX) + { + if (CAN1 == drv_can->CANx) + { + NVIC_DisableIRQRequest(CAN1_TX_IRQn); + } +#ifdef BSP_USING_CAN2 + if (CAN2 == drv_can->CANx) + { + NVIC_DisableIRQRequest(CAN2_TX_IRQn); + } +#endif + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_TXME); + } + else if (argval == RT_DEVICE_CAN_INT_ERR) + { + if (CAN1 == drv_can->CANx) + { + NVIC_DisableIRQRequest(CAN1_SCE_IRQn); + } +#ifdef BSP_USING_CAN2 + if (CAN2 == drv_can->CANx) + { + NVIC_DisableIRQRequest(CAN2_SCE_IRQn); + } +#endif + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_ERRW); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_ERRP); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_BOF); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_LEC); + CAN_DisableInterrupt(drv_can->CANx, CAN_INT_ERR); + } + break; + case RT_DEVICE_CTRL_SET_INT: + argval = (rt_uint32_t) arg; + if (argval == RT_DEVICE_FLAG_INT_RX) + { + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_F0MP); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_F0FULL); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_F0OVR); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_F1MP); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_F1FULL); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_F1OVR); + + if (CAN1 == drv_can->CANx) + { + NVIC_EnableIRQRequest(CAN1_RX0_IRQn, 1, 0); + NVIC_EnableIRQRequest(CAN1_RX1_IRQn, 1, 0); + } +#ifdef BSP_USING_CAN2 + if (CAN2 == drv_can->CANx) + { + NVIC_EnableIRQRequest(CAN2_RX0_IRQn, 1, 0); + NVIC_EnableIRQRequest(CAN2_RX1_IRQn, 1, 0); + } +#endif + } + else if (argval == RT_DEVICE_FLAG_INT_TX) + { + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_TXME); + + if (CAN1 == drv_can->CANx) + { + NVIC_EnableIRQRequest(CAN1_TX_IRQn, 1, 0); + } +#ifdef BSP_USING_CAN2 + if (CAN2 == drv_can->CANx) + { + NVIC_EnableIRQRequest(CAN2_TX_IRQn, 1, 0); + } +#endif + } + else if (argval == RT_DEVICE_CAN_INT_ERR) + { + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_ERRW); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_ERRP); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_BOF); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_LEC); + CAN_EnableInterrupt(drv_can->CANx, CAN_INT_ERR); + + if (CAN1 == drv_can->CANx) + { + NVIC_EnableIRQRequest(CAN1_SCE_IRQn, 1, 0); + } +#ifdef BSP_USING_CAN2 + if (CAN2 == drv_can->CANx) + { + NVIC_EnableIRQRequest(CAN2_SCE_IRQn, 1, 0); + } +#endif + } + break; + case RT_CAN_CMD_SET_FILTER: + { + rt_uint32_t id_h = 0; + rt_uint32_t id_l = 0; + rt_uint32_t mask_h = 0; + rt_uint32_t mask_l = 0; + rt_uint32_t mask_l_tail = 0; //CAN_FxR2 bit [2:0] + + if (RT_NULL == arg) + { + /* default filter config */ +#if defined(SOC_SERIES_APM32F4) || defined(APM32F10X_CL) + CAN_ConfigFilter(&drv_can->FilterConfig); +#else + CAN_ConfigFilter(drv_can->CANx, &drv_can->FilterConfig); +#endif + } + else + { + filter_cfg = (struct rt_can_filter_config *)arg; + /* get default filter */ + for (int i = 0; i < filter_cfg->count; i++) + { + if (filter_cfg->items[i].hdr_bank == -1) + { + /* use default filter bank settings */ + if (rt_strcmp(drv_can->name, "can1") == 0) + { + /* can1 banks 0~13 */ + drv_can->FilterConfig.filterNumber = i; + } + else if (rt_strcmp(drv_can->name, "can2") == 0) + { + /* can2 banks 14~27 */ + drv_can->FilterConfig.filterNumber = i + 14; + } + } + else + { + /* use user-defined filter bank settings */ + drv_can->FilterConfig.filterNumber = filter_cfg->items[i].hdr_bank; + } + /** + * ID | CAN_FxR1[31:24] | CAN_FxR1[23:16] | CAN_FxR1[15:8] | CAN_FxR1[7:0] | + * MASK | CAN_FxR2[31:24] | CAN_FxR2[23:16] | CAN_FxR2[15:8] | CAN_FxR2[7:0] | + * STD ID | STID[10:3] | STDID[2:0] |<- 21bit ->| + * EXT ID | EXTID[28:21] | EXTID[20:13] | EXTID[12:5] | EXTID[4:0] IDE RTR 0| + * @note the 32bit STD ID must << 21 to fill CAN_FxR1[31:21] and EXT ID must << 3, + * -> but the id bit of struct rt_can_filter_item is 29, + * -> so STD id << 18 and EXT id Don't need << 3, when get the high 16bit. + * -> FilterIdHigh : (((STDid << 18) or (EXT id)) >> 13) & 0xFFFF, + * -> FilterIdLow: ((STDid << 18) or (EXT id << 3)) & 0xFFFF. + * @note the mask bit of struct rt_can_filter_item is 32, + * -> FilterMaskIdHigh: (((STD mask << 21) or (EXT mask <<3)) >> 16) & 0xFFFF + * -> FilterMaskIdLow: ((STD mask << 21) or (EXT mask <<3)) & 0xFFFF + */ + if (filter_cfg->items[i].mode == CAN_FILTER_MODE_IDMASK) + { + /* make sure the CAN_FxR1[2:0](IDE RTR) work */ + mask_l_tail = 0x06; + drv_can->FilterConfig.filterMode = CAN_FILTER_MODE_IDMASK; + } + else if (filter_cfg->items[i].mode == CAN_FILTER_MODE_IDLIST) + { + /* same as CAN_FxR1 */ + mask_l_tail = (filter_cfg->items[i].ide << 2) | (filter_cfg->items[i].rtr << 1); + drv_can->FilterConfig.filterMode = CAN_FILTER_MODE_IDLIST; + } + if (filter_cfg->items[i].ide == RT_CAN_STDID) + { + id_h = ((filter_cfg->items[i].id << 18) >> 13) & 0xFFFF; + id_l = ((filter_cfg->items[i].id << 18) | + (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1)) & 0xFFFF; + mask_h = ((filter_cfg->items[i].mask << 21) >> 16) & 0xFFFF; + mask_l = ((filter_cfg->items[i].mask << 21) | mask_l_tail) & 0xFFFF; + } + else if (filter_cfg->items[i].ide == RT_CAN_EXTID) + { + id_h = (filter_cfg->items[i].id >> 13) & 0xFFFF; + id_l = ((filter_cfg->items[i].id << 3) | + (filter_cfg->items[i].ide << 2) | + (filter_cfg->items[i].rtr << 1)) & 0xFFFF; + mask_h = ((filter_cfg->items[i].mask << 3) >> 16) & 0xFFFF; + mask_l = ((filter_cfg->items[i].mask << 3) | mask_l_tail) & 0xFFFF; + } + drv_can->FilterConfig.filterIdHigh = id_h; + drv_can->FilterConfig.filterIdLow = id_l; + drv_can->FilterConfig.filterMaskIdHigh = mask_h; + drv_can->FilterConfig.filterMaskIdLow = mask_l; + drv_can->FilterConfig.filterFIFO = CAN_FILTER_FIFO_0; + drv_can->FilterConfig.filterScale = CAN_FILTER_SCALE_32BIT; + drv_can->FilterConfig.filterActivation = ENABLE; + + /* Filter conf */ +#if defined(SOC_SERIES_APM32F4) || defined(APM32F10X_CL) + CAN_ConfigFilter(&drv_can->FilterConfig); +#else + CAN_ConfigFilter(drv_can->CANx, &drv_can->FilterConfig); +#endif + } + } + break; + } + case RT_CAN_CMD_SET_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 != drv_can->device.config.mode) + { + drv_can->device.config.mode = argval; + return apm32_can_config(&drv_can->device, &drv_can->device.config); + } + break; + case RT_CAN_CMD_SET_BAUD: + 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 != drv_can->device.config.baud_rate) + { + drv_can->device.config.baud_rate = argval; + return apm32_can_config(&drv_can->device, &drv_can->device.config); + } + break; + case RT_CAN_CMD_SET_PRIV: + argval = (rt_uint32_t) arg; + if (argval != RT_CAN_MODE_PRIV && + argval != RT_CAN_MODE_NOPRIV) + { + return -RT_ERROR; + } + if (argval != drv_can->device.config.privmode) + { + drv_can->device.config.privmode = argval; + return apm32_can_config(&drv_can->device, &drv_can->device.config); + } + break; + case RT_CAN_CMD_GET_STATUS: + { + rt_uint32_t errtype; + errtype = drv_can->CANx->ERRSTS; + drv_can->device.status.rcverrcnt = errtype >> 24; + drv_can->device.status.snderrcnt = (errtype >> 16 & 0xFF); + drv_can->device.status.lasterrtype = errtype & 0x70; + drv_can->device.status.errcode = errtype & 0x07; + + rt_memcpy(arg, &drv_can->device.status, sizeof(drv_can->device.status)); + } + break; + } + + return RT_EOK; +} + +static int can_send_rtmsg(CAN_T *CANx, struct rt_can_msg *pmsg, uint32_t mailbox_index) +{ + CAN_TxMessage_T CAN_TxMessage = {0}; + CAN_TxMessage_T *TxMessage = &CAN_TxMessage; + + if (RT_CAN_STDID == pmsg->ide) + { + TxMessage->typeID = CAN_TYPEID_STD; + TxMessage->stdID = pmsg->id; + } + else + { + TxMessage->typeID = CAN_TYPEID_EXT; + TxMessage->extID = pmsg->id; + } + + if (RT_CAN_DTR == pmsg->rtr) + { + TxMessage->remoteTxReq = CAN_RTXR_DATA; + } + else + { + TxMessage->remoteTxReq = CAN_RTXR_REMOTE; + } + + /* Set up the Id */ + CANx->sTxMailBox[mailbox_index].TXMID &= 0x00000001; + if (TxMessage->typeID == CAN_TYPEID_STD) + { + CANx->sTxMailBox[mailbox_index].TXMID |= (TxMessage->stdID << 21) | (TxMessage->remoteTxReq); + } + else + { + CANx->sTxMailBox[mailbox_index].TXMID |= (TxMessage->extID << 3) | (TxMessage->typeID) | (TxMessage->remoteTxReq); + } + + /* Set up the TXDLEN */ + TxMessage->dataLengthCode = pmsg->len & 0x0FU; + CANx->sTxMailBox[mailbox_index].TXDLEN &= (uint32_t)0xFFFFFFF0; + CANx->sTxMailBox[mailbox_index].TXDLEN |= TxMessage->dataLengthCode; + + /* Set up the data field */ + CANx->sTxMailBox[mailbox_index].TXMDH = (((uint32_t)pmsg->data[7] << 24) | + ((uint32_t)pmsg->data[6] << 16) | + ((uint32_t)pmsg->data[5] << 8) | + ((uint32_t)pmsg->data[4])); + CANx->sTxMailBox[mailbox_index].TXMDL = (((uint32_t)pmsg->data[3] << 24) | + ((uint32_t)pmsg->data[2] << 16) | + ((uint32_t)pmsg->data[1] << 8) | + ((uint32_t)pmsg->data[0])); + + /* Request transmission */ + CANx->sTxMailBox[mailbox_index].TXMID |= 0x00000001; + + return RT_EOK; +} + +static int apm32_can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num) +{ + struct apm32_can *drv_can; + + RT_ASSERT(can != RT_NULL); + RT_ASSERT(buf != RT_NULL); + drv_can = (struct apm32_can *)can->parent.user_data; + RT_ASSERT(drv_can != RT_NULL); + + /* Select one empty transmit mailbox */ + switch (box_num) + { + case CAN_TX_MAILBIX_0: + if ((drv_can->CANx->TXSTS & 0x04000000) != 0x04000000) + { + /* Return function status */ + return -RT_ERROR; + } + break; + case CAN_TX_MAILBIX_1: + if ((drv_can->CANx->TXSTS & 0x08000000) != 0x08000000) + { + /* Return function status */ + return -RT_ERROR; + } + break; + case CAN_TX_MAILBIX_2: + if ((drv_can->CANx->TXSTS & 0x10000000) != 0x10000000) + { + /* Return function status */ + return -RT_ERROR; + } + break; + default: + RT_ASSERT(0); + break; + } + + /* Start send msg */ + return can_send_rtmsg(drv_can->CANx, ((struct rt_can_msg *)buf), box_num); +} + +static int apm32_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo) +{ + struct apm32_can *drv_can; + struct rt_can_msg *pmsg; + CAN_RxMessage_T RxMessage = {0}; + + RT_ASSERT(can); + + drv_can = (struct apm32_can *)can->parent.user_data; + + pmsg = (struct rt_can_msg *) buf; + + CAN_RxMessage(drv_can->CANx, (CAN_RX_FIFO_T)fifo, &RxMessage); + + /* get data */ + pmsg->data[0] = RxMessage.data[0]; + pmsg->data[1] = RxMessage.data[1]; + pmsg->data[2] = RxMessage.data[2]; + pmsg->data[3] = RxMessage.data[3]; + pmsg->data[4] = RxMessage.data[4]; + pmsg->data[5] = RxMessage.data[5]; + pmsg->data[6] = RxMessage.data[6]; + pmsg->data[7] = RxMessage.data[7]; + + /* get id */ + if (CAN_TYPEID_STD == RxMessage.typeID) + { + pmsg->ide = RT_CAN_STDID; + pmsg->id = RxMessage.stdID; + } + else + { + pmsg->ide = RT_CAN_EXTID; + pmsg->id = RxMessage.extID; + } + + /* get type */ + if (CAN_RTXR_DATA == RxMessage.remoteTxReq) + { + pmsg->rtr = RT_CAN_DTR; + } + else + { + pmsg->rtr = RT_CAN_RTR; + } + /*get rxfifo = CAN_RX_FIFO0/CAN_RX_FIFO1*/ + pmsg->rxfifo = fifo; + + /* get len */ + pmsg->len = RxMessage.dataLengthCode; + + /* get hdr_index */ + if (drv_can->CANx == CAN1) + { + pmsg->hdr_index = RxMessage.filterMatchIndex; + } +#ifdef CAN2 + else if (drv_can->CANx == CAN2) + { + pmsg->hdr_index = RxMessage.filterMatchIndex; + } +#endif + + return RT_EOK; +} + +static const struct rt_can_ops _can_ops = +{ + apm32_can_config, + apm32_can_control, + apm32_can_sendmsg, + apm32_can_recvmsg, +}; + +static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo) +{ + struct apm32_can *drv_can; + RT_ASSERT(can != RT_NULL); + drv_can = (struct apm32_can *)can->parent.user_data; + RT_ASSERT(drv_can != RT_NULL); + + switch (fifo) + { + case CAN_RX_FIFO_0: + /* save to user list */ + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_F0MP) && CAN_PendingMessage(drv_can->CANx, CAN_RX_FIFO_0)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + } + /* Check FULL flag for FIFO0 */ + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_F0FULL)) + { + /* Clear FIFO0 FULL Flag */ + CAN_ClearStatusFlag(drv_can->CANx, CAN_FLAG_F0FULL); + } + /* Check Overrun flag for FIFO0 */ + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_F0OVR)) + { + /* Clear FIFO0 Overrun Flag */ + CAN_ClearStatusFlag(drv_can->CANx, CAN_FLAG_F0OVR); + rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8); + } + break; + + case CAN_RX_FIFO_1: + /* save to user list */ + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_F1MP) && CAN_PendingMessage(drv_can->CANx, CAN_RX_FIFO_1)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + } + /* Check FULL flag for FIFO1 */ + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_F1FULL)) + { + /* Clear FIFO1 FULL Flag */ + CAN_ClearStatusFlag(drv_can->CANx, CAN_FLAG_F1FULL); + } + /* Check Overrun flag for FIFO1 */ + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_F1OVR)) + { + /* Clear FIFO1 Overrun Flag */ + CAN_ClearStatusFlag(drv_can->CANx, CAN_FLAG_F1OVR); + rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8); + } + break; + } +} + +static void _can_sce_isr(struct rt_can_device *can) +{ + struct apm32_can *drv_can; + RT_ASSERT(can != RT_NULL); + drv_can = (struct apm32_can *)can->parent.user_data; + RT_ASSERT(drv_can != RT_NULL); + + rt_uint32_t errtype = drv_can->CANx->ERRSTS; + + switch ((errtype & 0x70) >> 4) + { + case RT_CAN_BUS_BIT_PAD_ERR: + can->status.bitpaderrcnt++; + break; + case RT_CAN_BUS_FORMAT_ERR: + can->status.formaterrcnt++; + break; + case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */ + can->status.ackerrcnt++; + if (!READ_BIT(drv_can->CANx->TXSTS, 0x00000002)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8); + } + else if (!READ_BIT(drv_can->CANx->TXSTS, 0x00000200)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8); + } + else if (!READ_BIT(drv_can->CANx->TXSTS, 0x00020000)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8); + } + break; + case RT_CAN_BUS_IMPLICIT_BIT_ERR: + case RT_CAN_BUS_EXPLICIT_BIT_ERR: + can->status.biterrcnt++; + break; + case RT_CAN_BUS_CRC_ERR: + can->status.crcerrcnt++; + break; + } + + can->status.lasterrtype = errtype & 0x70; + can->status.rcverrcnt = errtype >> 24; + can->status.snderrcnt = (errtype >> 16 & 0xFF); + can->status.errcode = errtype & 0x07; + + /* clear error interrupt flag */ + CAN_ClearIntFlag(drv_can->CANx, CAN_INT_ERR); +} + +static void _can_tx_isr(struct rt_can_device *can) +{ + struct apm32_can *drv_can; + RT_ASSERT(can != RT_NULL); + drv_can = (struct apm32_can *)can->parent.user_data; + RT_ASSERT(drv_can != RT_NULL); + + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_REQC0)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE | (0x00 << 8)); + CAN_ClearStatusFlag(drv_can->CANx, CAN_FLAG_REQC0); + } + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_REQC1)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE | (0x01 << 8)); + CAN_ClearStatusFlag(drv_can->CANx, CAN_FLAG_REQC1); + } + if (CAN_ReadStatusFlag(drv_can->CANx, CAN_FLAG_REQC2)) + { + rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE | (0x02 << 8)); + CAN_ClearStatusFlag(drv_can->CANx, CAN_FLAG_REQC2); + } +} + +#ifdef BSP_USING_CAN1 +/** + * @brief This function handles CAN1 TX interrupts. transmit fifo0/1/2 is empty can trigger this interrupt + */ +void CAN1_TX_IRQHandler(void) +{ + rt_interrupt_enter(); + _can_tx_isr(&drv_can1.device); + rt_interrupt_leave(); +} + +/** + * @brief This function handles CAN1 RX0 interrupts. + */ +void CAN1_RX0_IRQHandler(void) +{ + rt_interrupt_enter(); + _can_rx_isr(&drv_can1.device, CAN_RX_FIFO0); + rt_interrupt_leave(); +} + +/** + * @brief This function handles CAN1 RX1 interrupts. + */ +void CAN1_RX1_IRQHandler(void) +{ + rt_interrupt_enter(); + _can_rx_isr(&drv_can1.device, CAN_RX_FIFO1); + rt_interrupt_leave(); +} + +/** + * @brief This function handles CAN1 SCE interrupts. + */ +void CAN1_SCE_IRQHandler(void) +{ + rt_interrupt_enter(); + _can_sce_isr(&drv_can1.device); + rt_interrupt_leave(); +} +#endif /* BSP_USING_CAN1 */ + +#ifdef BSP_USING_CAN2 +/** + * @brief This function handles CAN2 TX interrupts. + */ +void CAN2_TX_IRQHandler(void) +{ + rt_interrupt_enter(); + _can_tx_isr(&drv_can2.device); + rt_interrupt_leave(); +} + +/** + * @brief This function handles CAN2 RX0 interrupts. + */ +void CAN2_RX0_IRQHandler(void) +{ + rt_interrupt_enter(); + _can_rx_isr(&drv_can2.device, CAN_RX_FIFO0); + rt_interrupt_leave(); +} + +/** + * @brief This function handles CAN2 RX1 interrupts. + */ +void CAN2_RX1_IRQHandler(void) +{ + rt_interrupt_enter(); + _can_rx_isr(&drv_can2.device, CAN_RX_FIFO1); + rt_interrupt_leave(); +} + +/** + * @brief This function handles CAN2 SCE interrupts. + */ +void CAN2_SCE_IRQHandler(void) +{ + rt_interrupt_enter(); + _can_sce_isr(&drv_can2.device); + rt_interrupt_leave(); +} +#endif /* BSP_USING_CAN2 */ + +int rt_hw_can_init(void) +{ + struct can_configure config = CANDEFAULTCONFIG; + config.privmode = RT_CAN_MODE_NOPRIV; + config.ticks = 50; +#ifdef RT_CAN_USING_HDR + config.maxhdr = 14; +#if defined(CAN2) && (defined(APM32F10X_CL) || defined(SOC_SERIES_APM32F4)) + config.maxhdr = 28; +#endif +#endif + /* config default filter */ + CAN_FilterConfig_T filterConf = {0}; + filterConf.filterNumber = 0; + filterConf.filterIdHigh = 0x0000; + filterConf.filterIdLow = 0x0000; + filterConf.filterMaskIdHigh = 0x0000; + filterConf.filterMaskIdLow = 0x0000; + filterConf.filterFIFO = CAN_FILTER_FIFO_0; + filterConf.filterMode = CAN_FILTER_MODE_IDMASK; + filterConf.filterScale = CAN_FILTER_SCALE_32BIT; + filterConf.filterActivation = ENABLE; + +#ifdef BSP_USING_CAN1 + filterConf.filterNumber = 0; + + drv_can1.FilterConfig = filterConf; + drv_can1.device.config = config; + /* register CAN1 device */ + rt_hw_can_register(&drv_can1.device, drv_can1.name, &_can_ops, &drv_can1); +#endif /* BSP_USING_CAN1 */ + +#ifdef BSP_USING_CAN2 +#if defined(APM32F10X_HD) || defined(APM32E10X_HD) || defined(APM32S10X_MD) + filterConf.filterNumber = 0; +#elif defined(APM32F10X_CL) || defined(SOC_SERIES_APM32F4) + filterConf.filterNumber = 14; +#else + filterConf.filterNumber = 0; +#endif + drv_can2.FilterConfig = filterConf; + drv_can2.device.config = config; + /* register CAN2 device */ + rt_hw_can_register(&drv_can2.device, drv_can2.name, &_can_ops, &drv_can2); +#endif /* BSP_USING_CAN2 */ + + return 0; +} + +INIT_BOARD_EXPORT(rt_hw_can_init); + +#endif /* defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) */ +#endif /*RT_USING_CAN*/ diff --git a/bsp/apm32/libraries/Drivers/drv_can.h b/bsp/apm32/libraries/Drivers/drv_can.h new file mode 100644 index 0000000000..36ff591393 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_can.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-30 luobeihai first version + */ + +#ifndef __DRV_CAN_H__ +#define __DRV_CAN_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(APM32F10X_HD) || defined(APM32E10X_HD) || defined(APM32S10X_MD) +/* Aliases for __IRQn */ +#define CAN1_TX_IRQn USBD1_HP_CAN1_TX_IRQn +#define CAN1_RX0_IRQn USBD1_LP_CAN1_RX0_IRQn +#define CAN2_TX_IRQn USBD2_HP_CAN2_TX_IRQn +#define CAN2_RX0_IRQn USBD2_LP_CAN2_RX0_IRQn + +/* Aliases for __IRQHandler */ +#define CAN1_TX_IRQHandler USBD1_HP_CAN1_TX_IRQHandler +#define CAN1_RX0_IRQHandler USBD1_LP_CAN1_RX0_IRQHandler +#define CAN2_TX_IRQHandler USBD2_HP_CAN2_TX_IRQHandler +#define CAN2_RX0_IRQHandler USBD2_LP_CAN2_RX0_IRQHandler +#endif /* APM32F10X_HD || APM32E10X_HD || APM32S10X_MD */ + +struct apm32_baud_rate_tab +{ + uint32_t baud_rate; + uint16_t prescaler; + CAN_SJW_T syncJumpWidth; + CAN_TIME_SEGMENT1_T timeSegment1; + CAN_TIME_SEGMENT2_T timeSegment2; +}; + +#define APM32_CAN_BAUD_DEF(rate, sjw, tbs1, tbs2, prescale) \ +{ \ + .baud_rate = rate, \ + .syncJumpWidth = sjw, \ + .timeSegment1 = tbs1, \ + .timeSegment2 = tbs2, \ + .prescaler = prescale \ +} + +/* apm32 can device */ +struct apm32_can +{ + char *name; + CAN_T *CANx; + CAN_Config_T can_init; + CAN_FilterConfig_T FilterConfig; + struct rt_can_device device; /* inherit from can device */ +}; + +int rt_hw_can_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_CAN_H__ */ diff --git a/bsp/apm32/libraries/Drivers/drv_dac.c b/bsp/apm32/libraries/Drivers/drv_dac.c index 88835f2a81..abe40fe510 100644 --- a/bsp/apm32/libraries/Drivers/drv_dac.c +++ b/bsp/apm32/libraries/Drivers/drv_dac.c @@ -6,8 +6,9 @@ * Change Logs: * Date Author Notes * 2022-03-04 stevetong459 first version - * 2022-07-15 Aligagago add apm32F4 serie MCU support - * 2022-12-26 luobeihai add apm32F0 serie MCU support + * 2022-07-15 Aligagago add APM32F4 series MCU support + * 2022-12-26 luobeihai add APM32F0 series MCU support + * 2023-03-27 luobeihai add APM32E1 series MCU support */ #include @@ -40,7 +41,7 @@ static struct apm32_dac dac_config[] = DAC_WAVE_GENERATION_NONE, DAC_TRIANGLEAMPLITUDE_4095, }, -#elif defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32F4) +#elif defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) || defined (SOC_SERIES_APM32F4) "dac1", DAC, { @@ -67,7 +68,7 @@ static rt_err_t apm32_dac_enabled(struct rt_dac_device *device, rt_uint32_t chan { GPIO_Config_T GPIO_ConfigStruct; struct apm32_dac *cfg = (struct apm32_dac *)device->parent.user_data; -#if defined (SOC_SERIES_APM32F1) +#if defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); GPIO_ConfigStruct.mode = GPIO_MODE_ANALOG; #elif defined (SOC_SERIES_APM32F4) @@ -159,7 +160,7 @@ static rt_err_t apm32_dac_set_value(struct rt_dac_device *device, rt_uint32_t ch LOG_E("dac channel must be 1 or 2."); return -RT_ERROR; } -#elif defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32F4) +#elif defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) || defined (SOC_SERIES_APM32F4) if (channel == 1) { DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, *value); diff --git a/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_e1.c b/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_e1.c new file mode 100644 index 0000000000..e05fbce869 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_e1.c @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + * + */ + +#include "board.h" + +#ifdef BSP_USING_ON_CHIP_FLASH +#include "drv_flash.h" + +#if defined(RT_USING_FAL) +#include "fal.h" +#endif + +#define DRV_DEBUG +#define LOG_TAG "drv.flash" +#include + +#if defined(APM32E10X_HD) +#define FLASH_PAGE_SIZE 0x800U +#endif + +/** + * @brief Gets the page of a given address + * @param Addr: Address of the FLASH Memory + * @retval The page of a given address + */ +static uint32_t GetPage(uint32_t addr) +{ + uint32_t page = 0; + page = RT_ALIGN_DOWN(addr, FLASH_PAGE_SIZE); + return page; +} + +/** + * Read data from flash. + * @note This operation's units is word. + * + * @param addr flash address + * @param buf buffer to store read data + * @param size read bytes size + * + * @return result + */ +int apm32_flash_read(rt_uint32_t addr, rt_uint8_t *buf, size_t size) +{ + size_t i; + + if ((addr + size) > APM32_FLASH_END_ADDRESS) + { + LOG_E("read outrange flash size! addr is (0x%p)", (void *)(addr + size)); + return -RT_EINVAL; + } + + for (i = 0; i < size; i++, buf++, addr++) + { + *buf = *(rt_uint8_t *) addr; + } + + return size; +} + +/** + * Write data to flash. + * @note This operation's units is word. + * @note This operation must after erase. @see flash_erase. + * + * @param addr flash address + * @param buf the write data buffer + * @param size write bytes size + * + * @return result + */ +int apm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size) +{ + rt_err_t result = RT_EOK; + rt_uint32_t end_addr = addr + size; + + if (addr % 4 != 0) + { + LOG_E("write addr must be 4-byte alignment"); + return -RT_EINVAL; + } + + if ((end_addr) > APM32_FLASH_END_ADDRESS) + { + LOG_E("write outrange flash size! addr is (0x%p)", (void *)(addr + size)); + return -RT_EINVAL; + } + + FMC_Unlock(); + + while (addr < end_addr) + { + if (FMC_ProgramWord(addr, *((rt_uint32_t *)buf)) == FMC_STATUS_COMPLETE) + { + if (*(rt_uint32_t *)addr != *(rt_uint32_t *)buf) + { + result = -RT_ERROR; + break; + } + addr += 4; + buf += 4; + } + else + { + result = -RT_ERROR; + break; + } + } + + FMC_Lock(); + + if (result != RT_EOK) + { + return result; + } + + return size; +} + +/** + * @brief erase data on flash . + * @note this operation is irreversible. + * @note this operation's units is different which on many chips. + * + * @param addr flash address + * @param size erase bytes size + * + * @return result + */ +int apm32_flash_erase(rt_uint32_t addr, size_t size) +{ + rt_err_t result = RT_EOK; + rt_uint32_t start_addr = addr; + rt_uint32_t end_addr = addr + size; + rt_uint32_t page_addr = 0; + + FMC_Unlock(); + + if ((end_addr) > APM32_FLASH_END_ADDRESS) + { + LOG_E("erase outrange flash size! addr is (0x%p)", (void *)(addr + size)); + return -RT_EINVAL; + } + + /* clear program error flag */ + if (FMC_ReadStatus() == FMC_STATUS_ERROR_PG) + { + FMC_ClearStatusFlag(FMC_FLAG_PE); + } + + while(addr < end_addr) + { + page_addr = GetPage(addr); + + if(FMC_ErasePage(page_addr) != FMC_STATUS_COMPLETE) + { + result = -RT_ERROR; + goto __exit; + } + + addr += FLASH_PAGE_SIZE; + } + +__exit: + FMC_Lock(); + + if(result != RT_EOK) + { + return result; + } + + LOG_D("erase done: addr (0x%p), size %d", (void *)start_addr, size); + + return size; +} + + +#if defined(RT_USING_FAL) + +static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size); +static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size); +static int fal_flash_erase(long offset, size_t size); + +const struct fal_flash_dev apm32_onchip_flash = { "onchip_flash", APM32_FLASH_START_ADRESS, APM32_FLASH_SIZE, FLASH_PAGE_SIZE, {NULL, fal_flash_read, fal_flash_write, fal_flash_erase} }; + +static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size) +{ + return apm32_flash_read(apm32_onchip_flash.addr + offset, buf, size); +} + +static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size) +{ + return apm32_flash_write(apm32_onchip_flash.addr + offset, buf, size); +} + +static int fal_flash_erase(long offset, size_t size) +{ + return apm32_flash_erase(apm32_onchip_flash.addr + offset, size); +} + +#endif +#endif /* BSP_USING_ON_CHIP_FLASH */ diff --git a/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_f0.c b/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_f0.c index a3913f6061..c5fc5608d6 100644 --- a/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_f0.c +++ b/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_f0.c @@ -137,7 +137,7 @@ int apm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size) * * @return result */ -int apm32_flash_erase(rt_uint32_t addr, rt_uint32_t size) +int apm32_flash_erase(rt_uint32_t addr, size_t size) { rt_err_t result = RT_EOK; rt_uint32_t start_addr = addr; diff --git a/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_f1.c b/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_f1.c index f2a3f7c4f1..322cc07135 100644 --- a/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_f1.c +++ b/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_f1.c @@ -137,7 +137,7 @@ int apm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size) * * @return result */ -int apm32_flash_erase(rt_uint32_t addr, rt_uint32_t size) +int apm32_flash_erase(rt_uint32_t addr, size_t size) { rt_err_t result = RT_EOK; rt_uint32_t start_addr = addr; diff --git a/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_s1.c b/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_s1.c new file mode 100644 index 0000000000..81646ced67 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_flash/drv_flash_s1.c @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + * + */ + +#include "board.h" + +#ifdef BSP_USING_ON_CHIP_FLASH +#include "drv_flash.h" + +#if defined(RT_USING_FAL) +#include "fal.h" +#endif + +#define DRV_DEBUG +#define LOG_TAG "drv.flash" +#include + +#if defined(APM32S10X_MD) +#define FLASH_PAGE_SIZE 0x400U +#endif + +/** + * @brief Gets the page of a given address + * @param Addr: Address of the FLASH Memory + * @retval The page of a given address + */ +static uint32_t GetPage(uint32_t addr) +{ + uint32_t page = 0; + page = RT_ALIGN_DOWN(addr, FLASH_PAGE_SIZE); + return page; +} + +/** + * Read data from flash. + * @note This operation's units is word. + * + * @param addr flash address + * @param buf buffer to store read data + * @param size read bytes size + * + * @return result + */ +int apm32_flash_read(rt_uint32_t addr, rt_uint8_t *buf, size_t size) +{ + size_t i; + + if ((addr + size) > APM32_FLASH_END_ADDRESS) + { + LOG_E("read outrange flash size! addr is (0x%p)", (void *)(addr + size)); + return -RT_EINVAL; + } + + for (i = 0; i < size; i++, buf++, addr++) + { + *buf = *(rt_uint8_t *) addr; + } + + return size; +} + +/** + * Write data to flash. + * @note This operation's units is word. + * @note This operation must after erase. @see flash_erase. + * + * @param addr flash address + * @param buf the write data buffer + * @param size write bytes size + * + * @return result + */ +int apm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size) +{ + rt_err_t result = RT_EOK; + rt_uint32_t end_addr = addr + size; + + if (addr % 4 != 0) + { + LOG_E("write addr must be 4-byte alignment"); + return -RT_EINVAL; + } + + if ((end_addr) > APM32_FLASH_END_ADDRESS) + { + LOG_E("write outrange flash size! addr is (0x%p)", (void *)(addr + size)); + return -RT_EINVAL; + } + + FMC_Unlock(); + + while (addr < end_addr) + { + if (FMC_ProgramWord(addr, *((rt_uint32_t *)buf)) == FMC_STATUS_COMPLETE) + { + if (*(rt_uint32_t *)addr != *(rt_uint32_t *)buf) + { + result = -RT_ERROR; + break; + } + addr += 4; + buf += 4; + } + else + { + result = -RT_ERROR; + break; + } + } + + FMC_Lock(); + + if (result != RT_EOK) + { + return result; + } + + return size; +} + +/** + * @brief erase data on flash . + * @note this operation is irreversible. + * @note this operation's units is different which on many chips. + * + * @param addr flash address + * @param size erase bytes size + * + * @return result + */ +int apm32_flash_erase(rt_uint32_t addr, size_t size) +{ + rt_err_t result = RT_EOK; + rt_uint32_t start_addr = addr; + rt_uint32_t end_addr = addr + size; + rt_uint32_t page_addr = 0; + + FMC_Unlock(); + + if ((end_addr) > APM32_FLASH_END_ADDRESS) + { + LOG_E("erase outrange flash size! addr is (0x%p)", (void *)(addr + size)); + return -RT_EINVAL; + } + + /* clear program error flag */ + if (FMC_ReadStatus() == FMC_STATUS_ERROR_PG) + { + FMC_ClearStatusFlag(FMC_FLAG_PE); + } + + while(addr < end_addr) + { + page_addr = GetPage(addr); + + if(FMC_ErasePage(page_addr) != FMC_STATUS_COMPLETE) + { + result = -RT_ERROR; + goto __exit; + } + + addr += FLASH_PAGE_SIZE; + } + +__exit: + FMC_Lock(); + + if(result != RT_EOK) + { + return result; + } + + LOG_D("erase done: addr (0x%p), size %d", (void *)start_addr, size); + + return size; +} + + +#if defined(RT_USING_FAL) + +static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size); +static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size); +static int fal_flash_erase(long offset, size_t size); + +const struct fal_flash_dev apm32_onchip_flash = { "onchip_flash", APM32_FLASH_START_ADRESS, APM32_FLASH_SIZE, FLASH_PAGE_SIZE, {NULL, fal_flash_read, fal_flash_write, fal_flash_erase} }; + +static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size) +{ + return apm32_flash_read(apm32_onchip_flash.addr + offset, buf, size); +} + +static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size) +{ + return apm32_flash_write(apm32_onchip_flash.addr + offset, buf, size); +} + +static int fal_flash_erase(long offset, size_t size) +{ + return apm32_flash_erase(apm32_onchip_flash.addr + offset, size); +} + +#endif +#endif /* BSP_USING_ON_CHIP_FLASH */ diff --git a/bsp/apm32/libraries/Drivers/drv_gpio.c b/bsp/apm32/libraries/Drivers/drv_gpio.c index f2f53f95da..c00ac26c54 100644 --- a/bsp/apm32/libraries/Drivers/drv_gpio.c +++ b/bsp/apm32/libraries/Drivers/drv_gpio.c @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 * * Change Logs: - * Date Author Notes - * 2020-08-20 Abbcc first version - * 2022-07-15 Aligagago add apm32F4 serie MCU support - * 2022-12-26 luobeihai add apm32F0 serie MCU support - * 2022-03-18 luobeihai fix warning about incompatible function pointer types + * Date Author Notes + * 2020-08-20 Abbcc first version + * 2022-07-15 Aligagago add apm32F4 series MCU support + * 2022-12-26 luobeihai add apm32F0 series MCU support + * 2022-03-18 luobeihai fix warning about incompatible function pointer types + * 2023-03-27 luobeihai add APM32E1/S1 series MCU support */ #include @@ -73,7 +74,8 @@ static const struct pin_irq_map pin_irq_map[] = {GPIO_PIN_13, EINT4_15_IRQn}, {GPIO_PIN_14, EINT4_15_IRQn}, {GPIO_PIN_15, EINT4_15_IRQn}, -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) {GPIO_PIN_0, EINT0_IRQn}, {GPIO_PIN_1, EINT1_IRQn}, {GPIO_PIN_2, EINT2_IRQn}, @@ -90,7 +92,7 @@ static const struct pin_irq_map pin_irq_map[] = {GPIO_PIN_13, EINT15_10_IRQn}, {GPIO_PIN_14, EINT15_10_IRQn}, {GPIO_PIN_15, EINT15_10_IRQn}, -#endif +#endif /* SOC_SERIES_APM32F0 */ }; static struct rt_pin_irq_hdr pin_irq_hdr_tab[] = @@ -164,7 +166,8 @@ static void apm32_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value) gpio_pin = PIN_APMPIN(pin); #if defined(SOC_SERIES_APM32F0) GPIO_WriteBitValue(gpio_port, gpio_pin, (GPIO_BSRET_T)value); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) GPIO_WriteBitValue(gpio_port, gpio_pin, (uint8_t)value); #endif } @@ -196,7 +199,7 @@ static void apm32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) } /* Configure gpioConfigure */ -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) gpioConfig.pin = PIN_APMPIN(pin); gpioConfig.mode = GPIO_MODE_OUT_PP; gpioConfig.speed = GPIO_SPEED_50MHz; @@ -450,7 +453,7 @@ static rt_err_t apm32_pin_irq_enable(struct rt_device *device, rt_base_t pin, gpioConfig.pupd = GPIO_PUPD_NO; eintConfig.trigger = EINT_TRIGGER_ALL; break; -#elif defined(SOC_SERIES_APM32F1) +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) case PIN_IRQ_MODE_RISING: gpioConfig.mode = GPIO_MODE_IN_PD; eintConfig.trigger = EINT_TRIGGER_RISING; @@ -486,7 +489,7 @@ static rt_err_t apm32_pin_irq_enable(struct rt_device *device, rt_base_t pin, #if defined(SOC_SERIES_APM32F0) RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG); SYSCFG_EINTLine((SYSCFG_PORT_T)(((pin) >> 4) & 0xFu), (SYSCFG_PIN_T)irqindex); -#elif defined(SOC_SERIES_APM32F1) +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO); GPIO_ConfigEINTLine((GPIO_PORT_SOURCE_T)(((pin) >> 4) & 0xFu), (GPIO_PIN_SOURCE_T)irqindex); #elif defined(SOC_SERIES_APM32F4) @@ -500,7 +503,8 @@ static rt_err_t apm32_pin_irq_enable(struct rt_device *device, rt_base_t pin, #if defined(SOC_SERIES_APM32F0) NVIC_EnableIRQRequest(irqmap->irqno, 5); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) NVIC_EnableIRQRequest(irqmap->irqno, 5, 0); #endif pin_irq_enable_mask |= irqmap->pinbit; @@ -546,7 +550,8 @@ static rt_err_t apm32_pin_irq_enable(struct rt_device *device, rt_base_t pin, { NVIC_DisableIRQRequest(irqmap->irqno); } -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) if ((irqmap->pinbit >= GPIO_PIN_5) && (irqmap->pinbit <= GPIO_PIN_9)) { if (!(pin_irq_enable_mask & (GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9))) @@ -565,7 +570,7 @@ static rt_err_t apm32_pin_irq_enable(struct rt_device *device, rt_base_t pin, { NVIC_DisableIRQRequest(irqmap->irqno); } -#endif +#endif /* SOC_SERIES_APM32F0 */ rt_hw_interrupt_enable(level); } else @@ -599,7 +604,8 @@ void GPIO_EXTI_IRQHandler(uint8_t exti_line) { #if defined(SOC_SERIES_APM32F0) if (EINT_ReadIntFlag(1U << exti_line) != RESET) -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) if (EINT_ReadIntFlag((EINT_LINE_T)(1U << exti_line)) != RESET) #endif { @@ -641,7 +647,8 @@ void EINT4_15_IRQHandler(void) GPIO_EXTI_IRQHandler(15); rt_interrupt_leave(); } -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) void EINT0_IRQHandler(void) { rt_interrupt_enter(); @@ -703,7 +710,7 @@ void EINT15_10_IRQHandler(void) int rt_hw_pin_init(void) { -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) #ifdef GPIOA RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); #endif diff --git a/bsp/apm32/libraries/Drivers/drv_hwtimer.c b/bsp/apm32/libraries/Drivers/drv_hwtimer.c index 945937be01..e9f4561bfd 100644 --- a/bsp/apm32/libraries/Drivers/drv_hwtimer.c +++ b/bsp/apm32/libraries/Drivers/drv_hwtimer.c @@ -6,8 +6,9 @@ * Change Logs: * Date Author Notes * 2022-03-04 stevetong459 first version - * 2022-07-15 Aligagago add apm32F4 serie MCU support - * 2022-12-26 luobeihai add apm32F0 serie MCU support + * 2022-07-15 Aligagago add APM32F4 series MCU support + * 2022-12-26 luobeihai add APM32F0 series MCU support + * 2023-03-27 luobeihai add APM32E1/S1 series MCU support */ #include @@ -96,7 +97,7 @@ static struct apm32_timer tmr_config[] = { "timer1", TMR1, -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) TMR1_UP_IRQn, #elif defined(SOC_SERIES_APM32F4) TMR1_UP_TMR10_IRQn, @@ -137,7 +138,7 @@ static struct apm32_timer tmr_config[] = { "timer6", TMR6, -#if defined(SOC_SERIES_APM32F1) || defined(APM32F030) || defined(APM32F070) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(APM32F030) || defined(APM32F070) TMR6_IRQn, #elif defined(SOC_SERIES_APM32F4) TMR6_DAC_IRQn @@ -157,7 +158,7 @@ static struct apm32_timer tmr_config[] = { "timer8", TMR8, -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) TMR8_UP_IRQn, #elif defined(SOC_SERIES_APM32F4) TMR8_UP_TMR13_IRQn, @@ -241,12 +242,19 @@ static rt_uint32_t apm32_hwtimer_clock_get(TMR_T *tmr) pclk1 = RCM_ReadPCLKFreq(); return (rt_uint32_t)(pclk1 * ((RCM->CFG1_B.APB1PSC != 0) ? 2 : 1)); -#else +#endif /* SOC_SERIES_APM32F0 */ + +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) uint32_t pclk1, pclk2; RCM_ReadPCLKFreq(&pclk1, &pclk2); +#if defined(SOC_SERIES_APM32S1) + if (tmr == TMR1) +#else if (tmr == TMR1 || tmr == TMR8 || tmr == TMR9 || tmr == TMR10 || tmr == TMR11) +#endif /* SOC_SERIES_APM32S1 */ { return (rt_uint32_t)(pclk2 * ((RCM->CFG_B.APB2PSC != 0) ? 2 : 1)); } @@ -316,7 +324,8 @@ static void apm32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t stat { #if defined(SOC_SERIES_APM32F0) TMR_TimeBase_T base_config; -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) TMR_BaseConfig_T base_config; #endif uint32_t prescaler = 0; @@ -344,7 +353,8 @@ static void apm32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t stat { base_config.counterMode = TMR_COUNTER_MODE_DOWN; } -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) base_config.division = prescaler; base_config.clockDivision = TMR_CLOCK_DIV_1; if (timer->info->cntmode == HWTIMER_CNTMODE_UP) @@ -364,11 +374,16 @@ static void apm32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t stat NVIC_EnableIRQRequest(timer_config->irqn, 3); /* enable update request source */ TMR_ConfigUPdateRequest(timer_config->tmr, TMR_UPDATE_SOURCE_REGULAR); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) /* set the TIMx priority */ NVIC_EnableIRQRequest(timer_config->irqn, 3, 0); /* enable update request source */ + #if defined(SOC_SERIES_APM32E1) + TMR_ConfigUPdateRequest(timer_config->tmr, TMR_UPDATE_SOURCE_REGULAR); + #else TMR_ConfigUpdateRequest(timer_config->tmr, TMR_UPDATE_SOURCE_REGULAR); + #endif #endif /* clear update flag */ TMR_ClearStatusFlag(timer_config->tmr, TMR_FLAG_UPDATE); @@ -405,7 +420,9 @@ static rt_err_t apm32_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtim #if defined(SOC_SERIES_APM32F0) if (timer_config->tmr == TMR1 || timer_config->tmr == TMR2 || timer_config->tmr == TMR3 || \ timer_config->tmr == TMR15) -#else +#elif defined(SOC_SERIES_APM32S1) + if (timer_config->tmr == TMR1) +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32F4) if (timer_config->tmr == TMR1 || timer_config->tmr == TMR2 || timer_config->tmr == TMR3 || \ timer_config->tmr == TMR4 || timer_config->tmr == TMR5 || timer_config->tmr == TMR8 || \ timer_config->tmr == TMR9 || timer_config->tmr == TMR12) @@ -497,7 +514,7 @@ void TMR1_BRK_UP_TRG_COM_IRQHandler(void) rt_interrupt_leave(); } #endif -#elif defined(SOC_SERIES_APM32F1) +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) #ifdef BSP_USING_TMR1 void TMR1_UP_IRQHandler(void) { @@ -568,7 +585,7 @@ void TMR5_IRQHandler(void) #endif #ifdef BSP_USING_TMR6 -#if defined(SOC_SERIES_APM32F1) || defined(APM32F030) || defined(APM32F070) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(APM32F030) || defined(APM32F070) void TMR6_IRQHandler(void) #elif defined(SOC_SERIES_APM32F4) void TMR6_DAC_IRQHandler(void) @@ -593,7 +610,7 @@ void TMR7_IRQHandler(void) } #endif -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) #ifdef BSP_USING_TMR8 void TMR8_UP_IRQHandler(void) { diff --git a/bsp/apm32/libraries/Drivers/drv_pwm.c b/bsp/apm32/libraries/Drivers/drv_pwm.c index 0fd612f5d2..cff924384b 100644 --- a/bsp/apm32/libraries/Drivers/drv_pwm.c +++ b/bsp/apm32/libraries/Drivers/drv_pwm.c @@ -6,8 +6,9 @@ * Change Logs: * Date Author Notes * 2022-03-04 stevetong459 first version - * 2022-07-15 Aligagago add apm32F4 serie MCU support - * 2022-12-26 luobeihai add apm32F0 serie MCU support + * 2022-07-15 Aligagago add APM32F4 series MCU support + * 2022-12-26 luobeihai add APM32F0 series MCU support + * 2023-03-27 luobeihai add APM32E1/S1 series MCU support */ #include @@ -359,7 +360,8 @@ static rt_err_t apm32_pwm_hw_init(struct apm32_pwm *device) /* enable update request source */ TMR_ConfigUPdateRequest(tmr, TMR_UPDATE_SOURCE_REGULAR); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) TMR_BaseConfig_T base_config; TMR_OCConfig_T oc_config; @@ -402,8 +404,12 @@ static rt_err_t apm32_pwm_hw_init(struct apm32_pwm *device) } /* enable update request source */ +#if defined(SOC_SERIES_APM32E1) + TMR_ConfigUPdateRequest(tmr, TMR_UPDATE_SOURCE_REGULAR); +#else TMR_ConfigUpdateRequest(tmr, TMR_UPDATE_SOURCE_REGULAR); -#endif +#endif /* SOC_SERIES_APM32E1 */ +#endif /* SOC_SERIES_APM32F0 */ return result; } @@ -416,12 +422,19 @@ static rt_uint32_t timer_clock_get(TMR_T *tmr) pclk1 = RCM_ReadPCLKFreq(); return (rt_uint32_t)(pclk1 * ((RCM->CFG1_B.APB1PSC != 0) ? 2 : 1)); -#else +#endif /* SOC_SERIES_APM32F0 */ + +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) uint32_t pclk1, pclk2; RCM_ReadPCLKFreq(&pclk1, &pclk2); +#if defined(SOC_SERIES_APM32S1) + if (tmr == TMR1) +#else if (tmr == TMR1 || tmr == TMR8 || tmr == TMR9 || tmr == TMR10 || tmr == TMR11) +#endif /* SOC_SERIES_APM32S1 */ { return (rt_uint32_t)(pclk2 * ((RCM->CFG_B.APB2PSC != 0) ? 2 : 1)); } @@ -448,7 +461,9 @@ static rt_err_t drv_pwm_enable(TMR_T *tmr, struct rt_pwm_configuration *configur } #if defined(SOC_SERIES_APM32F0) if (tmr == TMR1 || tmr == TMR15 || tmr == TMR16 || tmr == TMR17) -#else +#elif defined(SOC_SERIES_APM32S1) + if (tmr == TMR1) +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32F4) if (tmr == TMR1 || tmr == TMR8) #endif { @@ -468,7 +483,9 @@ static rt_err_t drv_pwm_enable(TMR_T *tmr, struct rt_pwm_configuration *configur } #if defined(SOC_SERIES_APM32F0) if (tmr == TMR1 || tmr == TMR15 || tmr == TMR16 || tmr == TMR17) -#else +#elif defined(SOC_SERIES_APM32S1) + if (tmr == TMR1) +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32F4) if (tmr == TMR1 || tmr == TMR8) #endif { diff --git a/bsp/apm32/libraries/Drivers/drv_rtc.c b/bsp/apm32/libraries/Drivers/drv_rtc.c index 4228b2727f..58c5814b2a 100644 --- a/bsp/apm32/libraries/Drivers/drv_rtc.c +++ b/bsp/apm32/libraries/Drivers/drv_rtc.c @@ -6,9 +6,10 @@ * Change Logs: * Date Author Notes * 2022-03-04 stevetong459 first version - * 2022-07-15 Aligagago add apm32F4 serie MCU support - * 2022-12-26 luobeihai add apm32F0 serie MCU support + * 2022-07-15 Aligagago add APM32F4 series MCU support + * 2022-12-26 luobeihai add APM32F0 series MCU support * 2023-03-18 luobeihai fix RT-Thread Studio compile error bug + * 2023-03-27 luobeihai add APM32E1/S1 series MCU support */ #include "board.h" @@ -42,7 +43,7 @@ static rt_err_t apm32_rtc_init(void) volatile rt_uint32_t counter = 0; /* Enable RTC Clock */ -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU | RCM_APB1_PERIPH_BAKR); #elif defined(SOC_SERIES_APM32F0) || defined(SOC_SERIES_APM32F4) RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU); @@ -61,7 +62,7 @@ static rt_err_t apm32_rtc_init(void) } } RCM_ConfigRTCCLK(RCM_RTCCLK_LSI); -#else +#elif defined(BSP_RTC_USING_LSE) RCM_DisableLSI(); RCM_ConfigLSE(RCM_LSE_OPEN); while (!RCM_ReadStatusFlag(RCM_FLAG_LSERDY)) @@ -77,7 +78,7 @@ static rt_err_t apm32_rtc_init(void) RCM_EnableRTCCLK(); RTC_WaitForSynchro(); -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) counter = 0; while (!RTC_ReadStatusFlag(RTC_FLAG_OC)) { @@ -93,7 +94,7 @@ static rt_err_t apm32_rtc_init(void) #ifdef BSP_RTC_USING_LSI RTC_ConfigPrescaler(LSI_VALUE - 1); -#else +#elif defined(BSP_RTC_USING_LSE) RTC_ConfigPrescaler(LSE_VALUE - 1); #endif /* BSP_RTC_USING_LSI */ @@ -117,7 +118,7 @@ static rt_err_t apm32_rtc_init(void) #endif /* BSP_RTC_USING_LSI */ RTC_Config(&rtcConfig); -#endif /* SOC_SERIES_APM32F1 */ +#endif /* SOC_SERIES_APM32F1 || SOC_SERIES_APM32E1 || SOC_SERIES_APM32S1 */ if (!rtc_init_flag) { @@ -126,13 +127,13 @@ static rt_err_t apm32_rtc_init(void) return RT_EOK; } -#if defined(SOC_SERIES_APM32F1) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) /** * @brief This function will initialize the rtc on chip. * * @return RT_EOK indicates successful initialize, other value indicates failed; */ -static rt_err_t apm32_rtc_get_secs(void *args) +static rt_err_t apm32_rtc_get_secs(time_t *sec) { volatile rt_uint32_t counter = 0; @@ -144,12 +145,12 @@ static rt_err_t apm32_rtc_get_secs(void *args) } } - *(rt_uint32_t *) args = RTC_ReadCounter(); + *(time_t *) sec = RTC_ReadCounter(); return RT_EOK; } -static rt_err_t apm32_rtc_set_secs(void *args) +static rt_err_t apm32_rtc_set_secs(time_t *sec) { volatile rt_uint32_t counter = 0; @@ -166,7 +167,7 @@ static rt_err_t apm32_rtc_set_secs(void *args) } } - RTC_ConfigCounter(*(rt_uint32_t *)args); + RTC_ConfigCounter(*(rt_uint32_t *)sec); return RT_EOK; } @@ -270,7 +271,7 @@ static rt_err_t apm32_rtc_set_secs(void *args) return result; } -#endif +#endif /* SOC_SERIES_APM32F1 || SOC_SERIES_APM32E1 || SOC_SERIES_APM32S1 */ static const struct rt_rtc_ops apm32_rtc_ops = { diff --git a/bsp/apm32/libraries/Drivers/drv_sdio.c b/bsp/apm32/libraries/Drivers/drv_sdio.c index 20b2bb6022..45c8179d9a 100644 --- a/bsp/apm32/libraries/Drivers/drv_sdio.c +++ b/bsp/apm32/libraries/Drivers/drv_sdio.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2023-03-14 luobeihai first version + * 2023-03-27 luobeihai add APM32E1 series MCU support */ #include "board.h" @@ -690,7 +691,7 @@ void SD_LowLevel_DMA_TxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize) sdio_obj.cfg = &sdio_config; sdio_obj.dma.handle_tx = sdio_config.dma_tx.Instance; -#if defined (SOC_SERIES_APM32F1) +#if defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) /* clear DMA flag */ DMA_ClearStatusFlag(DMA2_FLAG_GINT4 | DMA2_FLAG_TC4 | DMA2_FLAG_HT4 | DMA2_FLAG_TERR4); @@ -754,7 +755,7 @@ void SD_LowLevel_DMA_RxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize) sdio_obj.cfg = &sdio_config; sdio_obj.dma.handle_rx = sdio_config.dma_rx.Instance; -#if defined (SOC_SERIES_APM32F1) +#if defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) /* clear DMA flag */ DMA_ClearStatusFlag(DMA2_FLAG_GINT4 | DMA2_FLAG_TC4 | DMA2_FLAG_HT4 | DMA2_FLAG_TERR4); @@ -846,7 +847,7 @@ int rt_hw_sdio_init(void) hsd.Instance = SDCARD_INSTANCE; /* enable DMA clock */ -#if defined (SOC_SERIES_APM32F1) +#if defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) SET_BIT(RCM->AHBCLKEN, sdio_config.dma_rx.dma_rcm); #elif defined (SOC_SERIES_APM32F4) SET_BIT(RCM->AHB1CLKEN, sdio_config.dma_rx.dma_rcm); diff --git a/bsp/apm32/libraries/Drivers/drv_sdio.h b/bsp/apm32/libraries/Drivers/drv_sdio.h index f869f2c3c5..e8d40d1218 100644 --- a/bsp/apm32/libraries/Drivers/drv_sdio.h +++ b/bsp/apm32/libraries/Drivers/drv_sdio.h @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2023-03-14 luobeihai first version + * 2023-03-27 luobeihai add APM32E1 series MCU support */ #ifndef _DRV_SDIO_H @@ -127,7 +128,7 @@ #define HW_SDIO_DATATIMEOUT (0xF0000000U) -#if defined (SOC_SERIES_APM32F1) +#if defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) #define SDIO_BUS_CONFIG \ { \ .Instance = SDIO, \ @@ -153,7 +154,7 @@ } #endif /* SOC_SERIES_APM32F1 */ -#if defined (SOC_SERIES_APM32F1) +#if defined (SOC_SERIES_APM32F1) || defined (SOC_SERIES_APM32E1) #define DMA_INSTANCE_TYPE DMA_Channel_T #elif defined (SOC_SERIES_APM32F4) #define DMA_INSTANCE_TYPE DMA_Stream_T diff --git a/bsp/apm32/libraries/Drivers/drv_sdram/APM32E1/drv_sdram.c b/bsp/apm32/libraries/Drivers/drv_sdram/APM32E1/drv_sdram.c new file mode 100644 index 0000000000..23ee916ae4 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_sdram/APM32E1/drv_sdram.c @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#include + +#ifdef BSP_USING_SDRAM +#include "drv_sdram.h" + +#define DRV_DEBUG +#define LOG_TAG "drv.sdram" +#include + +/* SDRAM GPIO Clock */ +#define RCM_SDRAM_GPIO_PERIPH (RCM_APB2_PERIPH_AFIO | \ + RCM_APB2_PERIPH_GPIOB | \ + RCM_APB2_PERIPH_GPIOC | \ + RCM_APB2_PERIPH_GPIOD | \ + RCM_APB2_PERIPH_GPIOE | \ + RCM_APB2_PERIPH_GPIOF | \ + RCM_APB2_PERIPH_GPIOG) + +/* SDRAM Peripheral Clock */ +#define RCM_SDRAM_PERIPH (RCM_AHB_PERIPH_SMC) + +#ifdef RT_USING_MEMHEAP_AS_HEAP +static struct rt_memheap system_heap; +#endif + +/** + * @brief SDRAM divider Number + */ +typedef enum +{ + RCM_DMC_DIV_1, + RCM_DMC_DIV_2, + RCM_DMC_DIV_4 = 3 +} RCM_DMC_DIV_T; + +/** + * @brief Configs the SDRAM clock prescaler + * @param SDRAMDiv: Specifies the SDRAM clock prescaler from the DMC clock. + * @retval None + */ +static void RCM_ConfigSDRAMCLK(RCM_DMC_DIV_T SDRAMDiv) +{ + RCM->CFG_B.SDRAMPSC = SDRAMDiv; +} + +/** + * @brief sdram gpio init + * @param None + * @retval None + */ +static void SDRAM_GPIO_Init(void) +{ + GPIO_Config_T gpioConfig; + + RCM_EnableAPB2PeriphClock(RCM_SDRAM_GPIO_PERIPH); + + /** SDRAM pins assignment */ + /** + +-------------------------+--------------------------+--------------------------+ + | PB10 <-> MMC_SDRAM_UDQM | PC10 <-> MMC_SDRAM_D8 | PD2 <-> MMC_SDRAM_D10 | + | PB11 <-> MMC_SDRAM_CKE | PC11 <-> MMC_SDRAM_D9 | PD3 <-> MMC_SDRAM_D11 | + | | | PD4 <-> MMC_SDRAM_D12 | + | | | PD5 <-> MMC_SDRAM_D13 | + | | | PD6 <-> MMC_SDRAM_D14 | + +-------------------------+--------------------------+--------------------------+ + | PE3 <-> MMC_SDRAM_D4 | PF0 <-> MMC_SDRAM_D7 | PG0 <-> MMC_SDRAM_A3 | + | PE5 <-> MMC_SDRAM_D5 | PF2 <-> MMC_SDRAM_NCS | PG9 <-> MMC_SDRAM_D15 | + | PE6 <-> MMC_SDRAM_D6 | PF4 <-> MMC_SDRAM_NRAS | PG12 <-> MMC_SDRAM_D0 | + | PE8 <-> MMC_SDRAM_A4 | PF5 <-> MMC_SDRAM_NCAS | PG13 <-> MMC_SDRAM_D1 | + | PE9 <-> MMC_SDRAM_A5 | PF6 <-> MMC_SDRAM_NWE | PG14 <-> MMC_SDRAM_D2 | + | PE10 <-> MMC_SDRAM_A6 | PF10 <-> MMC_SDRAM_LDQM | PG15 <-> MMC_SDRAM_D3 | + | PE11 <-> MMC_SDRAM_A7 | PF11 <-> MMC_SDRAM_Bank | | + | PE12 <-> MMC_SDRAM_A8 | PF12 <-> MMC_SDRAM_A10 | | + | PE13 <-> MMC_SDRAM_A9 | PF13 <-> MMC_SDRAM_A0 | | + | PE15 <-> MMC_SDRAM_CLK | PF14 <-> MMC_SDRAM_A1 | | + | | PF15 <-> MMC_SDRAM_A2 | | + +-------------------------+--------------------------+--------------------------+ + */ + + gpioConfig.speed = GPIO_SPEED_50MHz; + gpioConfig.mode = GPIO_MODE_AF_PP; + + gpioConfig.pin = GPIO_PIN_10 | GPIO_PIN_11; + GPIO_Config(GPIOB, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_10 | GPIO_PIN_11; + GPIO_Config(GPIOC, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_2 | GPIO_PIN_3 | + GPIO_PIN_4 | GPIO_PIN_5 | + GPIO_PIN_6; + GPIO_Config(GPIOD, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_3 | GPIO_PIN_5 | + GPIO_PIN_6 | GPIO_PIN_8 | + GPIO_PIN_9 | GPIO_PIN_10| + GPIO_PIN_11 | GPIO_PIN_12 | + GPIO_PIN_13 | GPIO_PIN_15 ; + GPIO_Config(GPIOE, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_4 | + GPIO_PIN_5 | GPIO_PIN_6 | + GPIO_PIN_10 |GPIO_PIN_11 | + GPIO_PIN_12 | GPIO_PIN_13| + GPIO_PIN_14 | GPIO_PIN_15; + GPIO_Config(GPIOF, &gpioConfig); + + gpioConfig.pin = GPIO_PIN_0 | GPIO_PIN_9| + GPIO_PIN_12 | GPIO_PIN_13 | + GPIO_PIN_14 | GPIO_PIN_15; + GPIO_Config(GPIOG, &gpioConfig); +} + +/** + * @brief sdram init + * @param None + * @retval None + */ +static int SDRAM_Init(void) +{ + int result = RT_EOK; + + DMC_Config_T dmc_init_config; + DMC_TimingConfig_T dmc_timing_config; + + /* Config the SDRAM clock prescaler */ + RCM_ConfigSDRAMCLK(RCM_DMC_DIV_2); + + /* enable sdram clock */ + RCM_EnableAHBPeriphClock(RCM_SDRAM_PERIPH); + + /* sdram gpio init */ + SDRAM_GPIO_Init(); + + /* dmc timing config */ + dmc_timing_config.latencyCAS = DMC_CAS_LATENCY_3; //!< Configure CAS latency period + dmc_timing_config.tARP = DMC_AUTO_REFRESH_10; //!< Configure auto refresh period + dmc_timing_config.tRAS = DMC_RAS_MINIMUM_5; //!< Configure line activation and precharging minimum time + dmc_timing_config.tCMD = DMC_ATA_CMD_7; //!< Configure active to active period + dmc_timing_config.tRCD = DMC_DELAY_TIME_2; //!< Configure RAS To CAS delay Time + dmc_timing_config.tRP = DMC_PRECHARGE_2; //!< Configure precharge period + dmc_timing_config.tWR = DMC_NEXT_PRECHARGE_2; //!< Configure time between the Last Data and The Next Precharge for write + dmc_timing_config.tXSR = 6; //!< Configure XSR0 + dmc_timing_config.tRFP = 0xC3; //!< Configure refresh Cycle + +#if SDRAM_TARGET_BANK == 1 + dmc_init_config.bankWidth = DMC_BANK_WIDTH_1; //!< Configure bank address width +#else + dmc_init_config.bankWidth = DMC_BANK_WIDTH_2; //!< Configure bank address width +#endif + dmc_init_config.clkPhase = DMC_CLK_PHASE_REVERSE; //!< Configure clock phase + dmc_init_config.rowWidth = SDRAM_ROW_BITS; //!< Configure row address width + dmc_init_config.colWidth = SDRAM_COLUMN_BITS; //!< Configure column address width + dmc_init_config.memorySize = SDRAM_MEMORY_SIZE; + dmc_init_config.timing = dmc_timing_config; + + DMC_Config(&dmc_init_config); + DMC_ConfigOpenBank(DMC_BANK_NUMBER_2); + DMC_EnableAccelerateModule(); + + DMC_Enable(); + + LOG_D("sdram clock: %d MHz\r\n", RCM_ReadSYSCLKFreq()/1000000/(RCM->CFG_B.SDRAMPSC + 1)); + LOG_D("sdram init success, mapped at 0x%X, size is %d bytes, data width is %d", SDRAM_BANK_ADDR, SDRAM_SIZE, SDRAM_DATA_WIDTH); + +#ifdef RT_USING_MEMHEAP_AS_HEAP + /* If RT_USING_MEMHEAP_AS_HEAP is enabled, SDRAM is initialized to the heap */ + rt_memheap_init(&system_heap, "sdram", (void *)SDRAM_BANK_ADDR, SDRAM_SIZE); +#endif + + return result; +} +INIT_BOARD_EXPORT(SDRAM_Init); + +#ifdef DRV_DEBUG +#ifdef FINSH_USING_MSH +int sdram_test(void) +{ + int i = 0; + uint32_t start_time = 0, time_cast = 0; +#if SDRAM_DATA_WIDTH == 8 + char data_width = 1; + uint8_t data = 0; +#elif SDRAM_DATA_WIDTH == 16 + char data_width = 2; + uint16_t data = 0; +#else + char data_width = 4; + uint32_t data = 0; +#endif + + /* write data */ + LOG_D("Writing the %ld bytes data, waiting....", SDRAM_SIZE); + start_time = rt_tick_get(); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { +#if SDRAM_DATA_WIDTH == 8 + *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint8_t)(i % 100); +#elif SDRAM_DATA_WIDTH == 16 + *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint16_t)(i % 1000); +#else + *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint32_t)(i % 1000); +#endif + } + time_cast = rt_tick_get() - start_time; + LOG_D("Write data success, total time: %d.%03dS.", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + + /* read data */ + LOG_D("start Reading and verifying data, waiting...."); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { +#if SDRAM_DATA_WIDTH == 8 + data = *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 100) + { + LOG_E("SDRAM test failed!"); + break; + } +#elif SDRAM_DATA_WIDTH == 16 + data = *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 1000) + { + LOG_E("SDRAM test failed!"); + break; + } +#else + data = *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 1000) + { + LOG_E("SDRAM test failed!"); + break; + } +#endif + } + + if (i >= SDRAM_SIZE / data_width) + { + LOG_D("SDRAM test success!"); + } + + return RT_EOK; +} +MSH_CMD_EXPORT(sdram_test, sdram test) +#endif /* FINSH_USING_MSH */ +#endif /* DRV_DEBUG */ +#endif /* BSP_USING_SDRAM */ diff --git a/bsp/apm32/libraries/Drivers/drv_sdram/APM32E1/drv_sdram.h b/bsp/apm32/libraries/Drivers/drv_sdram/APM32E1/drv_sdram.h new file mode 100644 index 0000000000..35c7d2b02b --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_sdram/APM32E1/drv_sdram.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-28 luobeihai first version + */ + +#ifndef __DRV_SDRAM_H__ +#define __DRV_SDRAM_H__ + +/* parameters for sdram peripheral */ +/* Bank1 or Bank2 */ +#define SDRAM_TARGET_BANK 1 +/* apm32f407 Bank Addr: 0x60000000 */ +#define SDRAM_BANK_ADDR ((uint32_t)0x60000000) +/* data width: 8, 16, 32 */ +#define SDRAM_DATA_WIDTH 16 +/* column bit numbers */ +#define SDRAM_COLUMN_BITS DMC_COL_WIDTH_8 +/* row bit numbers */ +#define SDRAM_ROW_BITS DMC_ROW_WIDTH_11 + +#define SDRAM_MEMORY_SIZE DMC_MEMORY_SIZE_2MB + +#define SDRAM_SIZE ((uint32_t)0x200000) + +/* memory mode register */ +#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) +#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) +#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004) +#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) +#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) +#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) +#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) + +#endif diff --git a/bsp/apm32/libraries/Drivers/drv_sdram/APM32F4/drv_sdram.c b/bsp/apm32/libraries/Drivers/drv_sdram/APM32F4/drv_sdram.c new file mode 100644 index 0000000000..bfa4382f3e --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_sdram/APM32F4/drv_sdram.c @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-18 luobeihai first version + */ + +#include + +#ifdef BSP_USING_SDRAM +#include "drv_sdram.h" + +#define DRV_DEBUG +#define LOG_TAG "drv.sdram" +#include + +/* SDRAM GPIO Clock */ +#define RCM_SDRAM_GPIO_PERIPH (RCM_AHB1_PERIPH_GPIOA | \ + RCM_AHB1_PERIPH_GPIOD | \ + RCM_AHB1_PERIPH_GPIOF | \ + RCM_AHB1_PERIPH_GPIOG | \ + RCM_AHB1_PERIPH_GPIOH | \ + RCM_AHB1_PERIPH_GPIOI ) + +#ifdef RT_USING_MEMHEAP_AS_HEAP +static struct rt_memheap system_heap; +#endif + +/** + * @brief sdram gpio init + * @param None + * @retval None + */ +static void SDRAM_GPIO_Init(void) +{ + GPIO_Config_T gpioConfig; + + RCM_EnableAHB1PeriphClock(RCM_SDRAM_GPIO_PERIPH); + + gpioConfig.speed = GPIO_SPEED_50MHz; + gpioConfig.mode = GPIO_MODE_AF; + gpioConfig.otype = GPIO_OTYPE_PP; + gpioConfig.pupd = GPIO_PUPD_NOPULL; + + gpioConfig.pin = GPIO_PIN_10 | GPIO_PIN_12 | + GPIO_PIN_13 | GPIO_PIN_14 | + GPIO_PIN_15; + GPIO_Config(GPIOD, &gpioConfig); + + GPIO_ConfigPinAF(GPIOD, GPIO_PIN_SOURCE_10, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOD, GPIO_PIN_SOURCE_12, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOD, GPIO_PIN_SOURCE_13, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOD, GPIO_PIN_SOURCE_14, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOD, GPIO_PIN_SOURCE_15, GPIO_AF_FSMC); + + gpioConfig.pin = GPIO_PIN_0 | GPIO_PIN_1 | + GPIO_PIN_2 | GPIO_PIN_3 | + GPIO_PIN_4 | GPIO_PIN_6 | + GPIO_PIN_7 | GPIO_PIN_8 | + GPIO_PIN_9 | GPIO_PIN_10 | + GPIO_PIN_11; + GPIO_Config(GPIOF, &gpioConfig); + + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_0, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_1, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_2, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_3, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_4, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_6, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_7, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_8, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_9, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_10, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOF, GPIO_PIN_SOURCE_11, GPIO_AF_FSMC); + + gpioConfig.pin = GPIO_PIN_1 | GPIO_PIN_2 | + GPIO_PIN_3 | GPIO_PIN_4 | + GPIO_PIN_5 | GPIO_PIN_6 | + GPIO_PIN_8 | GPIO_PIN_15; + GPIO_Config(GPIOG, &gpioConfig); + + GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_1, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_2, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_3, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_4, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_5, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_6, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_8, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_15, GPIO_AF_FSMC); + + gpioConfig.pin = GPIO_PIN_3 | GPIO_PIN_5 | + GPIO_PIN_8 | GPIO_PIN_10 | + GPIO_PIN_13 | GPIO_PIN_15; + GPIO_Config(GPIOH, &gpioConfig); + + GPIO_ConfigPinAF(GPIOH, GPIO_PIN_SOURCE_3, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOH, GPIO_PIN_SOURCE_5, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOH, GPIO_PIN_SOURCE_8, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOH, GPIO_PIN_SOURCE_10, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOH, GPIO_PIN_SOURCE_13, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOH, GPIO_PIN_SOURCE_15, GPIO_AF_FSMC); + + gpioConfig.pin = GPIO_PIN_3 | GPIO_PIN_7 | + GPIO_PIN_8 | GPIO_PIN_9 | + GPIO_PIN_10 | GPIO_PIN_11; + GPIO_Config(GPIOI, &gpioConfig); + + GPIO_ConfigPinAF(GPIOI, GPIO_PIN_SOURCE_3, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOI, GPIO_PIN_SOURCE_7, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOI, GPIO_PIN_SOURCE_8, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOI, GPIO_PIN_SOURCE_9, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOI, GPIO_PIN_SOURCE_10, GPIO_AF_FSMC); + GPIO_ConfigPinAF(GPIOI, GPIO_PIN_SOURCE_11, GPIO_AF_FSMC); +} + +static int SDRAM_Init(void) +{ + int result = RT_EOK; + + DMC_Config_T dmc_init_config; + DMC_TimingConfig_T dmc_timing_config; + + /* Config the SDRAM clock prescaler */ + RCM_ConfigSDRAM(RCM_SDRAM_DIV_4); + + /* enable sdram clock */ + RCM->AHB3CLKEN |= BIT0; + + /* sdram gpio init */ + SDRAM_GPIO_Init(); + + /* dmc timing config */ + dmc_timing_config.latencyCAS = DMC_CAS_LATENCY_3; //!< Configure CAS latency period + dmc_timing_config.tARP = DMC_AUTO_REFRESH_10; //!< Configure auto refresh period + dmc_timing_config.tRAS = DMC_RAS_MINIMUM_2; //!< Configure line activation and precharging minimum time + dmc_timing_config.tCMD = DMC_ATA_CMD_1; //!< Configure active to active period + dmc_timing_config.tRCD = DMC_DELAY_TIME_1; //!< Configure RAS To CAS delay Time + dmc_timing_config.tRP = DMC_PRECHARGE_1; //!< Configure precharge period + dmc_timing_config.tWR = DMC_NEXT_PRECHARGE_2; //!< Configure time between the Last Data and The Next Precharge for write + dmc_timing_config.tXSR = 3; //!< Configure XSR0 + dmc_timing_config.tRFP = 0x2F9; //!< Configure refresh Cycle + +#if SDRAM_TARGET_BANK == 1 + dmc_init_config.bankWidth = DMC_BANK_WIDTH_1; //!< Configure bank address width +#else + dmc_init_config.bankWidth = DMC_BANK_WIDTH_2; //!< Configure bank address width +#endif + dmc_init_config.clkPhase = DMC_CLK_PHASE_REVERSE; //!< Configure clock phase + dmc_init_config.rowWidth = SDRAM_ROW_BITS; //!< Configure row address width + dmc_init_config.colWidth = SDRAM_COLUMN_BITS; //!< Configure column address width + dmc_init_config.timing = dmc_timing_config; + + DMC_Config(&dmc_init_config); + DMC_ConfigOpenBank(DMC_BANK_NUMBER_2); + DMC_EnableAccelerateModule(); + + DMC_Enable(); + + LOG_D("sdram init success, mapped at 0x%X, size is %d bytes, data width is %d", SDRAM_BANK_ADDR, SDRAM_SIZE, SDRAM_DATA_WIDTH); + +#ifdef RT_USING_MEMHEAP_AS_HEAP + /* If RT_USING_MEMHEAP_AS_HEAP is enabled, SDRAM is initialized to the heap */ + rt_memheap_init(&system_heap, "sdram", (void *)SDRAM_BANK_ADDR, SDRAM_SIZE); +#endif + + return result; +} +INIT_BOARD_EXPORT(SDRAM_Init); + +#ifdef DRV_DEBUG +#ifdef FINSH_USING_MSH +int sdram_test(void) +{ + int i = 0; + uint32_t start_time = 0, time_cast = 0; +#if SDRAM_DATA_WIDTH == 8 + char data_width = 1; + uint8_t data = 0; +#elif SDRAM_DATA_WIDTH == 16 + char data_width = 2; + uint16_t data = 0; +#else + char data_width = 4; + uint32_t data = 0; +#endif + + /* write data */ + LOG_D("Writing the %ld bytes data, waiting....", SDRAM_SIZE); + start_time = rt_tick_get(); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { +#if SDRAM_DATA_WIDTH == 8 + *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint8_t)(i % 100); +#elif SDRAM_DATA_WIDTH == 16 + *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint16_t)(i % 1000); +#else + *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint32_t)(i % 1000); +#endif + } + time_cast = rt_tick_get() - start_time; + LOG_D("Write data success, total time: %d.%03dS.", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + + /* read data */ + LOG_D("start Reading and verifying data, waiting...."); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { +#if SDRAM_DATA_WIDTH == 8 + data = *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 100) + { + LOG_E("SDRAM test failed!"); + break; + } +#elif SDRAM_DATA_WIDTH == 16 + data = *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 1000) + { + LOG_E("SDRAM test failed!"); + break; + } +#else + data = *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 1000) + { + LOG_E("SDRAM test failed!"); + break; + } +#endif + } + + if (i >= SDRAM_SIZE / data_width) + { + LOG_D("SDRAM test success!"); + } + + return RT_EOK; +} +MSH_CMD_EXPORT(sdram_test, sdram test) +#endif /* FINSH_USING_MSH */ +#endif /* DRV_DEBUG */ +#endif /* BSP_USING_SDRAM */ diff --git a/bsp/apm32/libraries/Drivers/drv_sdram/APM32F4/drv_sdram.h b/bsp/apm32/libraries/Drivers/drv_sdram/APM32F4/drv_sdram.h new file mode 100644 index 0000000000..08a767e2bd --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_sdram/APM32F4/drv_sdram.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-18 luobeihai first version + */ + +#ifndef __DRV_SDRAM_H__ +#define __DRV_SDRAM_H__ + +/* parameters for sdram peripheral */ +/* Bank1 or Bank2 */ +#define SDRAM_TARGET_BANK 1 +/* apm32f407 Bank Addr: 0x60000000 */ +#define SDRAM_BANK_ADDR ((uint32_t)0x60000000) +/* data width: 8, 16, 32 */ +#define SDRAM_DATA_WIDTH 16 +/* column bit numbers */ +#define SDRAM_COLUMN_BITS DMC_COL_WIDTH_8 +/* row bit numbers */ +#define SDRAM_ROW_BITS DMC_ROW_WIDTH_11 + +#define SDRAM_SIZE ((uint32_t)0x200000) + +/* memory mode register */ +#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) +#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) +#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004) +#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) +#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) +#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) +#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) +#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) +#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) + +#endif diff --git a/bsp/apm32/libraries/Drivers/drv_spi.c b/bsp/apm32/libraries/Drivers/drv_spi.c index 33680ef4bb..33aecdefb4 100644 --- a/bsp/apm32/libraries/Drivers/drv_spi.c +++ b/bsp/apm32/libraries/Drivers/drv_spi.c @@ -6,8 +6,9 @@ * Change Logs: * Date Author Notes * 2022-03-04 stevetong459 first version - * 2022-07-15 Aligagago add apm32F4 serie MCU support - * 2022-12-26 luobeihai add apm32F0 serie MCU support + * 2022-07-15 Aligagago add APM32F4 series MCU support + * 2022-12-26 luobeihai add APM32F0 series MCU support + * 2023-03-28 luobeihai add APM32E1/S1 series MCU support */ #include "drv_spi.h" @@ -57,7 +58,7 @@ rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_InitStructure.pupd = GPIO_PUPD_NO; GPIO_Config(cs_gpiox, &GPIO_InitStructure); GPIO_WriteBitValue(cs_gpiox, cs_gpio_pin, Bit_SET); -#elif defined(SOC_SERIES_APM32F1) +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) GPIO_ConfigStructInit(&GPIO_InitStructure); GPIO_InitStructure.pin = cs_gpio_pin; GPIO_InitStructure.mode = GPIO_MODE_OUT_PP; @@ -124,7 +125,8 @@ static rt_err_t apm32_spi_configure(struct rt_spi_device *device, struct rt_spi_ #if defined(SOC_SERIES_APM32F0) hw_spi_config.slaveSelect = (cfg->mode & RT_SPI_NO_CS) ? SPI_SSC_DISABLE : SPI_SSC_ENABLE; hw_spi_config.firstBit = (cfg->mode & RT_SPI_MSB) ? SPI_FIRST_BIT_MSB : SPI_FIRST_BIT_LSB; -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) hw_spi_config.nss = (cfg->mode & RT_SPI_NO_CS) ? SPI_NSS_HARD : SPI_NSS_SOFT; hw_spi_config.firstBit = (cfg->mode & RT_SPI_MSB) ? SPI_FIRSTBIT_MSB : SPI_FIRSTBIT_LSB; #endif @@ -144,7 +146,8 @@ static rt_err_t apm32_spi_configure(struct rt_spi_device *device, struct rt_spi_ #if defined(SOC_SERIES_APM32F0) hw_spi_apb_clock = RCM_ReadPCLKFreq(); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) if (spi == SPI1) { RCM_ReadPCLKFreq(NULL, &hw_spi_apb_clock); @@ -222,7 +225,8 @@ static rt_ssize_t apm32_spi_xfer(struct rt_spi_device *device, struct rt_spi_mes { #if defined(SOC_SERIES_APM32F0) GPIO_WriteBitValue(cs->GPIOx, cs->GPIO_Pin, (GPIO_BSRET_T)RESET); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) GPIO_WriteBitValue(cs->GPIOx, cs->GPIO_Pin, RESET); #endif LOG_D("spi take cs\n"); @@ -253,7 +257,7 @@ static rt_ssize_t apm32_spi_xfer(struct rt_spi_device *device, struct rt_spi_mes /* Wait until a data is received */ while (SPI_ReadStatusFlag(spi, SPI_FLAG_RXBNE) == RESET); data = SPI_RxData8(spi); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32F4) /* Wait until the transmit buffer is empty */ while (SPI_I2S_ReadStatusFlag(spi, SPI_FLAG_TXBE) == RESET); SPI_I2S_TxData(spi, data); @@ -261,6 +265,14 @@ static rt_ssize_t apm32_spi_xfer(struct rt_spi_device *device, struct rt_spi_mes /* Wait until a data is received */ while (SPI_I2S_ReadStatusFlag(spi, SPI_FLAG_RXBNE) == RESET); data = SPI_I2S_RxData(spi); +#elif defined(SOC_SERIES_APM32S1) + /* Wait until the transmit buffer is empty */ + while (SPI_ReadStatusFlag(spi, SPI_FLAG_TXBE) == RESET); + SPI_TxData(spi, data); + + /* Wait until a data is received */ + while (SPI_ReadStatusFlag(spi, SPI_FLAG_RXBNE) == RESET); + data = SPI_RxData(spi); #endif if (recv_ptr != RT_NULL) @@ -293,7 +305,7 @@ static rt_ssize_t apm32_spi_xfer(struct rt_spi_device *device, struct rt_spi_mes /* Wait until a data is received */ while (SPI_ReadStatusFlag(spi, SPI_FLAG_RXBNE) == RESET); data = SPI_I2S_RxData16(spi); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32F4) /* Wait until the transmit buffer is empty */ while (SPI_I2S_ReadStatusFlag(spi, SPI_FLAG_TXBE) == RESET); /* Send the byte */ @@ -303,6 +315,16 @@ static rt_ssize_t apm32_spi_xfer(struct rt_spi_device *device, struct rt_spi_mes while (SPI_I2S_ReadStatusFlag(spi, SPI_FLAG_RXBNE) == RESET); /* Get the received data */ data = SPI_I2S_RxData(spi); +#elif defined(SOC_SERIES_APM32S1) + /* Wait until the transmit buffer is empty */ + while (SPI_ReadStatusFlag(spi, SPI_FLAG_TXBE) == RESET); + /* Send the byte */ + SPI_TxData(spi, data); + + /* Wait until a data is received */ + while (SPI_ReadStatusFlag(spi, SPI_FLAG_RXBNE) == RESET); + /* Get the received data */ + data = SPI_RxData(spi); #endif if (recv_ptr != RT_NULL) @@ -317,7 +339,8 @@ static rt_ssize_t apm32_spi_xfer(struct rt_spi_device *device, struct rt_spi_mes { #if defined(SOC_SERIES_APM32F0) GPIO_WriteBitValue(cs->GPIOx, cs->GPIO_Pin, (GPIO_BSRET_T)SET); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) GPIO_WriteBitValue(cs->GPIOx, cs->GPIO_Pin, SET); #endif LOG_D("spi release cs\n"); diff --git a/bsp/apm32/libraries/Drivers/drv_usart.c b/bsp/apm32/libraries/Drivers/drv_usart.c index fe236ca6ce..db80005b13 100644 --- a/bsp/apm32/libraries/Drivers/drv_usart.c +++ b/bsp/apm32/libraries/Drivers/drv_usart.c @@ -6,7 +6,8 @@ * Change Logs: * Date Author Notes * 2020-08-20 Abbcc first version - * 2022-12-26 luobeihai add apm32F0 serie MCU support + * 2022-12-26 luobeihai add APM2F0 series MCU support + * 2023-03-27 luobeihai add APM32E1/S1 series MCU support */ #include "board.h" @@ -66,7 +67,8 @@ static struct apm32_usart usart_config[] = USART2_IRQn, }, #endif -#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32F4) +#if defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) #ifdef BSP_USING_UART3 { "uart3", @@ -95,7 +97,7 @@ static struct apm32_usart usart_config[] = USART6_IRQn, }, #endif -#endif +#endif /* SOC_SERIES_APM32F0 */ }; static rt_err_t apm32_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) @@ -126,7 +128,8 @@ static rt_err_t apm32_uart_configure(struct rt_serial_device *serial, struct ser USART_ConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE; break; } -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) switch (cfg->flowcontrol) { case RT_SERIAL_FLOWCONTROL_NONE: @@ -139,7 +142,7 @@ static rt_err_t apm32_uart_configure(struct rt_serial_device *serial, struct ser USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE; break; } -#endif +#endif /* SOC_SERIES_APM32F0 */ switch (cfg->data_bits) { @@ -224,7 +227,8 @@ static rt_err_t apm32_uart_control(struct rt_serial_device *serial, int cmd, voi USART_EnableInterrupt(usart->usartx, USART_INT_RXBNEIE); break; } -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) switch (cmd) { /* disable interrupt */ @@ -247,7 +251,7 @@ static rt_err_t apm32_uart_control(struct rt_serial_device *serial, int cmd, voi USART_EnableInterrupt(usart->usartx, USART_INT_RXBNE); break; } -#endif +#endif /* SOC_SERIES_APM32F0 */ return RT_EOK; } @@ -302,7 +306,8 @@ static void usart_isr(struct rt_serial_device *serial) #if defined(SOC_SERIES_APM32F0) if ((USART_ReadStatusFlag(usart->usartx, USART_FLAG_RXBNE) != RESET) && (USART_ReadIntFlag(usart->usartx, USART_INT_FLAG_RXBNE) != RESET)) -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) if ((USART_ReadStatusFlag(usart->usartx, USART_FLAG_RXBNE) != RESET) && (USART_ReadIntFlag(usart->usartx, USART_INT_RXBNE) != RESET)) #endif @@ -336,7 +341,8 @@ static void usart_isr(struct rt_serial_device *serial) { USART_ClearStatusFlag(usart->usartx, USART_FLAG_LBDF); } -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) if (USART_ReadStatusFlag(usart->usartx, USART_FLAG_OVRE) != RESET) { USART_ClearStatusFlag(usart->usartx, USART_FLAG_OVRE); @@ -361,7 +367,7 @@ static void usart_isr(struct rt_serial_device *serial) { USART_ClearStatusFlag(usart->usartx, USART_FLAG_LBD); } -#endif +#endif /* SOC_SERIES_APM32F0 */ if (USART_ReadStatusFlag(usart->usartx, USART_FLAG_TXBE) != RESET) { USART_ClearStatusFlag(usart->usartx, USART_FLAG_TXBE); @@ -380,7 +386,6 @@ void USART1_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } - #endif /* BSP_USING_UART1 */ #if defined(BSP_USING_UART2) diff --git a/bsp/apm32/libraries/Drivers/drv_wdt.c b/bsp/apm32/libraries/Drivers/drv_wdt.c index 9febbca8b4..dcd55d7713 100644 --- a/bsp/apm32/libraries/Drivers/drv_wdt.c +++ b/bsp/apm32/libraries/Drivers/drv_wdt.c @@ -6,7 +6,8 @@ * Change Logs: * Date Author Notes * 2022-03-04 stevetong459 first version - * 2022-12-26 luobeihai add apm32F0 serie MCU support + * 2022-12-26 luobeihai add APM32F0 series MCU support + * 2023-03-28 luobeihai add APM32E1/S1 series MCU support */ #include @@ -57,7 +58,8 @@ static rt_err_t apm32_iwdt_init(rt_watchdog_t *wdt) #if defined(SOC_SERIES_APM32F0) while (IWDT_ReadStatusFlag(IWDT_FLAG_DIVU)) -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) while (IWDT_ReadStatusFlag(IWDT_FLAG_PSCU)) #endif { @@ -72,7 +74,8 @@ static rt_err_t apm32_iwdt_init(rt_watchdog_t *wdt) #if defined(SOC_SERIES_APM32F0) IWDT_ConfigDivider(IWDT_DIV_256); -#else +#elif defined(SOC_SERIES_APM32F1) || defined(SOC_SERIES_APM32E1) || defined(SOC_SERIES_APM32S1) \ + || defined(SOC_SERIES_APM32F4) IWDT_ConfigDivider(IWDT_DIVIDER_256); #endif diff --git a/bsp/apm32/libraries/Kconfig b/bsp/apm32/libraries/Kconfig index 036a4c2aef..6ba6514cd8 100644 --- a/bsp/apm32/libraries/Kconfig +++ b/bsp/apm32/libraries/Kconfig @@ -15,3 +15,13 @@ config SOC_SERIES_APM32F4 bool select ARCH_ARM_CORTEX_M4 select SOC_FAMILY_APM32 + +config SOC_SERIES_APM32E1 + bool + select ARCH_ARM_CORTEX_M3 + select SOC_FAMILY_APM32 + +config SOC_SERIES_APM32S1 + bool + select ARCH_ARM_CORTEX_M3 + select SOC_FAMILY_APM32

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.c0b|X>nepUISlr?>^i*YXsxzamp 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 literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_01.png b/bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_01.png new file mode 100644 index 0000000000000000000000000000000000000000..5640216ae5b677bc49e77e3995cdf3a00688723b GIT binary patch literal 47629 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 literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_02.png b/bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_02.png new file mode 100644 index 0000000000000000000000000000000000000000..93984c1a901979cc09743b4acd016aafb96c1d6e GIT binary patch literal 9973 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 literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_03.png b/bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_03.png new file mode 100644 index 0000000000000000000000000000000000000000..6280b5d664164903c9e7c8b4203306b03918d7bf GIT binary patch literal 3590 zcmZWscTm$?)BaHu0g)ntf(VKf=_-mq0;r*PrT5-JdLRL5mnucNbfhLo3juDFY!1{vRi9k=1Cgx1g2&U7G=sAbe{h#u`_(9MEP<1G$ zjcWII{`@XokL>p?BRU7)Cq*#zyPpP$QEs@enlPP9tzCW7vAerFf9|U|$~7pWJ_;bp zXygXT^Dmsv?-#%rDcet}<(TEs5I)DulCsRQvN8cgS(zah`x~(l2r-S*!iKxzLj2y@ zMC)9lZF(6E6hHTb+f-y4vL~NkI-yp>A0v{k$}F$V%wy<_EQ1~F%&PGw_uGt>pB`nP z#fMoT!;g#^D8XMcOFo;BwBJ`B-4i=;n-egk;2LWfh1e)w?rXY8_$IENbYEFl7d!&U zG=3Uy^n%z-zf5XqX}Kmhw&oo8#{_T2sJ-&V6peV3b<43JqGU}nxjzb)OAMD_e8L}i zQtp`9$A^fz-DcwUF5pK-AK90+T%vvgvaF1}(o->LDX1m&b6g`P@pJeW*P9r0D;wqw zx7T1p+$7#v^5(rqRbHyb*~J&$G$U?GjSD~M99dHmXm^OGef;UZO9`U-sCkG^(ounC zq9`r5C-6sp=EhDj=S)H*7ByjByz?YKT+A%9URy(_Ya+bZCVIE{et@YlQjUICk9BSu z9g!Y?&+;606E*DgRBT{VDC~A7|(`cq|_no zeVTPSphEtU8-C>+d0(xBX@H;>Z9@+IMcM_cn=K-TSa%P)2AX;8`@zYkQ)g?sOJ+-e z4d2Kof=}vXq1jcN1p0Kuc8_=EQ)>ZSm9T{)STov-wh_8}*74DBumX&UuXMO#tJ2qA zgRD_a?utpxfOz9pZ}Cj!MDbcC0KdUBaXvxJxvsRfN-V5w>@*d8=Jg1 zb1bVrZ8Z1$NF^73qeVL#cLy{VUi;Sl^KL=CN}OAj?UnK8jIM|zB?>|i=ZIT_?{kvn z4#shku5l_sKvq&KBG~e9m z>;`b=6u@oV=48plhDuJO7!}^#4U)k5w7|Hs2~japh`wr>{5)~#!=`I~O*BlE7T>My zz{We@wS7Smd|2h-b*J?R3iz$r8~D>+oCyG@>*iz@d{sH{NVNXgDnnN1W4Hw97_jn+ z%4u^pC0x>~<@lzLdloWzTjc8WW{)p!RxWzjFtU0vzt3{_U}*f4tugw0b1jzz!GCGL zDG=+_Xe1Qt&IBybTAORTp81{d z2P^>#(k3M_9pmaJBs&46^!8NWL#!hoVm$m4DR>n0t*(qSc_J3qCVJ zv~%f+hmumA2Difr(k-rG2;VzNU4JlcGK4mYgZZG=?Lq6sJeE_eADQ{lBbGF1xfi6C z!#K0}XjP>^^wBhWkFymQ#q=bCt)(X`sw^Rq*OOTxvrqe`<2^;oqUhV<{{S?(>3VlA zV9m$RAvfTDcMl%SWEcNS{6GAE11U7Eu3>CZryHfj9dg%qyUA5+7LhV~w;2l+%e%@5qMJfBf#(6dL*3)}BmmXmYR3 zj^}%g6eIEKflJlbTvQINPe2jP$Qg+g^9U@KXYx=*UsO@>Fi&sFkXR3sT=&P?PJiD!WSmV@>n)6a|C_Z3ABf-W z$uN`oWAgK_5>o2OQ365jZpm#;LJ8BSp#o`I!jrMypZJDLhj3u)(YJs>&aYJIutW>{ zxh7ZKvcmHKNNYuULYHcut*%MJ+gzc+T_th2nn!e9MN^CraXF@(r?}$&a9ZB46_=B# zV3xYn?MSnrC;OM@T!M_iN|i1nR*@Lf*5RFPAb7Id*}6~$Ab>}IfBNP5L>0m7qJZTQ zE6ncnFicySTN%GoX!B5uAqy*$w7$;>CN4(ENi zs~Yj;Skw7(A4)D7L7X#5gA@ImnD>m7lNx?DZYj>+Jj!o){B#ZucGAD-GR ztgmmG2ctUt8+DY|f8_4pAH*A|))&)vaeh5RMUmV@THNyBu({nMFoZ!Ju0M%DOr?8x%*8M4+eLCuZ*(4!sfi8pzTx%~modM9CbP^vabOdlYxeAijXAuhk`w zBfPFCJ1tliY46~3?{@TFTvy1UlKFk6@rkK$*KS3d&!UTt@*uVhdf$DGax0$#XfHWk zzP$@uASre%hd#@x_Oo~~t(N#c@Sp<%hP-3{vIZC${kGxf^-gJ8>dXPQr+g(tUC?W=Z(6D3=SMipO-NQ^3ISLUnmgmO7#>UDZZ|HW`>Gm3Eq zH4#upslQ`u|Ewrt<8Q7HOvZUzx4>ef1}ut@3eV&xE_45X@DpCE?@;^7-U?%5<=zgc zm-!sS#=$xViSJOlE=ltbiBy992gvL4K_Gj!19@hpstambh6Mr@)>qA{dQtwUq z7!ABiR>W;k-RcF=DkP9=jjWo>WCM}O=V55>+T$9FF$JiSx#i-%X4Xp z#u|)T;FG4eF9RUY4dv$QAcTdy;WbFdf3ZceVoK(H>zooq;|n&&Ktfm#=WB9>^9^k89deB&-`s{Ydzr? z+FOcgy<+pyC56l_2etsH!+QSowlAj%8;uVIx;+Gm3|SDevo8^QqIHl{1Xd5L;>3Du z%~KBTMPNf#_m_i7@6*O(kU zjDC)RTR1u8k84s8XuWSM1@WbEn=duDOQW)n>*Fe#uD>(Sf4OY%pM>;}yQTXIy|rs= zj!xu_L@YcGyd9nBn-3?bR&Tvs%?kYmft$ z$KJ;~lQUvjo6e*zL^-MGWUmhMP<6AEI@Chp2b-NjCSqSjK?=&FMru>MZKDegFP1g( Vb%!*Mdq_PTpe(NeseEA(`hWN36S@EZ literal 0 HcmV?d00001 diff --git a/bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_04.png b/bsp/apm32/apm32e103ze-evalboard/figures/JFlash_Leader_04.png new file mode 100644 index 0000000000000000000000000000000000000000..b133313482c10209e4b442e6affb6607cfc7d2c1 GIT binary patch literal 12434 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 + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 1 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdio.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscalls.c + + + + CPU + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\ipc\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\iar\startup_apm32f10x_hd.s + + + $PROJ_DIR$\..\libraries\Drivers\drv_common.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_usart.c + + + + Filesystem + + $PROJ_DIR$\..\..\..\components\dfs\src\dfs_posix.c + + + $PROJ_DIR$\..\..\..\components\dfs\src\dfs_fs.c + + + $PROJ_DIR$\..\..\..\components\dfs\src\dfs.c + + + $PROJ_DIR$\..\..\..\components\dfs\src\dfs_file.c + + + + Finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Libraries + + $PROJ_DIR$\..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\system_apm32f10x.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_rcm.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_misc.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_usart.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_eint.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_gpio.c + + + + POSIX + + diff --git a/bsp/apm32/apm32e103ze-evalboard/project.eww b/bsp/apm32/apm32e103ze-evalboard/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/apm32/apm32e103ze-evalboard/project.uvoptx b/bsp/apm32/apm32e103ze-evalboard/project.uvoptx new file mode 100644 index 0000000000..fae23b8704 --- /dev/null +++ b/bsp/apm32/apm32e103ze-evalboard/project.uvoptx @@ -0,0 +1,865 @@ + + + + 1.0 + +